API Documentation
Programmatic access to K-12 school district data
API Access
Full access to REST API and MCP server
- 10,000 API requests/day
- All REST endpoints + MCP server
- Cancel anytime
This data is aggregated from state and federal public datasets. While we believe it is accurate, we always recommend confirming it on the corresponding state or federal site. See Data Notes for more.
Overview
The EduSignal API provides RESTful access to normalized K-12 school district data for all 50 states and Washington D.C. The API returns data only — no AI analysis or scoring is included. Consumers bring their own intelligence layer.
https://edusignal.ai/api/v1Authentication
Bearer Token
All API requests require an API key passed in the Authorization header.
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://edusignal.ai/api/v1/districts/3704320Getting an API Key
- Subscribe to API access ($49/month) via the Pricing section below.
- After payment, your API key will be displayed once. Copy and store it securely.
- The key prefix (e.g.,
edus_a1b2...) is visible in your account settings for reference.
Security Note:Your full API key is only shown once at creation. If you lose it, you'll need to regenerate a new key from your account settings.
Rate Limits
Daily and Burst Limits
Rate limits are applied per API key to ensure fair usage.
Rate Limit Headers
Every response includes rate limit information in the headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests per day (10000) |
| X-RateLimit-Remaining | Requests remaining in current period |
| X-RateLimit-Reset | UTC timestamp when limit resets (midnight UTC) |
429 Response
When rate limits are exceeded, the API returns a 429 status with a Retry-After header:
{
"error": {
"code": "rate_limit_exceeded",
"message": "Daily rate limit of 10,000 requests exceeded. Resets at midnight UTC.",
"retry_after": 3600
}
}Endpoints
/api/v1/districts/{ncesId}Returns a full district profile including enrollment, demographics, academics, finances, staffing, and AI-generated summary.
Path Parameters
| Name | Type | Description |
|---|---|---|
| ncesId | string | 7-digit NCES district ID (e.g., 3704320) |
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://edusignal.ai/api/v1/districts/3704320Example Response
{
"nces_id": "3704320",
"name": "Wake County Public School System",
"state_code": "NC",
"state_name": "North Carolina",
"county": "Wake",
"locale_type": "Suburb",
"region": "Southeast",
"website_url": "https://www.wcpss.net",
"enrollment": {
"total": 160000,
"prior_year": 158000,
"trend_pct": 1.27,
"data_year": "2022-23"
},
"schools": {
"total": 196,
"elementary": 118,
"middle": 37,
"high": 31,
"other": 10
},
"staffing": {
"teacher_count": 10500,
"student_teacher_ratio": 15.2,
"total_staff": 19500,
"counselor_count": 350,
"student_counselor_ratio": 457.1,
"psychologist_count": 45,
"student_psychologist_ratio": 3555.6,
"paraprofessional_count": 2800,
"librarian_count": 196
},
"finance": {
"per_pupil_spending": 10250,
"total_budget": 1640000000,
"pct_federal_revenue": 8.5,
"pct_state_revenue": 52.3,
"pct_local_revenue": 39.2,
"data_year": "2021-22"
},
"demographics": {
"pct_frpl": 32.5,
"pct_ell": 12.3,
"pct_swd": 13.1,
"pct_white": 42.1,
"pct_black": 22.3,
"pct_hispanic": 20.5,
"pct_asian": 10.2,
"pct_two_or_more": 4.9,
"pct_other": 0,
"data_year": "2022-23"
},
"academics": {
"math_proficiency": 48.2,
"reading_proficiency": 52.1,
"graduation_rate": 91.2,
"dropout_rate": 2.1,
"chronic_absenteeism": 14.3,
"data_year": "2022-23"
},
"ai_summary": "Wake County Public School System is the largest district in North Carolina and one of the 15 largest in the United States, serving approximately 160,000 students across 196 schools...",
"summary_generated_at": "2026-05-01T12:00:00.000Z",
"federal_data_year": "2022-23",
"state_data_year": "2022-23"
}/api/v1/districts/searchSearch and filter districts with cursor-based pagination.
Query Parameters
| Name | Type | Description |
|---|---|---|
| state | string | 2-letter state code (e.g., NC, CA) |
| enrollment_min | integer | Minimum enrollment |
| enrollment_max | integer | Maximum enrollment |
| locale | string | Comma-separated locale types (City, Suburb, Town, Rural) |
| frpl_min | number | Minimum FRPL percentage (0-100) |
| frpl_max | number | Maximum FRPL percentage (0-100) |
| math_proficiency_min | number | Minimum math proficiency (0-100) |
| math_proficiency_max | number | Maximum math proficiency (0-100) |
| reading_proficiency_min | number | Minimum reading proficiency (0-100) |
| reading_proficiency_max | number | Maximum reading proficiency (0-100) |
| pps_min | number | Minimum per-pupil spending |
| pps_max | number | Maximum per-pupil spending |
| cursor | string | Pagination cursor from previous response |
| limit | integer | Results per page (default 50, max 100) |
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://edusignal.ai/api/v1/districts/search?state=NC&enrollment_min=10000&limit=10"Example Response
{
"data": [
{
"nces_id": "3704320",
"name": "Wake County Public School System",
"state_code": "NC",
"state_name": "North Carolina",
"county": "Wake",
"locale_type": "Suburb",
"region": "Southeast",
"website_url": "https://www.wcpss.net",
"enrollment": {
"total": 160000,
"prior_year": 158000,
"trend_pct": 1.27,
"data_year": "2022-23"
},
"schools": {
"total": 196,
"elementary": 118,
"middle": 37,
"high": 31,
"other": 10
},
"staffing": {
"teacher_count": 10500,
"student_teacher_ratio": 15.2,
"total_staff": 19500,
"counselor_count": 350,
"student_counselor_ratio": 457.1,
"psychologist_count": 45,
"student_psychologist_ratio": 3555.6,
"paraprofessional_count": 2800,
"librarian_count": 196
},
"finance": {
"per_pupil_spending": 10250,
"total_budget": 1640000000,
"pct_federal_revenue": 8.5,
"pct_state_revenue": 52.3,
"pct_local_revenue": 39.2,
"data_year": "2021-22"
},
"demographics": {
"pct_frpl": 32.5,
"pct_ell": 12.3,
"pct_swd": 13.1,
"pct_white": 42.1,
"pct_black": 22.3,
"pct_hispanic": 20.5,
"pct_asian": 10.2,
"pct_two_or_more": 4.9,
"pct_other": 0,
"data_year": "2022-23"
},
"academics": {
"math_proficiency": 48.2,
"reading_proficiency": 52.1,
"graduation_rate": 91.2,
"dropout_rate": 2.1,
"chronic_absenteeism": 14.3,
"data_year": "2022-23"
},
"ai_summary": "Wake County Public School System is the largest district in North Carolina and one of the 15 largest in the United States, serving approximately 160,000 students across 196 schools...",
"summary_generated_at": "2026-05-01T12:00:00.000Z",
"federal_data_year": "2022-23",
"state_data_year": "2022-23"
}
],
"next_cursor": "MTA=",
"total_count": 25
}/api/v1/districts/{ncesId}/schoolsReturns aggregate school counts for a district by level. Individual school records are not currently available.
Path Parameters
| Name | Type | Description |
|---|---|---|
| ncesId | string | 7-digit NCES district ID |
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://edusignal.ai/api/v1/districts/3704320/schoolsExample Response
{
"district_nces_id": "3704320",
"district_name": "Wake County Public School System",
"schools": {
"total": 196,
"elementary": 118,
"middle": 37,
"high": 31,
"other": 10
},
"note": "Individual school records are not available. This endpoint returns aggregate school counts by level."
}/api/v1/statesReturns a list of all states with aggregate education statistics.
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://edusignal.ai/api/v1/statesExample Response
{
"data": [
{
"code": "NC",
"name": "North Carolina",
"is_active": true,
"total_enrollment": 1550000,
"total_districts": 115,
"total_schools": 2650,
"total_teachers": 98500,
"total_budget": 15500000000,
"avg_per_pupil_spending": 10000,
"avg_math_proficiency": 45.2,
"avg_reading_proficiency": 48.5,
"avg_graduation_rate": 88.5,
"pct_frpl": 45.2,
"pct_ell": 10.5,
"pct_swd": 14.2,
"federal_data_year": "2022-23",
"state_data_year": "2022-23"
}
]
}/api/v1/states/{stateCode}Returns state-level aggregate data including enrollment, spending averages, and proficiency rates.
Path Parameters
| Name | Type | Description |
|---|---|---|
| stateCode | string | 2-letter state abbreviation (e.g., NC, TX) |
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://edusignal.ai/api/v1/states/NCExample Response
{
"code": "NC",
"name": "North Carolina",
"is_active": true,
"total_enrollment": 1550000,
"total_districts": 115,
"total_schools": 2650,
"total_teachers": 98500,
"total_budget": 15500000000,
"avg_per_pupil_spending": 10000,
"avg_math_proficiency": 45.2,
"avg_reading_proficiency": 48.5,
"avg_graduation_rate": 88.5,
"pct_frpl": 45.2,
"pct_ell": 10.5,
"pct_swd": 14.2,
"federal_data_year": "2022-23",
"state_data_year": "2022-23"
}/api/v1/states/{stateCode}/districtsReturns all districts in a state with cursor-based pagination, ordered by enrollment (largest first).
Path Parameters
| Name | Type | Description |
|---|---|---|
| stateCode | string | 2-letter state abbreviation |
Query Parameters
| Name | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor from previous response |
| limit | integer | Results per page (default 50, max 100) |
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://edusignal.ai/api/v1/states/NC/districts?limit=10"Example Response
{
"data": [
{
"nces_id": "3704320",
"name": "Wake County Public School System",
"state_code": "NC",
"state_name": "North Carolina",
"county": "Wake",
"locale_type": "Suburb",
"region": "Southeast",
"website_url": "https://www.wcpss.net",
"enrollment": {
"total": 160000,
"prior_year": 158000,
"trend_pct": 1.27,
"data_year": "2022-23"
},
"schools": {
"total": 196,
"elementary": 118,
"middle": 37,
"high": 31,
"other": 10
},
"staffing": {
"teacher_count": 10500,
"student_teacher_ratio": 15.2,
"total_staff": 19500,
"counselor_count": 350,
"student_counselor_ratio": 457.1,
"psychologist_count": 45,
"student_psychologist_ratio": 3555.6,
"paraprofessional_count": 2800,
"librarian_count": 196
},
"finance": {
"per_pupil_spending": 10250,
"total_budget": 1640000000,
"pct_federal_revenue": 8.5,
"pct_state_revenue": 52.3,
"pct_local_revenue": 39.2,
"data_year": "2021-22"
},
"demographics": {
"pct_frpl": 32.5,
"pct_ell": 12.3,
"pct_swd": 13.1,
"pct_white": 42.1,
"pct_black": 22.3,
"pct_hispanic": 20.5,
"pct_asian": 10.2,
"pct_two_or_more": 4.9,
"pct_other": 0,
"data_year": "2022-23"
},
"academics": {
"math_proficiency": 48.2,
"reading_proficiency": 52.1,
"graduation_rate": 91.2,
"dropout_rate": 2.1,
"chronic_absenteeism": 14.3,
"data_year": "2022-23"
},
"ai_summary": "Wake County Public School System is the largest district in North Carolina and one of the 15 largest in the United States, serving approximately 160,000 students across 196 schools...",
"summary_generated_at": "2026-05-01T12:00:00.000Z",
"federal_data_year": "2022-23",
"state_data_year": "2022-23"
}
],
"next_cursor": "MTA=",
"total_count": 115
}/api/v1/compareReturns side-by-side data for 2-10 districts. Districts are returned in the same order as the request.
Request Body
| Name | Type | Description |
|---|---|---|
| nces_ids | string[] | Array of 2-10 NCES district IDs to compare |
Example Request
curl -X POST -H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"nces_ids": ["3704320", "3704380", "3704410"]}' \
https://edusignal.ai/api/v1/compareExample Response
{
"data": [
{
"nces_id": "3704320",
"name": "Wake County Public School System",
"state_code": "NC",
"state_name": "North Carolina",
"county": "Wake",
"locale_type": "Suburb",
"region": "Southeast",
"website_url": "https://www.wcpss.net",
"enrollment": {
"total": 160000,
"prior_year": 158000,
"trend_pct": 1.27,
"data_year": "2022-23"
},
"schools": {
"total": 196,
"elementary": 118,
"middle": 37,
"high": 31,
"other": 10
},
"staffing": {
"teacher_count": 10500,
"student_teacher_ratio": 15.2,
"total_staff": 19500,
"counselor_count": 350,
"student_counselor_ratio": 457.1,
"psychologist_count": 45,
"student_psychologist_ratio": 3555.6,
"paraprofessional_count": 2800,
"librarian_count": 196
},
"finance": {
"per_pupil_spending": 10250,
"total_budget": 1640000000,
"pct_federal_revenue": 8.5,
"pct_state_revenue": 52.3,
"pct_local_revenue": 39.2,
"data_year": "2021-22"
},
"demographics": {
"pct_frpl": 32.5,
"pct_ell": 12.3,
"pct_swd": 13.1,
"pct_white": 42.1,
"pct_black": 22.3,
"pct_hispanic": 20.5,
"pct_asian": 10.2,
"pct_two_or_more": 4.9,
"pct_other": 0,
"data_year": "2022-23"
},
"academics": {
"math_proficiency": 48.2,
"reading_proficiency": 52.1,
"graduation_rate": 91.2,
"dropout_rate": 2.1,
"chronic_absenteeism": 14.3,
"data_year": "2022-23"
},
"ai_summary": "Wake County Public School System is the largest district in North Carolina and one of the 15 largest in the United States, serving approximately 160,000 students across 196 schools...",
"summary_generated_at": "2026-05-01T12:00:00.000Z",
"federal_data_year": "2022-23",
"state_data_year": "2022-23"
}
]
}Error Codes
All errors follow a consistent JSON format with an error object containing code, message, and optional retry_after.
| Code | HTTP Status | Description |
|---|---|---|
| unauthorized | 401 | Missing or invalid API key |
| not_found | 404 | Resource (district, state) not found |
| rate_limit_exceeded | 429 | Daily or burst rate limit exceeded |
| invalid_request | 400 | Invalid parameters or request body |
| server_error | 500 | Internal server error |
MCP Server
Model Context Protocol
Connect AI assistants like Claude directly to EduSignal data using the MCP protocol.
https://edusignal.ai/mcpJSON-RPC 2.0 over HTTPConnection
The MCP server uses the same API key as the REST API. Include your key in the Authorization header:
curl -X POST https://edusignal.ai/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"initialize","id":1}'Available Tools
lookup_districtLook up a K-12 school district profile by NCES ID or by name and state. Returns enrollment, demographics, academic performance, finances, and an AI-generated summary.
nces_id— 7-digit NCES district IDname— District name (partial match)state— State code or name
Either nces_id or both name + state required
search_districtsSearch for K-12 school districts matching specific criteria. Returns up to 20 results per call. Use filters to narrow results.
state— 2-letter state codeenrollment_min/enrollment_maxlocale— Array: City, Suburb, Town, Ruralfrpl_min/frpl_max— FRPL %math_proficiency_min— Min math %pps_min/pps_max— Per-pupil $limit— Results (max 20, default 10)
compare_districtsCompare 2-5 school districts side by side with full profiles.
nces_ids— Array of 2-5 NCES IDs (required)
get_state_summaryGet aggregate education statistics for a US state — enrollment, districts, spending, proficiency rates.
state_code— 2-letter abbreviation (required)
list_districts_in_stateList all school districts in a state with summary data. Paginated (up to 50 per page).
state_code— 2-letter abbreviation (required)cursor— Pagination cursorlimit— Results per page (max 50, default 20)
Example: Call a Tool
curl -X POST https://edusignal.ai/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "lookup_district",
"arguments": {
"nces_id": "3704320"
}
},
"id": 2
}'Rate Limits: The MCP server shares the same 10,000/day quota as the REST API. Each tool call counts as one request.
Claude Desktop Setup
Connect EduSignal directly to Claude Desktop to ask questions about K-12 school districts in natural language. Claude will use the MCP tools automatically.
Configuration
Add this to your Claude Desktop config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"edusignal": {
"url": "https://edusignal.ai/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}Replace YOUR_API_KEY with your actual API key. Restart Claude Desktop after saving the config.
Example Prompts
Once connected, try asking Claude:
"What's the enrollment and demographics of Wake County Public Schools in North Carolina?"
"Compare per-pupil spending between Los Angeles Unified and Chicago Public Schools."
"Find suburban districts in Texas with enrollment over 50,000 students."
"What are the math proficiency rates for the largest districts in California?"
Troubleshooting
- Tools not appearing: Verify your API key is valid and the config JSON is properly formatted.
- Rate limit errors: Wait for the daily quota to reset at midnight UTC.
- Connection issues: Check that Claude Desktop can reach
edusignal.ai(no VPN/firewall blocking).
Questions?
For API support, integration help, or feature requests, contact us at kevin@edusignal.ai
Need the complete dataset? View Bulk Data Export options