City Council Minutes
Pricing
from $2.00 / 1,000 result rows
City Council Minutes
City Council Minutes — scrape US city council meetings, agendas, and minutes from public Legistar clients. Multi-city → flat JSON via official Web API.
Pricing
from $2.00 / 1,000 result rows
Rating
0.0
(0)
Developer
Marc M
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
What does Legistar Meetings Scraper do?
Legistar Meetings Scraper pulls public municipal council meetings, agendas, minutes links, and legislation matters from the official Granicus Legistar Web API — plain HTTP JSON, no browser, no login.
Pass one or many Legistar client slugs (the {slug} in https://{slug}.legistar.com) and get flat dataset rows ready for PropTech pipelines, zoning intel, lobbying monitors, civic journalism, and compliance watches.
Disclaimer: This Actor is not affiliated with, endorsed by, or sponsored by Granicus, Legistar, or any municipality. It only requests records the API marks as public / InSite-visible.
Why this Actor?
- 🏙 Multi-city in one run —
clients: ["seattle","milwaukee","boston"] - 📡 Official Web API —
webapi.legistar.com/v1/{Client}/…, not brittle HTML - 📋 Meetings + matters — events (agendas/minutes) and/or legislation matters
- 🧾 Flat JSON — one row per event/matter; optional flattened agenda titles
- 🐢 Polite throttling — short delay between clients and paginated requests; identifiable User-Agent
- ⏱ Apify platform — schedules, webhooks, API, integrations, monitoring
- 💵 Simple pricing — $0.002 per successful result (+ tiny Actor-start fee). Error rows are not charged.
What data can you extract?
| Field group | Examples |
|---|---|
| Meeting meta | bodyName, eventDate, eventTime, location, agendaStatus, minutesStatus |
| Documents | agendaUrl, minutesUrl, videoStatus, inSiteUrl |
| Legislation | matterFile, title, typeName, statusName, intro/agenda/passed dates |
| Ops | client, eventId / matterId, lastModifiedUtc, recordType |
How to scrape city council agendas with Legistar
- Open Legistar Meetings Scraper on Apify Store (or Console).
- Set Client slugs — e.g.
seattleforseattle.legistar.com. - Optionally set From / To dates (YYYY-MM-DD). Defaults: last 30 days → +14 days.
- Choose Resource: Meetings (
events), Matters, or Both. - Set Max items and run.
- Download the dataset (JSON/CSV/Excel) or pull via Apify API.
How to find the client slug
Open the city’s Legistar site. The hostname label is the slug:
| City site | Slug |
|---|---|
| https://seattle.legistar.com | seattle |
| https://milwaukee.legistar.com | milwaukee |
| https://boston.legistar.com | boston |
Known-good (Week-0 probes): seattle, milwaukee, madison, oakland, sanjose, boston, denver, columbus.
Known issues: chicago → HTTP 500 (InSite connection); phila → 403. Failures are logged / written to a non-billed errors dataset; the default dataset stays success-only.
Input
| Field | Required | Default | Description |
|---|---|---|---|
clients | yes | ["seattle"] | Array of Legistar client slugs |
dateFrom | no | 30 days ago | Inclusive YYYY-MM-DD |
dateTo | no | today + 14d | Inclusive YYYY-MM-DD |
maxItems | no | 50 | Cap on dataset rows (1–5000) |
resource | no | events | events | matters | both |
includeEventItems | no | false | Extra GET per event; flatten titles into eventItemTitles |
Example input (single city)
{"clients": ["seattle"],"dateFrom": "2026-08-01","dateTo": "2026-10-01","maxItems": 50,"resource": "events","includeEventItems": false}
Example input (multi-city)
{"clients": ["seattle", "milwaukee", "boston"],"dateFrom": "2025-09-16","dateTo": "2026-10-16","maxItems": 1200,"resource": "events"}
Stress-validated (private run): 1169 events across those three cities.
Sample output
Real fields from last-known-good canary (seattle):
{"recordType": "event","client": "seattle","eventId": 6883,"eventGuid": "850BF790-9660-42F4-8FD4-B501956F4710","bodyId": 279,"bodyName": "Human Services, Labor, and Economic Development Committee","eventDate": "2026-09-18T00:00:00","eventTime": "9:30 AM","location": "Council Chamber, City Hall\r\n600 4th Avenue\r\nSeattle, WA 98104","agendaStatus": "Final","minutesStatus": "Draft","agendaUrl": "https://legistar2.granicus.com/seattle/meetings/2026/9/6883_A_Human_Services%2C_Labor%2C_and_Economic_Development_Committee_26-09-18_Committee_Agenda.pdf","minutesUrl": null,"videoStatus": "Public","inSiteUrl": "https://seattle.legistar.com/MeetingDetail.aspx?LEGID=6883&GID=393&G=FFE3B678-CEF6-4197-84AC-5204EA4CFC0C","comment": null,"lastModifiedUtc": "2026-09-16T16:02:48.8","eventItemCount": 0,"eventItemTitles": ""}
Default-dataset recordType is event or matter. Diagnostics use a separate non-billed errors dataset.
How much does it cost to scrape Legistar meetings?
Pay-per-event pricing:
| Event | Price |
|---|---|
| Actor start | ~$0.00005 (platform default) |
| Dataset item (successful meeting / matter only) | $0.002 |
| Error / diagnostic rows | Not charged |
Examples
| Run | Approx. cost |
|---|---|
| 1 start + 100 meetings | ≈ $0.20 |
| 1 start + 1,000 meetings | ≈ $2.00 |
| Stress-scale 1,169 events (3 cities) | list ≈ $2.34 at $0.002 |
Free Apify plan users can try small runs within platform free credits. No residential proxy required for normal public clients. Actor applies polite throttling between clients/requests.
Use cases
- 🏗 PropTech / zoning intel — track planning, land-use, and council briefings across markets
- 📣 Lobbying & public affairs — monitor committee calendars and agenda packet links
- 📰 Journalism — structured feeds of upcoming/cancelled meetings and minutes status
- ⚖️ Civic / FOIA workflows — inventory public meetings without hand-copying InSite
- 🤖 AI agents — schedule the Actor, webhook new
eventrows into your stack
Limitations
- Public clients only — cities that require an API
tokenare out of scope for v1 - Not every US city uses Legistar — CivicPlus / PrimeGov / other portals need different Actors
- OData page size — API caps responses; Actor pages with
$top/$skip - PDF contents — we return
agendaUrl/minutesUrl; we do not OCR PDFs in v1 - Some slugs fail — e.g. chicago 500 / phila 403; diagnostics are non-billed; run still completes
Legal & fair use
- Data source: official Legistar Web API (
webapi.legistar.com) public GET endpoints. - Only InSite-public meeting/legislation metadata.
- No login, no scraping of gated clerk portals, no harvesting emails/phones from free text.
- Not affiliated with Granicus, Legistar, or any municipality.
- Polite request pacing (throttle between clients and pages).
- You are responsible for how you reuse public records in your jurisdiction.
API reference: https://webapi.legistar.com/Home/Examples
FAQ
Is this an official Granicus product?
No. It is an independent Apify Actor that calls the documented public Web API. Not affiliated with Granicus or Legistar.
Can I scrape multiple cities at once?
Yes — put every slug in clients[]. The Actor throttles politely between clients.
Do I need proxies?
Usually no for public token-free clients. Use Apify proxy only if you hit rate limits.
Are error rows charged?
No. Only successful default-dataset rows (event / matter) bill under PPE.
Matters vs events?
events = meetings (agendas/minutes). matters = legislation files. Use both when you need both collections under one maxItems budget.
How do I automate this?
Use Apify Schedules, Integrations, or the Apify API / Python/JS client to run on a cron and push to your warehouse.
SEO keywords
legistar scraper, legistar api, city council agenda scraper, municipal meetings scraper, granicus legistar, council minutes api, seattle legistar, municipal legislation scraper, public meeting records, zoning meeting monitor, proptech civic data