Reads upcoming city council and committee agendas through Apify (Legistar-based cities), keeps only items you have not seen, and scores them against your topics, item type, dollar amounts and how soon the meeting is. Useful for lobbyists, government-contract sellers, developers, local reporters and neighborhood groups who need to know before an item is voted on.
How it works
- Daily schedule / manual run reads every setting from Config. A weekly schedule uses the same Config to send a report instead of running the actor.
- Starts the Apify actor asynchronously, then waits and polls the run; FAILED, ABORTED, TIMED-OUT or too many polls stop with an error.
- Downloads the dataset, validates rows and dedupes within the run and across runs (workflow static data,
dedupeMemoryDays).
- A transparent rule score runs first, then an LLM chain with a structured output parser reads each record against your plain-English
aiCriteria and returns a fit score, verdict, summary, outreach angle and red flags. Calls are batched with a delay for rate limits, retried, and fall back to the rule score if the model fails.
- Upserts every row to Google Sheets. Hot rows go to Slack as one approve / dismiss message (send-and-wait, 24 h limit) and the decision is written back to the sheet; warm rows go to an HTML email digest; cold rows stay in the sheet.
- Weekly report: reads the sheet, summarises the last 7 days (tiers, approvals, top 10) and emails it.
- A separate Error Trigger branch posts any failure to Slack.
Setup (about 15 minutes)
- Create an HTTP Header Auth credential: name
Authorization, value Bearer <APIFY_API_TOKEN> (Apify Console > Settings > API & Integrations). Select it on the 3 Apify HTTP nodes.
- Create a Google Sheet with a tab named in
sheetTab and a header row matching the sheet columns (see Upsert to Google Sheets, plus status and reviewedAt). Paste its ID into googleSheetId.
- Connect OpenAI (or swap the chat model sub-node for Anthropic, Gemini, Ollama...), Slack and Gmail; set
slackChannelId and digestEmail in Config (also the channel on Slack: error alert).
- In Config set
actorInput.clients (city codes), daysAhead, keywords and watchKeywords (comma-separated topics), itemTypes.
- Write your ideal-lead description in
aiCriteria; set aiWeight (0 = rules only, 1 = AI only).
- Run once manually, check the sheet, then activate.
Customize
- Edit weights in Score agenda relevance (topic match 35-55, meeting within 7 days 20, item type 10, dollar amount 10). Procedural items such as consent lists and roll call score 0.
- Set
bodyFilter in actorInput to follow one committee.
- Agendas can change; always confirm on the linked meeting page.
- Swap Gmail/Slack for Teams, Discord, HubSpot, Airtable, etc. Each delivery node only reads
$json.
Disclosure: I maintain these Apify actors (account transparent_meteorite). The actor is a paid pay-per-event Apify tool; check its Store page for current pricing before scheduling.