Legistar Agenda Radar - City Council Agenda Keyword Alerts
Pricing
from $1.00 / 1,000 results
Legistar Agenda Radar - City Council Agenda Keyword Alerts
Scan city council agendas for zoning, contract, RFP, and bid keywords across 86 U.S. cities (Chicago, Boston, Austin, Denver, and more). Returns matched items with attachment links. Optional vote records and RSS feed for Slack/Zapier alerts. No browser needed — pure API, runs on the cheapest plan.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer

tyler
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Legistar Agenda Radar
Get keyword alerts for zoning, contract, RFP, and bid items on city council agendas — automatically.
This tool scans public meeting agendas for 86 U.S. cities and counties that use Legistar (including Chicago, Boston, Detroit, Austin, Dallas, Atlanta, Miami, San Jose, Denver, and more). You tell it which city and which keywords to watch, and it returns every matching agenda item with direct links to the attached documents.
It runs on Apify (a cloud automation platform), uses zero browser automation, and can be scheduled to run daily.
What You Get
For every agenda item that matches your keywords, you get:
- What it is — the agenda item title, matter title, and which committee/body it belongs to
- When — meeting date and time
- Where to read more — direct link to the Legistar event page
- Attachments — direct download URLs for every PDF, Word doc, etc. attached to that item
- Vote records (optional) — who voted and how
- RSS feed (optional) — plug it into Slack, email, Zapier, or any feed reader for real-time alerts
You can download results as JSON, CSV, or Excel from the Apify Console.
Quick Start
Copy this into the Apify Console input editor (or save as INPUT.json locally):
{"client": "seattle","daysBack": 14,"keywords": "zoning"}
That's it. This scans Seattle City Council agendas from the last 2 weeks for anything mentioning "zoning" and returns matching items with all their attachments.
Want to monitor multiple keywords?
Separate them with commas:
{"client": "chicago","daysBack": 30,"keywords": "zoning,RFP,contract,bid"}
Want everything (no filter)?
Leave keywords empty:
{"client": "boston","daysBack": 7,"keywords": ""}
Which Cities Work?
86 cities and counties are confirmed working. Here are some of the big ones:
| City | Client ID | City | Client ID |
|---|---|---|---|
| Seattle, WA | seattle | Chicago, IL | chicago |
| Boston, MA | boston | Detroit, MI | detroit |
| San Jose, CA | sanjose | Denver, CO | denver |
| Phoenix, AZ | phoenix | Sacramento, CA | sacramento |
| Oakland, CA | oakland | Pittsburgh, PA | pittsburgh |
| San Francisco, CA | sfgov | Nashville, TN | nashville |
| Baltimore, MD | baltimore | Milwaukee, WI | milwaukee |
| Long Beach, CA | longbeach | Kansas City, MO | kansascity |
Watch out — some cities use non-obvious IDs:
| City | You might guess... | Actual ID |
|---|---|---|
| Austin, TX | austin | austintexas |
| Dallas, TX | dallas | cityofdallas |
| Atlanta, GA | atlanta | atlantaga |
| Charlotte, NC | charlotte | charlottenc |
| Miami, FL | miami | miamifl |
| Minneapolis, MN | minneapolis | minneapolismn |
| Cleveland, OH | cleveland | cityofcleveland |
| Albuquerque, NM | albuquerque | cabq |
| San Francisco, CA | sanfrancisco | sfgov |
Counties work too: kingcounty, lacounty, miamidade, broward, pinellas, mecklenburg.
See SUPPORTED_CLIENTS.md for the full list of all 86.
How to find your city's ID
- Google "your city" legistar and look for a URL like
https://seattle.legistar.com - The part before
.legistar.comis your client ID - If that doesn't work, try
{city}{state}(e.g.miamifl) orcityof{city}(e.g.cityofdallas)
Cities that DON'T work
Some major cities use different platforms entirely (not Legistar), so they'll never work with this tool: Houston (uses Swagit), Los Angeles (uses PrimeGov), Portland (uses their own website). NYC and Philadelphia require an API key — pass yours via the apiKey input field.
All Input Options
| Field | What it does | Default |
|---|---|---|
client | Your city's Legistar ID (see above) | seattle |
daysBack | How far back to search (in days) | 14 |
keywords | Comma-separated keywords to match. Empty = get everything | "" |
includeAttachments | Grab attachment download URLs? | true |
includeVotes | Fetch vote records? (slower — extra API call per item) | false |
rss | Generate an RSS feed? | false |
maxEvents | Max number of meetings to scan | 50 |
maxItemsPerEvent | Max agenda items per meeting | 200 |
debug | Show extra logging (URLs, raw data) | false |
apiKey | API key if your city requires one (NYC, Philly) | "" |
authHeaderName | How to send the key: Authorization or X-API-KEY | Authorization |
What the Output Looks Like
Each matching agenda item looks like this (real data from Seattle):
{"client": "seattle","eventId": 6581,"eventDate": "2026-02-10T00:00:00","eventTime": "2:00 PM","eventName": "City Council","bodyName": "City Council","agendaItemTitle": "AN ORDINANCE relating to land use and zoning; revising environmental review thresholds...","agendaItemOrder": 18,"matterId": 16444,"matterTitle": "CB 121093","legistarEventUrl": "https://seattle.legistar.com/MeetingDetail.aspx?LEGID=6581&GID=393&...","matchedKeywords": ["zoning"],"attachmentUrls": ["https://legistar2.granicus.com/seattle/attachments/8e51b18e-...docx","https://legistar2.granicus.com/seattle/attachments/57775d1e-...pdf"]}
RSS Feed
Set "rss": true and the actor generates an RSS 2.0 XML file saved in the Key-Value Store as OUTPUT_RSS. Plug the URL into Slack, Zapier, Microsoft Teams, or any feed reader to get notified when new matches appear.
Who This Is For
| You are... | You care about... | Try these keywords |
|---|---|---|
| A GovTech sales team | RFPs and contract awards | RFP,contract,bid,procurement |
| A real estate developer | Zoning changes and permits | zoning,variance,permit,rezoning |
| A journalist | Policy debates and votes | ordinance,resolution,hearing |
| A civic watchdog | Budget and spending | budget,appropriation,grant,funding |
| A lobbyist or advocate | Legislation on your issue | cannabis,housing,transit,climate |
Running Locally
You need Node.js 18+ and the Apify CLI.
npm install -g apify-cli # one-time setupgit clone <repo-url> legistar-agenda-radarcd legistar-agenda-radarnpm install
Create your input file:
$mkdir -p storage/key_value_stores/default
Then create storage/key_value_stores/default/INPUT.json with your settings (see Quick Start above).
Run it:
$apify run
Results appear in storage/datasets/default/ as JSON files. If you enabled RSS, the feed is at storage/key_value_stores/default/OUTPUT_RSS.xml.
Publishing to Apify
apify loginapify push
Your actor will appear in your Apify account. You can schedule it (e.g. daily at 8am), set up webhooks, or call it via API.
Under the Hood
- Talks directly to the Legistar Web API — no browser, no scraping HTML
- If a request fails (rate limit, server error, timeout), it retries up to 4 times with increasing waits
- Pauses 250ms between requests to avoid hammering the API
- If one date format is rejected, it automatically tries an alternate format
- Runs on the cheapest Apify plan (no Playwright/Puppeteer needed)
License
ISC

