NYC Open Data field reference
Dataset ids, query conventions and field names for the eleven NYC Open Data (Socrata) datasets Complied ingests, with how each field lands in public_events or buildings. For engineers writing or debugging a feed; architecture and scheduling are in ingestion. Column lists were checked against each dataset's live metadata.
Query conventions
Every dataset is a Socrata endpoint:
https://data.cityofnewyork.us/resource/<DATASET_ID>.json?<SoQL>
- Page with
$limit(50,000 in the pipeline),$offsetand a stable$order(:id, or a unique column). Loop until a page is shorter than the limit. $where,$selectand$orderare the filter, projection and sort.count(*)($select=count(*) as n) sizes a backfill window.- Send the app token as
X-App-Tokenor$$app_token(NYC_OPEN_DATA_TOKEN) for higher rate limits. - The hidden
:updated_atsystem field supports incremental pulls where the publisher updates a few rows per night:$where=:updated_at > '<floating timestamp>'. It is only usable when each nightly stamp touches only the rows that changed; check with$select=:updated_at, count(*) … $group=:updated_at. DOB complaints is replaced wholesale each night (every row shares one stamp), so it uses a status-and-dates filter instead. Only small datasets are pulled in full. - Date shapes differ.
timestampcolumns are floating timestamps (2020-01-01T00:00:00). DOB violations and ECB use compactYYYYMMDDtext, and the literal string"0"(or an impossible date such as month 20) means "no date". DOB complaints usesMM/DD/YYYYtext, which does not sort, so no>=range works on it.sanitizeCompactDate,sanitizeMdyDate,toDayStringandparseDayinfeeds/dates.tsparse them, andmdyRangeClauseinfeeds/socrata.tswrites theMM/DD/YYYYbackfill windows. - Every normalized event carries
agency,event_type, asource_idprefixed by the feed,status_norm(OPEN,CLOSED,DISMISSED), and an optionalstatus_detailin the agency's own vocabulary. The whole source row is kept only for quarantined rows (unlinked_events.raw_data);public_eventskeeps no copy of it: the Source record panel fetches the row live from NYC Open Data. HPD violations, ECB and OATH also fill promoted columns (class, certify-by, penalty, balance, hearing result and so on); which source field feeds each is in ingestion: promoted fields.
| Feed | Dataset | Id | agency | source_id | Update mode |
|---|---|---|---|---|---|
hpd-violations | Housing Maintenance Code Violations | wvxf-dwi5 | hpd | hpd-violation:<violationid> | Incremental |
hpd-complaints | HMC Complaints and Problems | ygpa-z7cr | hpd | hpd-complaint:<complaint_id> | Incremental |
hpd-litigation | Housing Litigations | 59kj-x8nc | hpd | hpd-litigation:<litigationid> | Full pull |
dob-violations | DOB Violations | 3h2n-5cm9 | dob | dob-violation:<number> | Incremental |
dob-complaints | DOB Complaints Received | eabe-havv | dob | dob-complaint:<complaint_number> | Active + recent dates |
ecb-violations | DOB ECB Violations | 6bgk-3dad | ecb_oath | ecb-violation:<ecb_violation_number> | Incremental |
oath-hearings | OATH Hearings Division Case Status | jz4z-kudi | fdny, dsny, dohmh | oath-hearing:<ticket_number> | Incremental |
nyc-311 | 311 Service Requests from 2020 to Present | erm2-nwe9 | dep, dsny, fdny, dot | 311:<unique_key> | Incremental |
dof-liens | Tax Lien Sale Lists | 9rz4-mjek | dof | dof-lien:<bbl> | Weekly full pull |
| Layer 1 | BUILDING (footprints) | 5zhs-2jue | Manual | ||
| Layer 1 | PLUTO | 64uk-42ks | Manual |
The enforcement event feeds and the record feeds (see ingestion: record feeds). The event feeds run in the nightly delta and in the weekly full sync; the record feeds only in the weekly full sync (ingest records). ingest sample loads the newest N rows of any of them. The building key is what resolution uses; most also carry an address.
| Feed | Dataset | Id | Writes | source_id | Building key |
|---|---|---|---|---|---|
hpd-vacate-orders | Order to Repair/Vacate Orders | tb8q-a3ar | event vacate_order | hpd-vacate:<vacate_order_number> | bin, bbl |
hpd-aep | Buildings Selected for the AEP | hcir-3275 | event aep_selection | hpd-aep:<building_id>:<aep_round> | bin, bbl |
hpd-omo-charges | Open Market Order (OMO) Charges | mdbu-nrqn | event emergency_repair_omo | hpd-omo:<omoid> | bin, bbl |
hpd-hwo-charges | Handyman Work Order (HWO) Charges | sbnd-xujn | event emergency_repair_hwo | hpd-hwo:<hwoid> | bin, bbl |
dob-safety-violations | DOB Safety Violations | 855j-jady | event dob_safety:<program>; rows carried over from BIS (number starts with a MMDDYY date) skipped, dob-violations has them | dob-safety-violation:<violation_number> | bin, bbl |
fdny-vacates | NYC Fire Department Building Vacate List | n5xc-7jfa | event fdny_vacate | fdny-vacate:<bin>:<vac_date> | bin, bbl |
dohmh-rodent-inspections | Rodent Inspection | p937-wjvj | event rodent_inspection, one per job | dohmh-rodent:<job_id> (a row with no job: <bbl>:<day>:<inspection_type>) | bin; bbl, else from boro_code/block/lot |
dot-sidewalk-violations | DOT sidewalk violations | 6kbp-uz6m | event sidewalk_violation | dot-sidewalk:<violationid> | BBL only: bblid looked up in DOT's lot table i642-2fxq |
hpd-registrations | Multiple Dwelling Registrations | tesw-yqqr | filing hpd_registration | hpd-registration:<registrationid>:<buildingid> | bin; BBL from boroid/block/lot |
hpd-registration-contacts | Registration Contacts | feu5-w2e2 | party (staff only) | hpd-contact:<registrationcontactid> | none: registrationid |
hpd-bedbug-reports | Bedbug Reporting | wz6d-d3jb | filing hpd_bedbug_report | hpd-bedbug:<building_id> (latest period) | bin, bbl |
hpd-conh | CONH Pilot Building List | bzxi-2tsw | designation conh_pilot | hpd-conh:<building_id> | bin, bbl |
dob-elevators | DOB NOW Elevator Safety Compliance | e5aq-a4j2 | asset per device; filings elevator_periodic/_cat1/_cat5 | dob-elevator:<device_number>[:<kind>] | bin, bbl |
dob-boilers | DOB NOW: Safety Boiler | 52dp-yji6 | asset boiler; filing boiler_inspection | dob-boiler:<boiler_id> (asset) / dob-boiler:<boiler_id>:inspection (latest report) | bin_number only |
dob-facades | DOB NOW: Safety – Facades Compliance Filings | xubg-57si | filing fisp | dob-fisp:<bin> (latest report) | bin; BBL from borough/block/lot |
ll84-benchmarking | LL84 Energy and Water Data Disclosure, 2023 to present | 5zyy-y8am | filing ll84_benchmarking per building | ll84:<property_id> (latest year) | nyc_building_identification and nyc_borough_block_and_lot, both ; lists |
dohmh-cooling-towers | NYC Cooling Tower Registrations | y4fw-iqfr | asset cooling_tower | dohmh-cooling-tower:<system_id> | bin, bbl |
dohmh-water-tanks | Self-Reported Drinking Water Tank Inspection Results | gjm4-k24g | asset water_tank; filing water_tank_inspection | dohmh-water-tank:<bin>:<tank_num> (asset) / …:report (latest year) | bin, bbl |
dob-now-permits | DOB NOW: Build – Approved Permits | rbx6-tga4 | filing work_permit | dob-now-permit:<work_permit> | bin; bbl, else from borough/block/lot |
dob-bis-permits | DOB Permit Issuance | ipu4-2q9a | filing work_permit | dob-bis-permit:<job__>:<job_doc___>:<permit_type>:<permit_subtype> | bin__; bbl, else from borough/block/lot |
dob-certificates-of-occupancy | DOB certificates of occupancy (BIS and DOB NOW) | bs8b-p36w + pkdm-hqz6 | filing certificate_of_occupancy | dob-co:<job> | bin_number (bs8b-p36w) or bin; bbl, else from borough/block/lot |
dob-elevator-details | DOB NOW elevator device details | juyv-2jek | filing elevator_device_details, grouped by device_id | dob-elevator-details:<device_id> | none: the device, as dob-elevators loaded it |
dohmh-cooling-tower-inspections | Cooling tower inspections | f9wb-g8mb | filing cooling_tower_inspection, grouped by system_id, one per inspection | dohmh-cooling-tower-inspection:<system_id>:<day> | bin, bbl |
dohmh-water-tank-results | Drinking water tank inspection results | rytv-g5ui | filing water_tank_compliance, grouped by bin | dohmh-water-tank-result:<bin>:<year>:<activity> | bin, bbl |
dep-boiler-permits | DEP boiler permits (CATS) | f4rp-2kvy | filing dep_boiler_permit | dep-cats:<applicationid> | bin; BBL from borough/block/lot |
hpd-jurisdiction | Buildings Subject to HPD Jurisdiction | kj4p-ruqc | designation hpd_jurisdiction | hpd-jurisdiction:<buildingid> | bin; BBL from boroid/block/lot |
dof-exemptions | DOF property exemptions | muvi-b6kx | filing tax_exemption, grouped by lot (parid) or condo | dof-exemption:<lot or condo>:<code> | BBL only; condo units via the billing lot in p8u6-a6it |
dof-abatements | DOF property abatements | rgyu-ii48 | filing tax_abatement, grouped by lot (parid) or condo | dof-abatement:<lot or condo>:<code> | BBL only; condo units via the billing lot in p8u6-a6it |
fdny-mandatory-inspections | FDNY mandatory inspections | kfgh-h6re | filing fdny_inspection | fdny-mandatory-inspection:<insptn_ops_detail> | bldg_current_bin, bbl |
fdny-risk-inspections | FDNY risk-based inspections (RBIS) | itd7-gx3g | filing fdny_inspection | fdny-risk-inspection:<insptn_ops_detail> | bldg_current_bin_fk, bbl |
fdny-building-summary | FDNY Bureau of Fire Prevention building summary (historical, 2019) | nvgj-hbht | asset sprinkler, asset standpipe | fdny-building-summary:<bin>:<system> | bin, bbl |
Quirks found sampling these (2026-10-08): a boiler inspection_date of 01/01/1900 means not yet inspected; new-boiler registrations (report_type BNR) have no boiler_id; the bedbug dataset repeats some rows verbatim; DOB uses 1000000 to 5000000 as "BIN unknown".
HPD violations, wvxf-dwi5
Housing Maintenance Code violations, including the lead orders. Filter by bin; page by violationid; backfill window on novissueddate.
Columns: violationid, buildingid, registrationid, boroid, boro, housenumber, lowhousenumber, highhousenumber, streetname, streetcode, zip, apartment, story, block, lot, class, inspectiondate, approveddate, originalcertifybydate, originalcorrectbydate, newcertifybydate, newcorrectbydate, certifieddate, ordernumber, novid, novdescription, novissueddate, currentstatusid, currentstatus, currentstatusdate, novtype, violationstatus, rentimpairing, latitude, longitude, communityboard, councildistrict, censustract, bin, bbl, nta.
| Field | Meaning and mapping |
|---|---|
violationid | Unique id; source_id. |
bin, boroid + block + lot | Resolution keys: BIN, then a BBL composed as borough + 5-digit block + 4-digit lot. |
class | Severity A, B, C, or I. Used as citation_code when there is no order number. |
ordernumber | HPD order code; citation_code. Lead orders: 616 presumed lead, 617 lead hazard, 618 RPO filing (child at risk), 619 RPO annual certification, 620 RPO turnover certification, 621 turnover abatement, 622 turnover certification failure, 623 turnover clearance failure, 624 inconclusive XRF, 625 turnover notice failure, 626 child blood lead. These become event_type; any other order is violation. |
novdescription | Notice text; description. |
approveddate, novissueddate | issued_date (approved date preferred). |
newcorrectbydate, originalcorrectbydate | due_date: the new date if present, else the original. |
certifieddate | Set when the owner certified correction; used for overdue logic and as closed_date when not open. |
currentstatusid, currentstatus, violationstatus | Status. The id is authoritative (see below); the text and violationstatus are fallbacks. |
apartment | Unit label; linked to units at persist time, subject to the creatable-label guard. |
Status ids map to status_detail: 1 OPEN; 2 OPEN_NOV_SENT; 3 OPEN_CERTIFIED_ON_TIME; 4 OPEN_CERTIFIED_LATE; 6 OPEN_POSTPONEMENT_GRANTED; 7 OPEN_POSTPONEMENT_DENIED; 8 OPEN_FALSE_CERT; 10 OPEN_CIV14_MAILED; 11 OPEN_WILL_BE_REINSPECTED; 20 OPEN_DEFECT_LETTER; 21 OPEN_NOT_COMPLIED; 22 and 23 OPEN_NO_ACCESS_1ST / _2ND; 24 OPEN_REOPENED; 27 OPEN_INFO_NOV_SENT; 28 OPEN_INVALID_CERT; 36 OPEN_PARTIAL_ACCESS (all OPEN); 19 is CLOSED; 9 is DISMISSED. Nothing about the deadline is stamped into status_detail: whether a row is overdue is computed when read, by one rule (domain/src/violations/deadlineRule.ts). Rows synced before October 2026 may still end in _OVERDUE until they are synced again; every reader ignores that suffix. Unrecognised ids fall back to violationstatus, then keyword matching on currentstatus, then plain OPEN.
HPD complaints and problems, ygpa-z7cr
One row per complaint problem. Page by complaint_id; backfill window on received_date (the one date every row carries; complaint_status_date is null while open). Rows carry bin and bbl.
Columns: received_date, problem_id, complaint_id, building_id, borough, house_number, street_name, post_code, block, lot, apartment, community_board, unit_type, space_type, type, major_category, minor_category, problem_code, complaint_status, complaint_status_date, problem_status, problem_status_date, status_description, problem_duplicate_flag, complaint_anonymous_flag, unique_key, latitude, longitude, council_district, census_tract, bin, bbl, nta.
| Field | Mapping |
|---|---|
complaint_id | source_id. |
bin | Resolution key. |
type, else major_category | event_type (fallback housing_complaint). |
major_category, minor_category | description, joined with " - ". |
complaint_status | Status: contains CLOSE, RESOLVED or COMPLETED is CLOSED; OPEN, PENDING or ACTIVE is OPEN; anything else is OPEN with detail UNKNOWN. |
received_date, complaint_status_date | issued_date; closed_date when not open. |
apartment | Unit label. |
HPD litigation, 59kj-x8nc
Housing-court cases against owners. Full pull each run; filterable by bin or bbl.
Columns: litigationid, buildingid, boroid, housenumber, streetname, zip, block, lot, casetype, caseopendate, casestatus, casejudgement, findingofharassment, findingdate, penalty, respondent, latitude, longitude, community_district, council_district, census_tract, bin, bbl, nta.
Mapping: litigationid is source_id; casetype is event_type and citation_code; caseopendate is issued_date; casestatus containing DISMISS is DISMISSED, containing CLOSED is CLOSED, otherwise OPEN; description appends "judgement entered" when casejudgement is YES. Resolves by bin, then bbl.
DOB violations, 3h2n-5cm9
Dates are compact YYYYMMDD text with "0" as no date. Backfill window on issue_date.
Columns: isn_dob_bis_viol, boro, bin, block, lot, issue_date, violation_type_code, violation_number, house_number, street, disposition_date, disposition_comments, device_number, description, ecb_number, number, violation_category, violation_type.
Mapping: source_id uses number; event_type is violation_category; citation_code is violation_type; issue_date is issued_date; disposition_date is closed_date. Status: a dismiss keyword in category is DISMISSED; a disposition date or a "resolved" category is CLOSED; otherwise OPEN. Resolves by bin.
DOB complaints, eabe-havv
Replaced wholesale each night: all 3.1M rows share one :updated_at, :created_at and dobrundate (checked 2026-09-30), so no Socrata field says what changed. Only about 21k rows are ACTIVE; the rest are CLOSED. The nightly delta is status = 'ACTIVE' plus any row whose date_entered, inspection_date or disposition_date falls from 14 days before the watermark through today. All three dates are MM/DD/YYYY text, so the backfill windows on date_entered with LIKE / IN patterns; impossible values such as 20/22/2022 become null dates.
Columns: complaint_number, status, date_entered, house_number, house_street, zip_code, bin, community_board, special_district, complaint_category, unit, disposition_date, disposition_code, inspection_date, dobrundate.
Mapping: complaint_number is source_id; complaint_category is event_type and citation_code; date_entered is issued_date; disposition_date is closed_date. Status from status and disposition date: dismiss keyword is DISMISSED, a disposition date or "clos" / "resolved" is CLOSED, otherwise OPEN. Resolves by bin.
ECB violations, 6bgk-3dad
The money and hearings feed. Compact YYYYMMDD dates with "0" as no date. Backfill window on issue_date.
Columns: isn_dob_bis_extract, ecb_violation_number, ecb_violation_status, dob_violation_number, bin, boro, block, lot, hearing_date, hearing_time, served_date, issue_date, severity, violation_type, respondent_name, respondent_house_number, respondent_street, respondent_city, respondent_zip, violation_description, penality_imposed (sic), amount_paid, balance_due, infraction_code1 to infraction_code10 with section_law_description1 to 10, aggravated_level, hearing_status, certification_status.
Mapping: ecb_violation_number is source_id; violation_type is event_type and citation_code; issue_date is issued_date; hearing_date is due_date; violation_description is description. Status: ecb_violation_status = RESOLVE is CLOSED, or DISMISSED when hearing_status says dismissed or vacated; ACTIVE is OPEN (a passed hearing is not stamped: the app shows it as "hearing passed", computed when read); otherwise hearing_status decides. The map reads the hearing date (due_date) and the promoted agency_status_text (hearing_status) and balance_due columns. Resolves by bin.
OATH hearings, jz4z-kudi
Tickets from all issuing agencies; the feed excludes issuing_agency LIKE '%BUILDINGS%' (DOB tickets arrive through ECB). Backfill window on violation_date, not hearing_date, which is null until a hearing is scheduled. :updated_at is a real per-row stamp, except that the city occasionally republishes the whole dataset under one stamp (2026-10-09 00:25 UTC, 20.8M rows); the delta skips such a stamp.
Columns: ticket_number, violation_date, violation_time, issuing_agency, respondent_last_name, balance_due, violation_location_borough, violation_location_block_no, violation_location_lot_no, violation_location_house, violation_location_street_name, violation_location_floor, violation_location_city, violation_location_zip_code, violation_location_state_name, respondent address columns, hearing_status, hearing_result, scheduled_hearing_location, hearing_date, hearing_time, decision columns, total_violation_amount, violation_details, date_judgment_docketed, penalty_imposed, paid_amount, additional_penalties_or_late_fees, compliance_status, violation_description, and charge_1_* to charge_10_* (code, section, description, infraction amount).
Mapping: ticket_number is source_id; issuing_agency chooses agency per row (FIRE is fdny; SANITATION, RECYCLING or POLICE is dsny; DOHMH, DOH or HEALTH is dohmh; anything else is skipped); event_type is oath_hearing; violation_date is issued_date; hearing_date is due_date. Status: dismissal or vacatur in hearing_result / compliance_status is DISMISSED; "closed", "paid in full", "satisfied", a settled balance, or paid in full is CLOSED, and so is "All Terms Met" unless a balance is still due; otherwise OPEN. Resolution keys are the BBL composed from violation_location_borough (borough names, STATEN IS for Staten Island), violation_location_block_no and _lot_no, then the house number and street plus borough, the lowest-confidence tier. Block 00000 and lot 0000 are blanks and NOT NYC has no borough code, so those rows resolve by address only (#93).
311 service requests, erm2-nwe9
Filtered to agency IN ('DEP','DSNY','FDNY','DOT'). HPD and DOB requests are the same problems ygpa-z7cr and eabe-havv carry as complaints (HPD's unique_key is the 311 number), so they are left out. Resolution keys are bbl, then incident_address plus borough when bbl is blank (#93). The dataset updates several times a day. Backfill window on created_date (default window 7 days, the densest feed).
Columns include: unique_key, created_date, closed_date, agency, agency_name, complaint_type, descriptor, descriptor_2, location_type, incident_zip, incident_address, street_name, cross_street_1, cross_street_2, address_type, city, status, due_date, resolution_description, resolution_action_updated_date, community_board, council_district, police_precinct, bbl, borough, coordinates, latitude, longitude, location, and channel, park, vehicle, taxi and bridge columns that the pipeline does not read.
Mapping: unique_key is source_id; the agency code maps to the lowercase agency id; complaint_type is event_type; created_date and closed_date are issued_date and closed_date; descriptor is description. Status: closed_date set or status "closed" is CLOSED; "cancel" is DISMISSED (detail CANCELLED); otherwise OPEN. Resolution keys are incident_address plus borough.
DOF tax lien sale list, 9rz4-mjek
The lots DOF noticed for a tax lien sale: one row per lot per list (cycle: 90, 60, 30, 10 Day Notice, Final Sale; spelled "Days" in 2020) and month, with no amounts. Sale years so far: 2019, 2020, 2021, 2025; last published 2025-06. A lot can appear up to 19 times.
Columns: month, cycle, borough, block, lot, tax_class_code, building_class, community_board, council_district, house_number, street_name, zip_code, water_debt_only.
Mapping: one event per lot. A 10-digit BBL is composed from borough, block, lot and is both the resolution key and the source_id (dof-lien:<bbl>). The lot's newest list (latest month) gives status_detail and agency_status_text (its cycle); its first list is issued_date. OPEN while that newest list is in the dataset's newest sale year, CLOSED otherwise. event_type is tax_lien, or tax_lien_water_debt when water_debt_only is YES; description names the newest list, the sale years and the building class or address. A row with no BBL is skipped.
Building footprints, 5zhs-2jue
Layer 1 identity source: one row per building.
Columns: the_geom, name, bin, doitt_id, shape_area, base_bbl, objectid, construction_year, feature_code, geom_source, ground_elevation, height_roof, last_edited_date, last_status_type, mappluto_bbl, shape_length.
| Field | Use |
|---|---|
bin | The building's identity; a row without one is dropped. |
mappluto_bbl, else base_bbl | Tax lot for the PLUTO join (10 digits). |
construction_year | Year built fallback when PLUTO has none. |
PLUTO, 64uk-42ks
Tax-lot facts; 108 columns, of which the pipeline reads bbl, address, borough, zipcode, latitude, longitude, yearbuilt and unitstotal. PLUTO's bbl is a decimal string (for example 4087860042.00000000), truncated and left-padded to 10 digits. PLUTO has no BIN, and one lot can hold several buildings, so a footprint row is joined to its lot's facts on BBL: yearbuilt becomes buildings.year_built and unitstotal the unit count. A footprint with no PLUTO match still becomes a buildings row, without address and year facts.
Field-name gotchas
penality_imposedin ECB is misspelled in the source.- DOB and ECB use
"0"for no date, and DOB contains impossible dates. - HPD violation status text is unreliable; use
currentstatusid. - Datasets that expose a BBL do not all format it alike: HPD violations compose it from
boroid,block,lot; PLUTO's is decimal; Footprints' is already 10 digits.