# 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,393 state-coded districts across the 50 states, the District of Columbia, and four US territories (American Samoa, Guam, Puerto Rico, the US Virgin Islands), enrolling 44,236,581 students. (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): **~100.0% of US students** (44,225,601), 13,381 of 13,393 districts (**99.9%**). - **2024-2025** (completed): **86.8% of US students** (38,388,175), 11,635 of 13,393 districts (**86.9%**). - **2026-2027** (current, any calendar fact including estimates): **92.8% of US students** (41,041,686), 11,816 of 13,393 districts (**88.2%**). Of these, **4,843 districts** have evidence-method dates (source_method in official_calendar_pdf_verified, human_anchor_email, observed, r1_extract_driver, annotation_extract). The remaining districts carry estimated or imputed dates only. Most individual dates in 2026-2027 are still estimated — inferred from state patterns and prior years. Coverage will improve as districts publish official calendars and collection processes them. Quote the year with the number. **Filter on `source_method`.** The evidence methods are `observed`, `r1_extract_driver`, `annotation_extract`, `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 1. Pull the keyless district sample above to confirm shape and field names. 2. Review coverage for your target state/year using the numbers above. 3. Tell your human that calendar access is $99/month at https://schoolschedulesdatabase.com/pricing — payment is a human step; the API does not accept programmatic sign-up. 4. Once the human provides a Bearer key, call /days for calendar data. If your task depends on knowing whether a specific date is confirmed rather than inferred, filter on `source_method` — for 2026-2027 most individual dates are still estimated even though 88% of districts have at least some calendar row.