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)

MethodPathDescription
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.

EventDescription
compliance.requirement.completedFired when a student requirement is marked complete (either manually or via auto-progression).
compliance.requirement.overdueFired the day a requirement passes its deadline without being completed.
attendance.loggedFired every time an attendance entry is recorded for a student.
esa.expense.createdFired when a new ESA expense is logged on a student's account.
esa.balance.lowFired when a student's ESA balance drops below $500.
student.audit_readiness.changedFired 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.

Send Feedback

0/200
0/5000