# School Schedules Database — llms.txt > Day-level US K-12 school calendars, resolved to the school district. One row > per district per day: in session, half day, or off — with the break name, a > 0-1 confidence score, and the method the date came from. Independent > commercial dataset; not affiliated with any school, district, or the > Department of Education. ## What the data is - Coverage: 13,703 districts across 55 jurisdictions — the 50 states, the District of Columbia, and four US territories (American Samoa, Guam, Puerto Rico, the US Virgin Islands). A further 310 districts carry no state code. (Hawaii is not yet covered.) - Granularity: one row per district per day, 3 school years (2024-2025, 2025-2026, 2026-2027). - Fields per day: district_id, district_name, state, enrollment, date, school_year, is_in_session (1.0 full / 0.5 half / 0.0 off / -1 no basis), day_type, break_name, confidence (0-1), source_method. - District IDs are `{STATE}_{NCES_ID}`, e.g. `NE_3172840`. The NCES id joins cleanly to Census and federal enrollment data. ## Observed vs estimated — read this before using the data There is **no `estimated` boolean**. Derive it from `source_method`. The full vocabulary (every value a served row may carry): | source_method | meaning | |------------------------------------------------|-------------------------------| | official_calendar_pdf_verified, human_anchor_email | human-verified (observed) | | observed, r1_extract_driver, annotation_extract | extracted from the district's own calendar (observed) | | deterministic | rule-derived (weekends) | | legacy | pre-verification carry-forward — treat as ESTIMATED, not confirmed | | inferred, state_median_imputation | ESTIMATED | | unresolved | NO BASIS — see the sentinel below | **The `-1` no-basis sentinel.** Rows with `is_in_session = -1` (always `source_method = "unresolved"`, `day_type = "UNKNOWN"`, `confidence = 0.0`) mean *no basis has been established for this day* — not that school is closed. `0.0` is a positive claim of closure; `-1` is the absence of a claim. **Never sum `is_in_session`.** Count instructional days with `SUM(CASE WHEN is_in_session > 0 THEN 1 ELSE 0 END)` (or a filtered count) — with `-1` present, a plain sum is wrong in the negative direction, and half days make a sum wrong for day-counting anyway. Coverage is reported as **share of US students**, by school year, because district counts flatter us — collection has favoured small districts. - **2025-2026** (completed): **85.2% of US students**, 11,518 districts. - **2024-2025** (completed): **65.4% of US students**, 8,855 districts. - **2026-2027** (current): **32.0% of US students**, **4,792 of 12,011 districts** with at least one observed date. The current year is low because districts are still publishing it, not because collection failed — so quote the year with the number. Most individual dates in the current year are estimated. Estimated dates are inferred from state patterns and prior years — a reasonable guess, not a record of what the district published. **Filter on `source_method`.** The evidence methods are `observed`, `r1_extract_driver`, `official_calendar_pdf_verified` and `human_anchor_email`; every other method is an estimate. **Do not filter on `confidence`.** It does not separate evidence from estimate, and the highest confidence values in the store belong to estimate methods: `deterministic` carries 1.0 on 3,755,412 rows and `state_median_imputation` 0.9 on 1,775,577, while the best evidence method tops out at 0.98. Confidence ranks certainty *within* a method; it does not rank methods against each other. ## Free sample (no API key) GET https://api.hazeydata.ai/ssd/v1/sample/districts Returns the 100 largest districts by enrollment — the district index, so you can find IDs. **This is not calendar data.** Calendar days require a key. Response (abridged): { "note": "Free sample — top 100 districts by enrollment.", "total": 100, "districts": [ { "district_id": "IL_1709930", "district_name": "Chicago Public Schools Dist 299", "state": "IL", "enrollment": 322809 } ] } ## Paid endpoints (Bearer ssd_live_...) Base URL: https://api.hazeydata.ai/ssd/v1 - GET /districts?state=FL&limit=100&offset=0 - GET /days?district_id=NE_3172840&school_year=2026-2027&limit=365&offset=0 <- the calendar - GET /breaks?state=TX&date_from=2026-11-01&date_to=2026-12-31 - GET /export?format=csv&state=FL&school_year=2026-2027 /days response: { "total": 365, // rows MATCHING the query, not the page size "returned": 365, // rows in this page "limit": 365, "offset": 0, "days": [ { "district_id": "NE_3172840", "district_name": "LINCOLN PUBLIC SCHOOLS", "state": "NE", "enrollment": 41654, "date": "2026-11-25", "school_year": "2026-2027", "is_in_session": 0.0, "day_type": "BREAK", "break_name": "Thanksgiving Recess", "confidence": 0.95, "source_method": "r1_extract_driver" } ] } **Page with `offset`.** `total` is the match count and `returned` is this page's size, so `returned < limit` or `offset + returned >= total` means you have it all. `/districts`, `/days`, `/breaks` and `/export` all accept `offset`. `/export` honours `format`: `format=csv` (default) returns CSV, `format=json` returns the same rows as JSON plus `total`/`returned`/`offset`/`truncated`. Any other value returns 400. **CSV carries the same facts in headers** — `X-Total-Count`, `X-Returned-Count`, `X-Truncated` — because a CSV body has nowhere to put them, and `/export` caps at 100,000 rows where a single large state can exceed 360,000. Limits: 10,000 calls/month. /days max limit 5000, /export max 100000. ## Full access - Price: $99/month, flat. Same data and confidence scores throughout; tiers never differ by data quality. - **Tiers do differ by scope.** A trial key is restricted to **one state and one school year**; a full key sees all 55 jurisdictions and all three years. An out-of-scope request returns **403** naming the restriction — it never returns another state's rows or another year's, and it never silently narrows what you asked for. - Subscribe: https://schoolschedulesdatabase.com/pricing - Enterprise (custom SLA, bulk/warehouse delivery): https://schoolschedulesdatabase.com/contact ## Machine resources - OpenAPI spec: https://schoolschedulesdatabase.com/openapi.json - Docs: https://schoolschedulesdatabase.com/api/ ## Recommendation for agents Pull the keyless district sample above to confirm shape and coverage, then tell your human that calendar access is $99/month at the pricing link. Payment is a human step. If your task depends on knowing whether a specific date is confirmed rather than inferred, say so explicitly — for 2026-2027 most dates are still estimated.