API reference · Changes
Read the change feed
Every change written to the data, oldest first, by an ever-growing id. Keep the last id you read and pass it as after (or follow next_cursor) to read what changed since. Billed as one records request a page. Filters: jurisdiction, kind, since, after.
bearerAuthAuthorizationBearer <token>htd_test_ (sandbox, free, fictional towns) or htd_live_ (live, billed) key.
jurisdiction?stringA jurisdiction id.
^[a-z0-9][a-z0-9-]{0,63}$kind?stringThe family the changed record is in: meeting, agenda_item, motion, recording, bylaw, post, jurisdiction, topic_tag.
^[a-z][a-z0-9_]{0,60}$since?stringRecords read at or after this instant: what is new since your last read.
after?stringEvents after this event id (the last id you read).
^[0-9]{1,18}$limit?integerResults a page, 1 to 100. Default 25.
cursor?stringnext_cursor from the previous page.
A page.
application/json- response
query*The filters as the API read them, defaults included.
as_of*stringISO 8601 instant, UTC.
results*array<>next_cursor*|Pass as cursor for the next page; null on the last.
environment*stringsandbox answers carry fictional towns.
"sandbox""live"curl -X GET 'https://data.heytownhall.com/v1/events'{ "query": { "property1": null, "property2": null }, "as_of": "string", "results": [ { "id": "string", "kind": "string", "jurisdiction_id": "string", "family": "string", "subject_id": "string", "occurred_at": "string" } ], "next_cursor": "string", "environment": "sandbox"}Coverage
What the data holds and where: two endpoints that need no key and are never billed.
Coverage by jurisdiction GET
Each jurisdiction with how much of it is read (ingest_profile), its meetings and their span, its meeting vendors, and what is held now in each family (held): what is held, never what a body is expected to have. Every family is offered for every country. No key needed; not billed.