← Back to digest

Methodology

How City Record Digest selects, flags, and presents NYC government notices.

Data source

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.

How a notice gets flagged

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:

Flagging rules

CodeRuleTier
EXEC_ORDERTitle contains "executive order"Notable
EXEC_ORDER_EMERGENCYExecutive order with "emergency" in titleNotable
CEQRSpecial Materials notice naming CEQR, rezoning, or environmental reviewNotable
CONCEPT_PAPERSpecial Materials concept paper (pre-procurement signal)Notable
SPECIAL_MATERIALSOther Special Materials, except routine fuel/LL63/monthly indexNotable
BIG_CONTRACTContract amount ≥ $1,000,000 (in contract_amount or extracted from body)Notable
AGENCY_RULESection = Agency RulesNotable
PROP_DISPSection = Property DispositionNotable
COURTSection = Court NoticesNotable
AWARD_HEARINGSection = Contract Award HearingsNotable
EMERGENCY"emergency procurement / contract / declaration / order" anywhere in title or bodyNotable
SETTLEMENT"settlement", "stipulation of settlement", "class action settlement"Notable
BOND"bond issuance / sale / series / anticipation"Notable
LAND_USEULURP or landmark designation / hearing / preservationNotable
OVERSIGHTConsent decree or court-appointed / independent / federal monitorNotable
KEY_AGENCYAgency matches: NYCHA, HPD, NYPD, DOE, DOC, DHS, ACS, OMB, MOCJ, City Planning, Mayor's OfficeNotable
SOLE_SOURCESelection method or body text contains "sole source", "negotiated acquisition", "non-competitive", "single source"Notable
POLICY_TERMBody or title mentions: shelter, jail, Rikers, rezoning, affordable housing, charter school, homelessness, eviction, supportive housing, mental health, opioid, overdose, gun violence, youth programNotable
BIG_CONSTRUCTION≥ $500K AND keywords: construction, infrastructure, capital, renovation, repairWatching
ENV_HEALTH_HEARINGHearing/meeting on environment, health, water, air quality, lead, asbestos, climateWatching
HUMAN_SERV_RENEWALExtension/renewal/amendment in Human Services categoryWatching
CONSULTING≥ $100K AND keywords: consulting, lobbying, communications, PR, advertisingWatching

Personnel notices

"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.

Routine Special Materials

Three categories of Special Materials are intentionally excluded because they are repetitive and rarely newsworthy:

Visual hierarchy

Trailing 30-day baseline

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.

Filters and URL state

Filter chips reflect in the URL as query parameters: ?agency=…&reason=…&type=…&min=…&deadline=…&date=…. Any filtered view is shareable as a direct link.

Limitations

Reproducing the digest

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.