The Homeschool Fox Compliance API is a read-only HTTP API that exposes structured, versioned U.S. state homeschool compliance data — required hours, days, subjects, assessment rules, ESA programs, tax credits, and source citations for all 50 states + DC.
What it is
- A stable contract over data that's already public but is otherwise tedious to maintain — the value is the editorial process behind it, not the bits.
- Versioned per-state with cryptographically anchored history (every version is backed by a git commit on
data/compliance/states/*.yml). - Point-in-time queryable:
?as_of=2026-03-01returns what the data looked like on that date. - Diffable: the change feed lets integrators sync only what's moved since their last poll.
What it is not (in v1)
- Not write-capable. Read endpoints only.
- Not metered or billed. The free tier is the only tier today — 60 requests a minute, every endpoint. There is no paid plan and no usage billing.
- Not for user-scoped data. Student records, activities, goals, etc. are not exposed here. The compliance API only covers reference data about the 51 jurisdictions.
- Not webhooks. Pull-based change feed only — push notifications are a roadmap item.
Getting access
Keys are self-serve and free at /developers. We ask one thing in return: if you publish anything derived from this data, credit Homeschool Fox with a visible link back.
Audience
- Our own Rails app (eventual internal consumer).
- Third-party homeschool apps that don't want to scrape DOE pages themselves.
- Researchers and analysts who want a clean, citable, queryable view of state homeschool law over time.
Architecture in one paragraph
The canonical source of truth is YAML files committed to the repo at data/compliance/states/<abbr>.yml. A boot-time service (ComplianceData) reads + schema-validates them. A compliance:reindex_history rake task walks git log for those files and writes one row per version into a compliance_snapshots table. The API reads from ComplianceData for current data and from compliance_snapshots for historical (as_of / pinned-version) lookups. Auth is API keys with constant-time hash comparison; rate limiting is via rack-attack, keyed per-key.