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.
The Trends tab reads a single precomputed aggregate, data/trends.json, rebuilt by build-trends.mjs after every daily fetch. It rolls the full archive up into monthly, daily, agency and vendor time series. Definitions:
contract_amount field exactly as published in the City Record — it may represent a multi-year contract total or a renewal, and can differ from the cash actually paid in that month. Awards are dated by their publication day.vendor_name string; spelling variants of the same company are not merged.Because the same contract_amount figure can appear on more than one notice over a contract's life (for example a Notice of Intent, an Award, and a related hearing), monthly totals track published award notices, not deduplicated contract obligations. Treat the trend lines as a read on what the City Record is publishing, not an audited accounting of city spending.
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 three Node scripts in the repository: fetch-daily.mjs (pulls the day's notices, applies the flagging rules, writes data/YYYY-MM-DD.json), build-trends.mjs (rebuilds the data/trends.json aggregate behind the Trends tab) and generate-feeds.mjs (rebuilds RSS feeds). All run on a daily schedule via GitHub Actions.