City Council Watch — New Ordinances & Upcoming Meetings
Under maintenancePricing
Pay per usage
City Council Watch — New Ordinances & Upcoming Meetings
Under maintenanceGiven a list of cities, get new ordinances/resolutions filed since a date and upcoming council meeting agendas — pulled from each city's own Legistar API, the system behind most US city council websites.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Timothy Kelvin
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Give it a list of cities. Get back new ordinances/resolutions filed since a date, and upcoming council/committee meeting agendas — pulled straight from each city's own Legistar system, the software behind most US (and some Canadian) city council websites.
Built for local journalists, government-affairs and lobbying professionals, real-estate developers tracking zoning votes, and civic-tech researchers who currently check multiple city council sites by hand.
Input
{"cities": [{ "client": "seattle" }],"sinceDate": "2026-07-01","keywordFilter": ["zoning", "housing"],"matterTypeFilter": [],"includeUpcomingMeetings": true}
| Field | Type | Description |
|---|---|---|
cities | array | One entry per city: { "client": "seattle" }. The client code is the subdomain of that city's Legistar site. |
sinceDate | string | Only include matters introduced on or after this date (YYYY-MM-DD). |
keywordFilter | array of strings | Only keep matters whose title contains one of these (case-insensitive). |
matterTypeFilter | array of strings | Only keep matters whose type exactly matches one of these (e.g. "Ordinance"). |
includeUpcomingMeetings | boolean | Also fetch upcoming council/committee meetings (default true). |
Finding a city's client code: open that city's council site — if it's
Legistar-powered, it'll redirect to or link https://<client>.legistar.com.
seattle.legistar.com → "seattle". Not every city runs Legistar, and not
every guess matches the subdomain exactly (e.g. some counties use a
different code than their common name) — an unsupported/incorrect client
code fails that one city gracefully and the run continues with the rest.
Output
Two kinds of records, tagged by kind:
{"kind": "matter","client": "seattle","matterId": 17394,"file": "Appt 03569","title": "Appointment of Kelli Larsen as Director of the Office of Housing.","type": "Appointment (Appt)","status": "Committee Agenda Ready","body": "Housing, Arts, and Civil Rights Committee","introDate": "2026-07-28T00:00:00","agendaDate": "2026-08-12T00:00:00","passedDate": null,"url": "https://seattle.legistar.com/LegislationDetail.aspx?ID=17394&GUID=..."}
{"kind": "meeting","client": "seattle","eventId": 6814,"body": "Select Committee on the Comprehensive Plan","date": "2026-08-05T00:00:00","time": "9:30 AM","location": "Council Chamber, City Hall\r\n600 4th Avenue\r\nSeattle, WA 98104","agendaStatus": "Final","agendaFile": "https://legistar2.granicus.com/seattle/meetings/.../Agenda.pdf","url": "https://seattle.legistar.com/MeetingDetail.aspx?..."}
How it works
Direct calls to each city's own Legistar Web API — no scraping, no proxy, no key:
- Matters (legislation):
webapi.legistar.com/v1/{client}/matters - Events (meetings):
webapi.legistar.com/v1/{client}/events
Both are OData endpoints with server-side date filtering
(MatterIntroDate ge datetime'...'), so this actor only pulls what's
actually newer than sinceDate/today rather than filtering client-side
after downloading everything.
Pricing note
Billed per city queried, not per matter or meeting returned — a city with 50 new ordinances this month costs the same as one with 2.