NYC OATH Hearings - Administrative Tribunal Case Records avatar

NYC OATH Hearings - Administrative Tribunal Case Records

Pricing

from $0.03 / 1,000 nyc oath hearing records

Go to Apify Store
NYC OATH Hearings - Administrative Tribunal Case Records

NYC OATH Hearings - Administrative Tribunal Case Records

NYC OATH administrative tribunal cases (public open data, 22M cases): issuing agency, violation date and location, hearing / decision dates, outcome, fines and compliance status, plus up to ten charge slots. Filter by agency, result, borough or date.

Pricing

from $0.03 / 1,000 nyc oath hearing records

Rating

0.0

(0)

Developer

Wenhao Yang

Wenhao Yang

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Every case filed with the New York City Office of Administrative Trials and Hearings, 22,054,337 of them, each one a summons that a City agency issued and OATH then adjudicated.

OATH is where the City's own enforcement ends up when it is contested. More than twenty agencies bring cases here - Buildings, the Fire Department, Health, Sanitation, Transportation, Environmental Protection, Parks and the Sheriff among them. The register is the tribunal's own record of what happened to each one: what was charged, when it was heard, how it came out, and what it cost.

It is one of the largest administrative-adjudication corpora published anywhere: what each agency charged, how the tribunal resolved it, and what it cost.

Low cost

From $0.00005 per record, down to $0.00003 at Gold Pay-per-event: you are charged per record delivered, and nothing for the query.

What you get

FieldMeaning
ticketNumberThe case. Unique across all 22,054,337 rows
agencyWho issued it - SANITATION OTHERS 3,664,194 / DOS - ENFORCEMENT AGENTS 3,399,351 / TAXI_TLC 2,913,014 / DEPT. OF BUILDINGS 1,407,418 and 188 more
violationDate / violationTimeWhen the violation is alleged to have occurred
violationDescription / violationDetailsWhat the case is about, in the agency's own words
borough / block / lot / houseNumber / street / zipWhere
respondentLastName / respondentAddressHouse / respondentAddressZipWho was summoned, and where the notice was served
hearingDate / hearingTime / hearingLocation / hearingStatusThe hearing
decisionDate / hearingResult / complianceStatusHow it came out, and whether the terms were met
totalViolationAmount / penaltyImposed / paidAmount / additionalPenaltiesOrLateFees / balanceDueThe money
charge1Code charge10Code, each with Section, Description and InfractionAmountUp to ten charges per case, each with its own code, citation section, plain description and the amount that charge carries

Modes

  • rows (default) - cases matching your filters.
  • aggregate - one count row per group: by agency, hearing result, hearing status, compliance status or borough.

Example inputs

Everything one agency brought - agency is a substring match on the issuing agency.

{ "agency": "DEPT. OF BUILDINGS", "maxResults": 100 }

One respondent - respondent matches the last name, so an owner entity or a surname finds its cases.

{ "respondent": "REALTY", "maxResults": 100 }

Cases that ended in an admission - hearingResult takes the exact published value, never a substring.

{ "hearingResult": "ADMIT IN-VIO", "maxResults": 100 }

How one agency's cases resolved - mode=aggregate returns one row per group, every group.

{ "agency": "SANITATION OTHERS", "mode": "aggregate", "groupBy": "hearingResult" }

Two things you need to know before you rely on a field

The outcome column is free text typed by clerks, and it shows. hearingResult holds 74 distinct values, most of them the same few outcomes written differently:

IN VIOLATION 2,988,502 ADMIT IN-VIO 142,664
DEFAULTED 2,631,648 ADMIT/IN-VIO 408
WRITTEN OFF 2,428,892 POP IN-VIOL 90,490
DISMISSED 1,727,426 POP/IN-VIOL 7,436

IN VIOLATION and ADMIT IN-VIO and ADMIT/IN-VIO are three different strings, and Dismissed Defective Service, Dismissed - Other Reasons and Dismissed No Violation/On the Merits are three more. A filter for "dismissed" that matches on text will silently merge outcomes that the tribunal treats as distinct, so this actor matches the exact published value and lists all 74 for you to choose from. 'Sustained' and 'SUSTAINED' both exist, 275,611 and 358,241 rows apart.

41% of cases have no outcome recorded - 9,100,169 of them. The source does not store the key at all for these, so they come back with an empty hearingResult. Most are filed and not yet decided and carry no decisionDate either, but 1.8M of them do have a decision date with no outcome string written against it. When you filter by outcome you are asking about the subset that has one; the default listing returns the cases that carry a decision date.

Why there is no year aggregate

Every other dimension here aggregates to a sane number of groups. The dates do not, and the reason is worth stating plainly.

Nothing validates the date columns on entry, so clerical error has accumulated for two decades:

  • violationDate runs to 5201-05-12
  • hearingDate runs to 9999-10-14
  • decisionDate runs to 9997-05-19
  • date_extract_y(decision_date) yields 1,213 distinct "years" - including 123, 196, 204 and 217

A "cases by year" chart built on this column would be mostly typos. So date dimensions are not offered as aggregates. The date filters are bounded instead: a range is capped at 30 days past today, so a year-5201 record can never head a "most recent" result. The record fields themselves are delivered exactly as stored - the filter is bounded, the data is not rewritten.

Source

Counts below are a live snapshot - the register is rebuilt daily, so exact figures move between reads. The order of magnitude and the ratios are stable.

New York City Office of Administrative Trials and Hearings, published on data.cityofnewyork.us as OATH Hearings Division Case Status - public open data, no login and no key. The register is 74 columns wide, which is mostly the ten charge slots: each carries a code, a citation section, a description and an infraction amount, and most cases use only the first one or two.

Output

Every record carries the same key set regardless of mode - the case fields plus the aggregate columns (groupKey, groupCount, groupBy), which are "" outside aggregate mode. Every record carries sourceUpdatedAt, the date the City last rebuilt the register.

  • NYC DOB Permits - the building permits whose violations end up before this tribunal.
  • Philadelphia L&I Violations - the same shape of enforcement record for Philadelphia.

Example output

One case - ticketNumber=049748060H. Every record carries the case fields plus the aggregate columns (groupKey, groupCount, groupBy), which are "" outside aggregate mode:

{
"platform": "nyc-oath-hearings",
"source": "nyc-oath-case-status",
"mode": "rows",
"groupKey": "", "groupCount": "", "groupBy": "",
"ticketNumber": "049748060H",
"violationDate": "2026-05-06T00:00:00.000",
"violationTime": "18:50:00",
"violationDescription": "", "violationDetails": "20260804N",
"agency": "SANITATION POLICE",
"respondentLastName": "1025 BOYNTON AVENUEREALTY LLC",
"respondentAddressHouse": "1025", "respondentAddressZip": "10472", "respondentAddressBorough": "BRONX",
"respondentFacilityNumber": "",
"borough": "BRONX",
"block": "03714", "lot": "0054",
"houseNumber": "1025", "street": "BOYNTON AVENUE", "floor": "", "city": "BRONX", "zip": "10472", "state": "NEW YORK",
"hearingStatus": "HEARING COMPLETED",
"hearingResult": "DISMISSED",
"hearingLocation": "SAU: BX 2",
"hearingDate": "2026-08-04T00:00:00.000", "hearingTime": "08:30:00",
"decisionBorough": "ONE-CLICK", "decisionDate": "2026-09-21T00:00:00.000",
"totalViolationAmount": "50", "penaltyImposed": "0", "paidAmount": "0",
"additionalPenaltiesOrLateFees": "0", "balanceDue": "0",
"complianceStatus": "All Terms Met",
"judgmentDocketedDate": "",
"charge1Code": "AS06", "charge1CodeSection": "A.C.", "charge1CodeDescription": "DIRTY SIDEWALK", "charge1InfractionAmount": "50",
"charge2Code": "", "charge2CodeSection": "", "charge2CodeDescription": "", "charge2InfractionAmount": "",
"charge3Code": "", "charge3CodeSection": "", "charge3CodeDescription": "", "charge3InfractionAmount": "",
"charge4Code": "", "charge4CodeSection": "", "charge4CodeDescription": "", "charge4InfractionAmount": "",
"charge5Code": "", "charge5CodeSection": "", "charge5CodeDescription": "", "charge5InfractionAmount": "",
"charge6Code": "", "charge6CodeSection": "", "charge6CodeDescription": "", "charge6InfractionAmount": "",
"charge7Code": "", "charge7CodeSection": "", "charge7CodeDescription": "", "charge7InfractionAmount": "",
"charge8Code": "", "charge8CodeSection": "", "charge8CodeDescription": "", "charge8InfractionAmount": "",
"charge9Code": "", "charge9CodeSection": "", "charge9CodeDescription": "", "charge9InfractionAmount": "",
"charge10Code": "", "charge10CodeSection": "", "charge10CodeDescription": "", "charge10InfractionAmount": "",
"sourceUpdatedAt": "2026-09-23"
}

mode=aggregate, groupBy=hearingResult - one row per outcome, exact string for exact string:

IN VIOLATION 2,988,502
DEFAULTED 2,631,648
WRITTEN OFF 2,428,892
DISMISSED 1,727,426

Cases that ended in an admission - hearingResult=ADMIT IN-VIO:

H2 11.29 See Attached NOV

What the tribunal decided this year - mode=aggregate, groupBy=agency:

(blank) 3,759,126
SANITATION OTHERS 3,664,194
DOS - ENFORCEMENT AGENTS 3,399,351
TAXI_TLC 2,913,014
DEPT. OF BUILDINGS 1,407,418
FIRE DEPARTMENT OF NYC 955,594

Compliance follow-through - mode=aggregate, groupBy=complianceStatus:

(blank) 9,945,943
All Terms Met 9,834,617
Penalty Due 1,529,535
Compliance Due 549,711
Both Due 194,531