School Proofing API
Compliance infrastructure for education partners. Built for scholarship-granting organizations, education platforms, and school networks.
Authentication
Every API request requires an X-Api-Key header. Generate keys from Settings → API Keys in your account. Keys are scoped to your tenant — they can only read and act on your own data.
curl https://schoolproofing.com/api/v1/students \
-H "X-Api-Key: sp_live_yourkeyhere"
Keys are shown exactly once at generation time. Store them in your secret manager — we only keep a hash.
Endpoints (v1)
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/students |
List all students for the authenticated tenant. Paginate with ?page and ?pageSize. |
| GET | /api/v1/students/{publicId} |
Student detail with compliance summary. |
| GET | /api/v1/compliance/status/{studentPublicId} |
Compliance status — audit-readiness score, requirements summary, overdue items. |
| GET | /api/v1/compliance/requirements/{studentPublicId} |
All requirements for the student with current status and progress. |
| GET | /api/v1/compliance/deadlines/{studentPublicId} |
Upcoming compliance deadlines (next 90 days). |
| GET | /api/v1/attendance/summary/{studentPublicId} |
Attendance summary — days/hours logged vs state requirement. |
| GET | /api/v1/esa/balance/{studentPublicId} |
ESA account balance and spending summary. |
| GET | /api/v1/esa/expenses/{studentPublicId} |
ESA expense list with receipt status. Paginate with ?page and ?pageSize. |
| GET | /api/v1/documents/{studentPublicId} |
Document list for a student. Paginate with ?page and ?pageSize. |
| GET | /api/v1/reports/audit-readiness/{studentPublicId} |
Audit readiness score with per-component breakdown. |
| POST | /api/v1/reports/generate-audit-response/{studentPublicId} |
Triggers audit-response PDF generation. Returns a download URL. |
All endpoints return JSON with a stable envelope: { "success": true, "data": {...}, "meta": {...} }. Errors return { "success": false, "error": { "code": "...", "message": "..." } } with codes like NOT_FOUND, UNAUTHORIZED, FORBIDDEN, RATE_LIMITED.
Webhooks
Subscribe to events in Settings → Webhooks. We POST a signed JSON body to your endpoint on every matching event. Verify the X-SchoolProofing-Signature header (HMAC-SHA256 of the request body using your webhook secret) before processing.
| Event | Description |
|---|---|
compliance.requirement.completed | Fired when a student requirement is marked complete (either manually or via auto-progression). |
compliance.requirement.overdue | Fired the day a requirement passes its deadline without being completed. |
attendance.logged | Fired every time an attendance entry is recorded for a student. |
esa.expense.created | Fired when a new ESA expense is logged on a student's account. |
esa.balance.low | Fired when a student's ESA balance drops below $500. |
student.audit_readiness.changed | Fired when a student's audit readiness score changes by more than 10 points. |
Payload format
POST https://your-app.example.com/webhooks
X-SchoolProofing-Event: compliance.requirement.completed
X-SchoolProofing-Delivery-Id: 8b2e…
X-SchoolProofing-Signature: t=1715600000,v1=abc123…
{
"event": "compliance.requirement.completed",
"timestamp": "2026-05-12T18:30:00Z",
"data": { "studentPublicId": "…", "requirementPublicId": "…", "completedAt": "…" }
}
We retry non-2xx responses up to 3 times with exponential backoff (1m, 5m, 30m). After 5 consecutive failures the webhook is auto-disabled and the tenant is notified.
Rate limiting
The default limit is 1,000 requests per hour per API key. Over-limit requests receive 429 Too Many Requests with a Retry-After header (seconds until the bucket recovers). Need higher limits? Talk to us — partner plans support custom limits.
Code examples
curl
curl https://schoolproofing.com/api/v1/compliance/status/STUDENT_PUBLIC_ID \
-H "X-Api-Key: sp_live_yourkeyhere"
JavaScript (fetch)
const res = await fetch(`https://schoolproofing.com/api/v1/students`, {
headers: { 'X-Api-Key': process.env.SP_API_KEY }
});
const { data, meta } = await res.json();
Python (requests)
import requests
r = requests.get(
"https://schoolproofing.com/api/v1/students",
headers={"X-Api-Key": os.environ["SP_API_KEY"]},
)
data = r.json()["data"]
C# (HttpClient)
using var http = new HttpClient { BaseAddress = new Uri("https://schoolproofing.com") };
http.DefaultRequestHeaders.Add("X-Api-Key", apiKey);
var res = await http.GetFromJsonAsync<ApiResponse<Student[]>>("/api/v1/students");
Build with us
SGOs, education platforms, and school networks — the API is yours.