Day-level calendars for 12,023 districts: spring break, winter break, teacher in-service, first and last day. Resolved to the district, scored for confidence, and ready to drop into your demand model. No scraping, no PDF parsing, and every estimate is labeled as one.
Built for EdTech services, retail and restaurant demand, travel, staffing, energy load, and research.
Illustrative
Illustrative · 2026–27 school year
Live rows from the database
Coverage: 12,023 districts across 49 states, DC, Guam, Puerto Rico and the US Virgin Islands (53 jurisdictions) for 2026-27. Hawaii is not yet covered for 2026-27. A district counts when it has a 2026-27 calendar row, confirmed or estimated.
No key required
The free sample is the top-100 district index (district_id, name, state, enrollment) plus one full district calendar for 2026-27, in which every day carries a source label (what the labels mean). Every other calendar needs a key. One prompt with everything your agent needs. Copy and paste.
Add the School Schedules Database to my data pipeline.
It's a day-level API of US school calendars — one row per district per day
(in session / half day / off), with the break name, a 0-1 confidence score,
and the method each date came from.
Base URL: https://api.hazeydata.ai/ssd/v1
Free sample (no key): GET /sample/districts
-> the top 100 districts by enrollment (district_id, district_name,
state, enrollment), plus one full district calendar for 2026-27 in
the /days row shape; every day carries a source label
(source_method). Every other calendar needs a key.
Everything else needs: Authorization: Bearer ssd_live_... ($99/mo)
# Try the keyless sample now
curl -s "https://api.hazeydata.ai/ssd/v1/sample/districts"
Paid endpoints, once I have a key:
GET /days?district_id=NE_3172840&school_year=2026-2027 <- the calendar
GET /export?format=csv&state=FL&school_year=2026-2027
District IDs are {STATE}_{NCES_ID}. Each /days row returns:
date · school_year · is_in_session · day_type · break_name
confidence · source_method
IMPORTANT — confirmed vs estimated:
There is no "estimated" boolean; every day carries a source label (source_method).
Which labels are confirmed and which are estimated is defined in one table:
https://schoolschedulesdatabase.com/api/#source-method
Most 2026-2027 dates are currently estimated.
Pull the keyless sample, show me the JSON, and write a function that takes a
district_id and school year and returns a dataframe with an is_estimated
column derived from source_method using that table.
What's in the data
The calls you ship today keep working. Paid endpoints are long-term-support: no silent breaking changes.
Lock your rate at signup. New tiers never reprice existing customers. Cancel anytime, no annual lock-in.
The keyless sample is the top-100 district index plus one full district calendar for 2026-27, in which every day carries a source label; every other calendar needs a key. Same schema from your first key to full production. Access differs by volume, freshness and support — never by quality.
Bulk export or per-district. Day-level expansion — one row per district per day, flat for time-series.
Standard identifiers. Join straight onto Census, enrollment, or your own geodata.
A 0-1 score reflecting the source behind each day. To split confirmed from estimated, filter on source_method.
Pricing
One plan unlocks the full dataset: same schema, plus calendar days for all 12,023 districts.
Every district, every day — in production.
Volume SLAs, custom delivery, procurement.