NY DMV Traffic Tickets - Violations & Enforcement Data
Pricing
from $0.03 / 1,000 ny dmv ticket records
NY DMV Traffic Tickets - Violations & Enforcement Data
New York DMV adjudicated traffic tickets (public open data, 13.4M tickets, 2022-2026): charged code and description, year/month/weekday, driver age and gender, licence state, police agency and court. No names, addresses or plates.
Pricing
from $0.03 / 1,000 ny dmv ticket records
Rating
0.0
(0)
Developer
Wenhao Yang
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Every traffic and parkway violation the New York State Department of Motor Vehicles has adjudicated and closed out, 13,402,132 tickets, covering 2022 through 2026.
Both of the DMV's enforcement streams are in here: the regular court disposition stream (TSLED, 10,089,197 tickets) and the New York City and Rochester Traffic Violations Bureau administrative stream (TVB, 3,312,935).
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
| Field | Meaning |
|---|---|
violationCode / violationDescription | What was charged - 1180D "SPEED IN ZONE" 1,565,830 / 5091 853,170 / 1110A "DISOBEYED TRAFFIC DEVICE" 844,218 / 306B "UNINSPECTED MOTOR VEHICLE" 827,665 and 1,017 more codes |
violationYear / violationMonth / violationWeekday | When |
ageAtViolation / gender | The driver, as recorded - age, and M 9,817,676 / F 3,269,088 / C 203,913 / U 111,455 |
licenseState | Where the licence was issued - NEW YORK 10,572,397 / NEW JERSEY 381,709 / PENNSYLVANIA 218,174 / CONNECTICUT 167,948 and 66 more |
policeAgency | Who wrote it - 902 agencies, from NEW YORK CITY POLICE DEPARTMENT 3,266,421 down to village departments |
court | Where it was disposed of - 1,392 courts, including the TVB bureaus (Bronx TVB 512,157 / Brooklyn South TVB 493,086) and county traffic agencies |
source | Which stream - TSLED or TVB |
Modes
rows(default) - tickets matching your filters.aggregate- one count row per group: by year, month, weekday, driver gender or enforcement stream.
Example inputs
One violation code - code is a substring match on the charged code, so 1180D is speeding in a zone.
{ "code": "1180D", "maxResults": 100 }
One adjudication stream - source splits the court dispositions (TSLED) from the Traffic Violations Bureau (TVB).
{ "source": "TVB", "maxResults": 100 }
Young drivers on one weekday - a ageFrom / ageTo range fences out the junk ages (-1, and birth years that landed in the column) automatically.
{ "ageFrom": 16, "ageTo": 25, "weekday": "SATURDAY", "maxResults": 100 }
The register counted by year - mode=aggregate returns one row per group and every group, not a truncated top-N.
{ "mode": "aggregate", "groupBy": "year" }
Which courts handle the most - court matches the court name; mode=aggregate with groupBy=year counts them by year.
{ "court": "TVB", "mode": "aggregate", "groupBy": "year" }
What this dataset does not contain
There is no name, no address, no licence number and no plate.
A person appears in this register only as (age at the time, gender, state that issued the licence). That is not an omission on our part - the DMV publishes this file with those fields already removed, and cells small enough to identify an individual are suppressed upstream before publication.
So this is an enforcement-pattern dataset, not a person-lookup dataset. It answers questions like which violation codes are rising, how enforcement is distributed across agencies and courts, whether age or weekday correlates with violation type, and how the two adjudication streams differ. It cannot answer "has this driver been ticketed" and it cannot be joined to an individual.
Three things about the fields
The age column carries junk values. The floor is -1 and the ceiling is 2024 - a birth year has landed in the age column. 206,448 rows are recorded as zero or less and 10,863 are above 100. Every age range you supply fences those out automatically, so ageFrom=16 cannot be swamped by 'unknown' rows recorded as -1.
There is no calendar day. The source publishes a year, a month and a weekday, and nothing finer. Day-level or "last 30 days" filtering is impossible on this register and the actor does not pretend otherwise - you get a year, a month and a weekday.
Two columns are deliberately not offered as aggregates. policeAgency has 902 distinct values and court has 1,392. Both are available as filters (exact or substring), but a "top N agencies" aggregate over them would silently drop most of the tail, so neither is offered as a grouping dimension. The dimensions you can group by are all genuinely small.
The window is rolling
This is not a historical archive. The dataset's own title is "Traffic Tickets Issued: Four Year Window" - the State keeps a rolling window and drops older years as new ones arrive. Today the register covers 2022-2026:
2022 2,584,657 2025 3,020,6472023 2,851,858 2026 2,032,7742024 2,912,196
If you need a violation from 2019, it is not in the source and it is not in this actor.
Source
Counts below are a live snapshot - the register is refreshed monthly, so exact figures move between reads. The order of magnitude and the ratios are stable.
New York State Department of Motor Vehicles, published on data.ny.gov as Traffic Tickets Issued: Four Year Window - public open data, no login and no key. Note that it is refreshed monthly, not daily, unlike most registers in this series; the newest month present reflects that cadence.
Output
Every record carries the same key set regardless of mode - the ticket fields plus the aggregate columns (groupKey, groupCount, groupBy), which are "" outside aggregate mode. Every record carries sourceUpdatedAt, the date the State last rebuilt the register.
Related actors
- NYC OATH Hearings - where New York City agencies' own summonses are adjudicated.
- NYC DOB Permits - the building permits whose violations show up in that tribunal.
Example output
One ticket - code=1225C2A returns the record below. Every record carries the ticket fields plus the aggregate columns (groupKey, groupCount, groupBy), which are "" outside aggregate mode:
{"platform": "ny-dmv-tickets","source": "TVB","mode": "rows","groupKey": "", "groupCount": "", "groupBy": "","violationCode": "1225C2A","violationDescription": "OPERATING MOTOR VEHICLE WITH MOBILE PHONE","violationYear": "2025","violationMonth": "12","violationWeekday": "WEDNESDAY","ageAtViolation": "37","gender": "M","licenseState": "PENNSYLVANIA","policeAgency": "NEW YORK CITY POLICE DEPARTMENT","court": "Queens South TVB","sourceUpdatedAt": "2026-09-06"}
mode=aggregate, groupBy=source - one row per adjudication stream:
TSLED 10,089,197TVB 3,312,935
Speeding in a zone - code=1180D:
1180D | 2026 | 9 | SPEED IN ZONE | NEW YORK CITY POLICE DEPARTMENT
Violations by weekday - mode=aggregate, groupBy=weekday:
WEDNESDAY 2,110,004 SATURDAY 1,776,187THURSDAY 2,102,764 MONDAY 1,725,532TUESDAY 2,087,393 SUNDAY 1,551,489FRIDAY 2,048,763