How City Record Digest selects, flags, and presents NYC government notices.
All notices are pulled directly from NYC Open Data dataset dg92-zbpx (City Record Online), which the Department of Citywide Administrative Services publishes daily. We fetch each business day's notices via the Socrata API:
https://data.cityofnewyork.us/resource/dg92-zbpx.json?$where=start_date='YYYY-MM-DD'
The published archive runs from the date the digest started collecting forward. Every card on the site links back to the underlying Open Data row and to the original notice on a856-cityrecord.nyc.gov.
Flagging is rule-based — no human curation and no model. Rules run in order; the first matching rule wins. Notices that match no rule appear only in the All Notices table.
Two priority tiers:
| Code | Rule | Tier |
|---|---|---|
EXEC_ORDER | Title contains "executive order" | Notable |
EXEC_ORDER_EMERGENCY | Executive order with "emergency" in title | Notable |
CEQR | Special Materials notice naming CEQR, rezoning, or environmental review | Notable |
CONCEPT_PAPER | Special Materials concept paper (pre-procurement signal) | Notable |
SPECIAL_MATERIALS | Other Special Materials, except routine fuel/LL63/monthly index | Notable |
BIG_CONTRACT | Contract amount ≥ $1,000,000 (in contract_amount or extracted from body) | Notable |
AGENCY_RULE | Section = Agency Rules | Notable |
PROP_DISP | Section = Property Disposition | Notable |
COURT | Section = Court Notices | Notable |
AWARD_HEARING | Section = Contract Award Hearings | Notable |
EMERGENCY | "emergency procurement / contract / declaration / order" anywhere in title or body | Notable |
SETTLEMENT | "settlement", "stipulation of settlement", "class action settlement" | Notable |
BOND | "bond issuance / sale / series / anticipation" | Notable |
LAND_USE | ULURP or landmark designation / hearing / preservation | Notable |
OVERSIGHT | Consent decree or court-appointed / independent / federal monitor | Notable |
KEY_AGENCY | Agency matches: NYCHA, HPD, NYPD, DOE, DOC, DHS, ACS, OMB, MOCJ, City Planning, Mayor's Office | Notable |
SOLE_SOURCE | Selection method or body text contains "sole source", "negotiated acquisition", "non-competitive", "single source" | Notable |
POLICY_TERM | Body or title mentions: shelter, jail, Rikers, rezoning, affordable housing, charter school, homelessness, eviction, supportive housing, mental health, opioid, overdose, gun violence, youth program | Notable |
BIG_CONSTRUCTION | ≥ $500K AND keywords: construction, infrastructure, capital, renovation, repair | Watching |
ENV_HEALTH_HEARING | Hearing/meeting on environment, health, water, air quality, lead, asbestos, climate | Watching |
HUMAN_SERV_RENEWAL | Extension/renewal/amendment in Human Services category | Watching |
CONSULTING | ≥ $100K AND keywords: consulting, lobbying, communications, PR, advertising | Watching |
"Changes in Personnel" entries (hires, separations, transfers) are pulled out of the main notice list and shown as a summary callout: total entries, breakdown by action, and the top agencies. Individual personnel rows are not displayed because they are bulk-published and aren't useful at the individual level.
Three categories of Special Materials are intentionally excluded because they are repetitive and rarely newsworthy:
The stat strip on each day's digest compares the day's counts to the trailing 30-day median of available data (excluding the current day). Days with no published data are skipped. If fewer than 30 days exist in the archive, the median is computed over whatever days are available.
Filter chips reflect in the URL as query parameters: ?agency=…&reason=…&type=…&min=…&deadline=…&date=…. Any filtered view is shareable as a direct link.
contract_amount field or, when missing, from the largest dollar figure parsed out of the notice body. Amounts in the body may include estimates, line items, or unrelated figures.The pipeline is two Node scripts in the repository: fetch-daily.mjs (pulls the day's notices, applies the flagging rules, writes data/YYYY-MM-DD.json) and generate-feeds.mjs (rebuilds RSS feeds). Both run on a daily schedule via GitHub Actions.