What we scan, what counts as an opportunity, and how we stay honest
Local government data is public but painful. Here's exactly how we turn it into source-linked vendor leads — and the one rule we never break.
Sources we scan
We pull city-council matters and agenda items from the public
Granicus Legistar Web API (webapi.legistar.com/v1/{city}/Matters) — the same
records the city itself publishes on its Legistar site. The API is public and token-free for the
cities we use. We identify with a User-Agent and rate-limit our requests.
Current live metros (HTTP-200, token-free as of the 2026-06-11 pull):
Oakland CA, Seattle WA, Mesa AZ, Alameda CA, Philadelphia PA. Every rendered item links
back to the city's own LegislationDetail.aspx record so you can verify it independently.
What counts as an opportunity
An agenda item becomes an opportunity when it matches a vendor category by keyword and carries a meaningful procurement or budget signal. Categories we score: civil engineering / public works, facilities, IT & cybersecurity, software/SaaS, professional services, security services, staffing, and web/civic-tech.
Each item gets an opportunity score (category match + budget/procurement signals like "not to exceed", "RFP", "contract", "authorize") and an urgency read (NOW / SOON / WATCH). We classify whether it's award intel (a contract already going to a named prime — useful as subcontracting intelligence) or pipeline (upstream signals like a capital budget or a new build — forward-looking leads).
The no-padding rule
Never pad. A 5-item real pack beats a fake 10-item report. Every item must have a source link and freshness label.
This is verbatim from our compliance/quality rule. The pack generator refuses to invent rows to hit a target count — it renders exactly the items that match. The Oakland civil-engineering pack is 5 items because the data has 5 real items; it is not stretched to 10.
Freshness label convention
Two timestamps matter and we show both. The data window is when we pulled the records (the Legistar pull date, currently 2026-06-11, over a last-30-day window). The per-item freshness label is computed from the item's meeting date relative to today:
| Label | Meaning |
|---|---|
| Meeting is TODAY / in ≤7d | Imminent — act now |
| Meeting in 8–21d | Soon — on the near horizon |
| Meeting in >21d | Watch — track toward the date |
| Meeting was Nd ago | Past meeting — context / award already landed |
No item appears without a meeting date and a freshness label. If the date is unknown it is labeled as such — never hidden.
Next wedges we're testing
From the same 200-item live dataset, here are the honest densities of the
next-best wedges (full analysis in reports/adjacent_wedge_density_2026-06-13.md). No
(metro, category) pair reaches 10 in this window — max density is 5.
| Wedge | Real count | Status |
|---|---|---|
| Oakland, CA — civil engineering | 5 | Live (densest pair) |
| Oakland, CA — staffing | 4 | Next to test (same metro, distinct buyer) |
| Seattle, WA — engineering | 3 | Second test (proves the playbook ports to a new metro) |
| Alameda, CA — facilities | 3 | Bay Area neighbor candidate |
Recommendation: Oakland / staffing (count 4) is the best next wedge — highest adjacent density, zero new fetch cost (Oakland is already pulled), and a distinct, reachable buyer (staffing/recruitment firms placing into municipal roles). Note: the brief guessed "Mesa/facilities=3", but the real count is Mesa/facilities=2; the actual 3-count facilities wedge is Alameda. We report the real number.