Documentation
Get started with SpedHub
Everything you need to integrate the SpedHub API into your application — from authentication to full CRUD operations on student IEP data.
Introduction
SpedHub is a REST API purpose-built for special education platforms. It provides structured, reliable storage and retrieval of IEP-related student records — including disabilities, services, goals, and accommodations — through a single, predictable integration.
All API responses are JSON. Requests and responses follow consistent patterns across every resource. The base URL for all endpoints is /api.
/apiAPI key auth
Authenticate every request with a bearer token in the Authorization header.
Full CRUD
Create, read, update, and delete students, disabilities, goals, services, and accommodations.
Filtering & search
Filter lists by grade, gender, or student ID. Search students by first name.
Relational data
Goals, services, and accommodations are linked to students via foreign keys.
Authentication
All requests to the SpedHub API must include a valid API key in the Authorization header using the Bearer scheme.
API keys are scoped and can be revoked at any time from your dashboard. Never expose your API key in client-side code or public repositories.
Authorization: Bearer sk_live_••••••••••••••••
401 response when key is missing or invalid
{
"error": "Unauthorized",
"message": "Missing or invalid API key"
}Quickstart
Generate an API key
Create an account and generate your first API key from the dashboard.
Make your first request
Use curl or any HTTP client to fetch the list of students.
Create a student record
POST a new student with firstName, lastName, and gradeLevel.
Attach IEP data
Link goals, services, and accommodations to the student via studentId.
curl -X GET /api/students \ -H "Authorization: Bearer sk_live_••••••••" \ -H "Accept: application/json"
{
"data": [
{
"id": 1,
"firstName": "Jordan",
"lastName": "Rivera",
"gradeLevel": "4",
"gender": "non-binary",
"createdAt": "2026-07-30T18:10:43.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1
}
}Students
The student object is the central resource in SpedHub. All other resources — goals, services, accommodations — are linked to a student via studentId.
/api/students/api/studentsList all students/api/studentsCreate a student/api/students/:idRetrieve a student/api/students/:idUpdate a student/api/students/:idDelete a studentDisabilities
Disability records represent IDEA disability classifications. They are independent resources that can be referenced when building student profiles.
/api/disabilities/api/disabilitiesList all disabilities/api/disabilitiesCreate a disability/api/disabilities/:idRetrieve a disability/api/disabilities/:idUpdate a disability/api/disabilities/:idDelete a disabilityAccommodations
Accommodations are instructional or testing modifications linked to a student. Filter by studentId to retrieve all accommodations for a specific student.
/api/accommodations/api/accommodationsList all accommodations/api/accommodationsCreate an accommodation/api/accommodations/:idRetrieve an accommodation/api/accommodations/:idUpdate an accommodation/api/accommodations/:idDelete an accommodationGoals
IEP goal objects capture the four-part goal structure: timeFrame, condition, behavior, and measurement. Goals are linked to a student via studentId.
/api/goals/api/goalsList all goals/api/goalsCreate a goal/api/goals/:idRetrieve a goal/api/goals/:idUpdate a goal/api/goals/:idDelete a goalServices
Service records describe special education services provided to a student, including type, description, and ISO 8601 start and end times.
/api/services/api/servicesList all services/api/servicesCreate a service/api/services/:idRetrieve a service/api/services/:idUpdate a service/api/services/:idDelete a serviceErrors & status codes
SpedHub uses standard HTTP status codes to indicate success or failure. All error responses include an error field with a machine-readable code and a message field with a human-readable description.
Rate limits
The SpedHub API enforces rate limits to ensure fair usage across all integrations. Limits are applied per API key on a rolling 60-second window.
When a rate limit is exceeded, the API returns a 429 Too Many Requests response. The Retry-After header indicates how many seconds to wait before retrying.
Free
60 requests / minute
Pro
600 requests / minute
Enterprise
Custom
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 42 X-RateLimit-Reset: 1753900800