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
$49/month
Subscribe

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.

Base URL: https://edusignal.ai/api/v1
13,000+
Districts
50
States + DC
40+
Data Points

Authentication

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/3704320

Getting an API Key

  1. Subscribe to API access ($49/month) via the Pricing section below.
  2. After payment, your API key will be displayed once. Copy and store it securely.
  3. 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.

10,000
Requests per day
20
Requests per second (burst)

Rate Limit Headers

Every response includes rate limit information in the headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per day (10000)
X-RateLimit-RemainingRequests remaining in current period
X-RateLimit-ResetUTC 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

GET/api/v1/districts/{ncesId}

Returns a full district profile including enrollment, demographics, academics, finances, staffing, and AI-generated summary.

Path Parameters

NameTypeDescription
ncesIdstring7-digit NCES district ID (e.g., 3704320)

Example Request

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://edusignal.ai/api/v1/districts/3704320

Example 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"
}
GET/api/v1/districts/search

Search and filter districts with cursor-based pagination.

Query Parameters

NameTypeDescription
statestring2-letter state code (e.g., NC, CA)
enrollment_minintegerMinimum enrollment
enrollment_maxintegerMaximum enrollment
localestringComma-separated locale types (City, Suburb, Town, Rural)
frpl_minnumberMinimum FRPL percentage (0-100)
frpl_maxnumberMaximum FRPL percentage (0-100)
math_proficiency_minnumberMinimum math proficiency (0-100)
math_proficiency_maxnumberMaximum math proficiency (0-100)
reading_proficiency_minnumberMinimum reading proficiency (0-100)
reading_proficiency_maxnumberMaximum reading proficiency (0-100)
pps_minnumberMinimum per-pupil spending
pps_maxnumberMaximum per-pupil spending
cursorstringPagination cursor from previous response
limitintegerResults 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
}
GET/api/v1/districts/{ncesId}/schools

Returns aggregate school counts for a district by level. Individual school records are not currently available.

Path Parameters

NameTypeDescription
ncesIdstring7-digit NCES district ID

Example Request

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://edusignal.ai/api/v1/districts/3704320/schools

Example 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."
}
GET/api/v1/states

Returns a list of all states with aggregate education statistics.

Example Request

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://edusignal.ai/api/v1/states

Example 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"
    }
  ]
}
GET/api/v1/states/{stateCode}

Returns state-level aggregate data including enrollment, spending averages, and proficiency rates.

Path Parameters

NameTypeDescription
stateCodestring2-letter state abbreviation (e.g., NC, TX)

Example Request

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://edusignal.ai/api/v1/states/NC

Example 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"
}
GET/api/v1/states/{stateCode}/districts

Returns all districts in a state with cursor-based pagination, ordered by enrollment (largest first).

Path Parameters

NameTypeDescription
stateCodestring2-letter state abbreviation

Query Parameters

NameTypeDescription
cursorstringPagination cursor from previous response
limitintegerResults 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
}
POST/api/v1/compare

Returns side-by-side data for 2-10 districts. Districts are returned in the same order as the request.

Request Body

NameTypeDescription
nces_idsstring[]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/compare

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"
    }
  ]
}

Error Codes

All errors follow a consistent JSON format with an error object containing code, message, and optional retry_after.

CodeHTTP StatusDescription
unauthorized401Missing or invalid API key
not_found404Resource (district, state) not found
rate_limit_exceeded429Daily or burst rate limit exceeded
invalid_request400Invalid parameters or request body
server_error500Internal server error

MCP Server

Model Context Protocol

Connect AI assistants like Claude directly to EduSignal data using the MCP protocol.

Endpoint: https://edusignal.ai/mcp
Protocol: MCP 2025-11-25 (Streamable HTTP)
Auth: OAuth 2.0 with PKCE or API Key

Authentication Options

Option 1: OAuth (For Claude.ai)

Coming Soon

EduSignal is awaiting approval for the Claude Connectors Directory. Once listed, you'll be able to connect directly from Claude.ai — no API key needed.

OAuth endpoints: /oauth/authorize, /oauth/token
Scopes: mcp:read, mcp:tools

Option 2: API Key (For Claude Desktop & programmatic use)

Use your API key in the Authorization header. Same key works for both REST API and MCP.

curl -X POST https://edusignal.ai/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","method":"initialize","id":1}'

Available Tools

lookup_district

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

Parameters:
  • nces_id — 7-digit NCES district ID
  • name — District name (partial match)
  • state — State code or name

Either nces_id or both name + state required

search_districts

Search for K-12 school districts matching specific criteria. Returns up to 20 results per call. Use filters to narrow results.

Parameters:
  • state — 2-letter state code
  • enrollment_min / enrollment_max
  • locale — Array: City, Suburb, Town, Rural
  • frpl_min / frpl_max — FRPL %
  • math_proficiency_min — Min math %
  • pps_min / pps_max — Per-pupil $
  • limit — Results (max 20, default 10)
compare_districts

Compare 2-5 school districts side by side with full profiles.

Parameters:
  • nces_ids — Array of 2-5 NCES IDs (required)
get_state_summary

Get aggregate education statistics for a US state — enrollment, districts, spending, proficiency rates.

Parameters:
  • state_code — 2-letter abbreviation (required)
list_districts_in_state

List all school districts in a state with summary data. Paginated (up to 50 per page).

Parameters:
  • state_code — 2-letter abbreviation (required)
  • cursor — Pagination cursor
  • limit — 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.ai Setup

Coming Soon

Pending Directory Listing:EduSignal is awaiting approval for the Anthropic Connectors Directory. Once listed, you'll be able to connect directly from Claude.ai without an API key. In the meantime, use Claude Desktop with an API key.

Once available, connect EduSignal to Claude.ai using the Connectors Directory. No API key required — just sign in with your EduSignal account.

How It Will Work

  1. Go to Claude.ai Settings → Connectors
  2. Search for "EduSignal" in the directory
  3. Click "Connect" and sign in with your EduSignal account
  4. Grant permission for Claude to access district data
  5. Start asking questions about K-12 districts in any Claude conversation

What You'll Be Able to Ask

Once connected, Claude will answer questions like:

"What's the enrollment at Wake County Public Schools?"

"Compare graduation rates between LAUSD and NYC Public Schools"

"Find rural districts in Texas with high math proficiency"

Disconnecting

To revoke access, you'll go to Claude.ai Settings → Connectors and click "Disconnect" next to EduSignal.

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

Slack Bot

Query Districts from Slack

Ask natural language questions about K-12 districts directly in your Slack workspace.

Requires Active API Subscription: The Slack bot uses your API quota. You must have an active $49/month API subscription to install and use the bot.

Installation

  1. Ensure you have an active API subscription
  2. Go to Dashboard Settings and click "Connect to Slack" in the Integrations section
  3. Authorize EduSignal in your Slack workspace
  4. Invite @EduSignal to any channel, or DM the bot directly

Usage

Mention @EduSignal in a channel or send a direct message. The bot understands natural language queries:

@EduSignal Find large urban districts in Texas

@EduSignal Look up Wake County Schools

@EduSignal Show high-poverty rural districts in California

@EduSignal Districts with math proficiency above 60%

@EduSignal help

Supported Queries

Query TypeExample
Direct Lookup"Look up LAUSD" or "3704320" (NCES ID)
State Search"Districts in North Carolina"
Size Filters"Large districts" or "Small rural districts"
Demographics"High-poverty urban districts"
Academics"Districts with math proficiency above 50%"

Rate Limits: Slack bot queries count against your daily API quota of 10,000 requests. Each query uses one request.

Questions?

For API support, integration help, or feature requests, contact us at kevin@edusignal.ai

Need the complete dataset? View Bulk Data Export options