Open data: India traffic fines, e-challan portals and RTO codes
The short answer
No key, no sign-up, no registration. Every record carries the URLs it was verified against and the date it was last checked, and every dataset below states how well sourced it actually is — measured from those same URLs, not asserted. Across those 4 datasets that is 368 official citations out of 472.
Last verified
Licence: CC BY 4.0
These datasets are published under the Creative Commons Attribution 4.0 International licence (CC BY 4.0). You may copy, redistribute, adapt and build on them, for any purpose including commercially, as long as you give credit, link to the licence, and say if you changed anything. The suggested credit line is in How to cite below.
Being precise about what that licence covers matters more than the badge. What we can
license is our own work: the selection and arrangement of these records, the verification metadata
(last_verified, the RTO verification block and its sample sizes, the scheme
status classification), and the descriptive text we wrote — descriptions, notes, step lists
and FAQ answers.
What we do not claim, and could not license to you: the underlying facts themselves. A statutory fine amount, a Motor Vehicles Act section number, the name of an RTO office, the address of a government portal — those are facts published by the government, and they are not ours. We claim no rights over any Government of India or state government publication that this data is drawn from or that it links to. That is why every record carries its own source URLs: the primary material is one click away, and you can take it from there directly.
The licence deed itself makes the same point about material we could not license in the first place: “You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.” (creativecommons.org/licenses/by/4.0/, read 19 August 2026.) This is our licensing position, not legal advice.
How to cite
Copy the line for the dataset you used:
TrafficChallan (2026). Indian traffic fine schedule (Motor Vehicles Act) [data set], version 2026-08-12. https://trafficchallan.com/api/fines.json — licensed CC BY 4.0.
TrafficChallan (2026). Indian state e-challan portal and process records [data set], version 2026-08-13. https://trafficchallan.com/api/states.json — licensed CC BY 4.0.
TrafficChallan (2026). Indian traffic challan discount and amnesty scheme tracker [data set], version 2026-08-13. https://trafficchallan.com/api/schemes.json — licensed CC BY 4.0.
TrafficChallan (2026). Indian RTO code directory [data set], version 2026-08-13. https://trafficchallan.com/api/rto-codes.json — licensed CC BY 4.0.
The version string is the dataset's newest last_verified date, which is also the
updated field in the response envelope — quote it so readers know which snapshot you
worked from.
How the endpoints respond
Every JSON endpoint returns the same envelope: updated (the newest
last_verified inside the payload), source (the human page for this data),
license, license_url, license_note, and one key holding the
records. The CSV endpoint returns a header row followed by one row per offence.
license_note travels with the payload deliberately: the envelope is what a reuser or a
dataset registry actually downloads, and the scoping in Licence above has to be
readable there too — not only on this page. It says the same thing in the same words.
All 5 endpoints send Access-Control-Allow-Origin: *, so they work from browser JavaScript.
They are static files on a CDN: there is no API key, no sign-up and no rate limit imposed by us. They are
regenerated when the site rebuilds, so poll no more often than daily — the updated field tells
you whether anything actually moved.
| Endpoint | Format | Dataset | Records | Last verified |
|---|---|---|---|---|
/api/fines.json | JSON | Fine schedule | 10 offence records | |
/api/fines.csv | CSV | Fine schedule | 10 offence records | |
/api/states.json | JSON | State e-challan records | 13 states and union territories | |
/api/schemes.json | JSON | Discount schemes and Lok Adalat dates | 16 state scheme records | |
/api/rto-codes.json | JSON | RTO code directory | 36 states and union territories |
Provenance at a glance
Counted from the sources array on every record in these datasets, at build time. “Official”
means an Indian government hostname (.gov.in or .nic.in) or one of a small set of
department-run sites on other domains that we fetched and confirmed individually — never a domain assumed
official from its suffix. Everything else counts as third-party, including reputable press.
| Dataset | Files | Citations | Official | Third-party | Official share |
|---|---|---|---|---|---|
| Fine schedule | 10 | 57 | 57 | 0 | 100% |
| State e-challan records | 13 | 249 | 249 | 0 | 100% |
| Discount schemes and Lok Adalat dates | 17 | 36 | 17 | 19 | 47% |
| RTO code directory | 36 | 130 | 45 | 85 | 35% |
The RTO directory is the outlier and we would rather you heard it here than found it yourself: most of its citations are commercial directories — insurance, used-car and vehicle-information sites — not transport departments. The detail is under that dataset below.
Fine schedule
Every traffic offence we cover under the Motor Vehicles Act, with the section that sets the penalty, the first-offence and repeat amounts as the source words them, machine-readable minimum and maximum figures, licence consequences and whether the offence can be settled online.
- Offence records: 10
- Source citations: 57
- CSV columns: 6
Last verified · the pages built from it
Endpoints
-
https://trafficchallan.com/api/fines.json— JSON · Full offence records. -
https://trafficchallan.com/api/fines.csv— CSV · Flattened, one row per offence.
Records sit under offences in the envelope.
Offence record fields (/api/fines.json)
Each entry in the offences array:
| Field | Type | Always present | What it means |
|---|---|---|---|
slug | string (fixed pattern) | Yes | URL-safe id of the offence. Also its page: /fines/{slug}/. |
name | string | Yes | Formal offence name, as the statute or the official penalty schedule words it. |
seo_name | string | Yes | The same offence in the words people search with ("Helmet Challan Fine"). A display field, not a legal name. |
target_keyword | string | Yes | The single search query the offence page is written to answer. Editorial routing — not a fact about the offence. |
mva_section | string | Yes | Motor Vehicles Act section the penalty is set by. |
description | string | Yes | Plain-English description of what the offence covers. |
base_fine_text | string | Yes | First-offence penalty exactly as the cited source states it, including any per-vehicle-class wording. |
base_fine_min | integer | Yes | Lowest rupee figure inside base_fine_text, as an integer, for sorting and calculators. |
base_fine_max | integer | Yes | Highest rupee figure inside base_fine_text. Equal to base_fine_min when the source gives a single amount. |
repeat_fine_text | string | Yes | Penalty for a second or subsequent offence, as the source states it. |
licence_impact | string | Yes | What the offence can do to the driving licence (suspension, disqualification), per the cited source. |
compoundable_online | boolean | Yes | Whether the offence can normally be settled online rather than only before a court. |
faqs | array of object {q, a} | Yes | Question-and-answer pairs published on the offence page. |
sources | array of string (URL) | Yes | Every URL the record was verified against. |
last_verified | date (YYYY-MM-DD) | Yes | The day the record was last checked against those sources. |
statute_quote | object {text, attribution} | Optional | Optional verbatim extract of the statutory text with its attribution. Verbatim only — never a paraphrase inside quotation marks. |
CSV columns (/api/fines.csv)
A flattened view of the same records — 6 columns, one row per offence, header row first:
| Field | Type | Always present | What it means |
|---|---|---|---|
slug | string (fixed pattern) | Yes | URL-safe id of the offence. Also its page: /fines/{slug}/. |
name | string | Yes | Formal offence name, as the statute or the official penalty schedule words it. |
mva_section | string | Yes | Motor Vehicles Act section the penalty is set by. |
base_fine_text | string | Yes | First-offence penalty exactly as the cited source states it, including any per-vehicle-class wording. |
repeat_fine_text | string | Yes | Penalty for a second or subsequent offence, as the source states it. |
compoundable_online | boolean | Yes | Whether the offence can normally be settled online rather than only before a court. |
Provenance: how this was verified
57 of the 57 source citations across the 10 offence records are official: 57 on Indian government hostnames (.gov.in or .nic.in). That is 100% of all citations.
Nothing in this dataset rests on a blog, a news report or a commercial directory.
Every one of the 10 offence records carries at least one official citation.
Amounts are stored as the source words them, because several are conditional (per vehicle class, or "up to"). base_fine_min and base_fine_max are our reading of that text as integers, for sorting and calculators — where the two disagree, the text is what the source says and the integers are ours.
State e-challan records
For each state we cover: its official challan portals, the ordered steps to check and to pay, SMS and app routes where the state offers them, what happens once a challan reaches a court, accepted payment methods, published helplines, and any state-notified fine amounts that differ from the central figure.
- States and union territories: 13
- Official portal entries: 71
- State-notified fine overrides: 56
- Source citations: 249
Last verified · the pages built from it
Endpoints
Records sit under states in the envelope.
State record fields (/api/states.json)
Each entry in the states array:
| Field | Type | Always present | What it means |
|---|---|---|---|
slug | string (fixed pattern) | Yes | URL-safe id of the state or union territory. Also its page: /{slug}-e-challan/. |
name | string | Yes | State or union territory name. |
abbr | string (fixed pattern) | Yes | Two-letter registration series people search with. Telangana stays TS even though new plates use TG — this is the searched form, not the newest series. |
target_keyword | string | Yes | The single search query the state page is written to answer. Editorial routing — not a fact about the state. |
portals | array of object {label, url, scope} | Yes | Official portals for the state: label, URL, and whether it checks challans, pays them, or both. |
check_steps | array of string | Yes | Ordered steps to check a pending challan on the official portal. |
pay_steps | array of string | Yes | Ordered steps to pay one. |
sms_app_methods | array of string | Yes | SMS and mobile-app routes the state itself offers, where any exist. Empty means none verified. |
court_challan_process | string | Yes | What happens in this state once a challan has gone to a court or Virtual Court. |
payment_methods | array of string | Yes | Payment instruments the official portal accepts. |
contacts | array of object {label, value} | Yes | Published helpline and helpdesk labels with their values. |
quirks | array of string | Yes | State-specific catches that do not fit the standard steps. |
faqs | array of object {q, a} | Yes | Question-and-answer pairs published on the state page. |
fine_overrides | object keyed by string → object {amount_text, source} | Yes — defaults to {} | Offence slug → the state-notified amount and the notification that set it. No entry means the central Motor Vehicles Act figure applies. |
sources | array of string (URL) | Yes | Every URL the record was verified against. |
last_verified | date (YYYY-MM-DD) | Yes | The day the record was last checked against those sources. |
Provenance: how this was verified
249 of the 249 source citations across the 13 state and UT files are official: 233 on Indian government hostnames (.gov.in or .nic.in) and 16 on wbtrafficpolice.com (10), aptransport.org (3) and kolkatatrafficpolice.net (3) — sites we each fetched and confirmed are run by the department or authority itself. That is 100% of all citations.
Nothing in this dataset rests on a blog, a news report or a commercial directory.
Every one of the 13 state and UT files carries at least one official citation.
Coverage is the honest limit here, not sourcing: 13 states and union territories are covered, against the 36 in the RTO directory below. A state absent from this dataset has not been researched, and its absence carries no meaning.
Discount schemes and Lok Adalat dates
The verified position on traffic-challan discount, amnesty and one-time-settlement schemes state by state — live, announced, closed, proposed, rumoured, or verified absent — plus National Lok Adalat sitting dates and the Delhi token mechanics.
- State scheme records: 16
- Live schemes right now: 1
- States with a verified absence of any scheme: 10
- National Lok Adalat sittings listed: 4
- Source citations: 36
Last verified · the pages built from it
Endpoints
Records sit under schemes (plus lok_adalat) in the envelope.
Scheme record fields (/api/schemes.json → schemes)
Each entry in the schemes array:
| Field | Type | Always present | What it means |
|---|---|---|---|
slug | string (fixed pattern) | Yes | URL-safe id of the state the record covers. |
state_name | string | Yes | State or union territory name. |
status | one of: live, announced, closed, proposal, rumour, none | Yes | Verified position on a discount/amnesty scheme. "none" is a verified absence, not missing data; "rumour" and "proposal" are claims no order confirms. |
scheme_name | string | Optional | Official name of the scheme, where one was published. |
percent_by_class | object keyed by string → string | Optional | Vehicle class → the discount in plain text. Present only for live, announced or closed schemes; the schema rejects it on rumour and proposal records. |
window | object {start, end} | Optional | Scheme start date and, where published, its end date. |
order_ref | string | Optional | Government order or circular reference the scheme rests on. |
note | string | Yes | Plain-English status note, including what is still unconfirmed. |
history | array of object {period, summary, sources} | Yes — defaults to [] | Earlier rounds of the same state scheme, each carrying its own sources. |
sources | array of string (URL) | Yes | Every URL the record was verified against. |
last_verified | date (YYYY-MM-DD) | Yes | The day the record was last checked against those sources. |
Lok Adalat object fields (/api/schemes.json → lok_adalat)
The single lok_adalat object alongside it:
| Field | Type | Always present | What it means |
|---|---|---|---|
national_sittings | array of object {date, status} | Yes | Each National Lok Adalat sitting date, marked held or scheduled. |
delhi_token | object {portal, opens_days_before, daily_cap_note, limits_note} | Yes | Delhi token booking: the portal, how many days before a sitting booking opens, the daily cap and the published limits. |
delhi_extras | object {digital_lok_adalat_note, evening_courts_url, weekend_courts_note} | Yes | Delhi digital Lok Adalat note, evening-courts URL and weekend-courts note. |
state_notes | array of object {state_slug, note} | Yes | Per-state notes on how that state runs traffic Lok Adalats. |
sources | array of string (URL) | Yes | Every URL the record was verified against. |
last_verified | date (YYYY-MM-DD) | Yes | The day the record was last checked against those sources. |
Provenance: how this was verified
17 of the 36 source citations across the 17 scheme files (16 states plus the Lok Adalat file) are official: 16 on Indian government hostnames (.gov.in or .nic.in) and 1 on dslsa.org — a site we fetched and confirmed is run by the department or authority itself. That is 47% of all citations.
The remaining 19 citations are third-party: lawchakra.in (2), bharatspeaks.com (1), digilawyer.ai (1), freepressjournal.in (1), gktoday.in (1) and 13 others.
6 of the 17 scheme files (16 states plus the Lok Adalat file) carry no official citation at all — bihar, delhi, karnataka, kerala, maharashtra, telangana.
Press citations are load-bearing in this dataset by design, and that is the honest reading of the numbers above: a record with status "rumour" or "proposal" is by definition a claim that no government order confirms, so press reporting and fact-checks are the only evidence there is. The schema refuses to store a discount percentage on those records at all. Percentages appear only on live, announced and closed records, which carry the order reference or an official record quoting it.
A scheme can be withdrawn or extended overnight. Treat every record as of its last_verified date and confirm on the official portal before anyone pays.
RTO code directory
Every Regional Transport Office code we hold, with the office that registers under it, grouped by state and union territory — plus, per state, how the list was verified and whether we found an official list published by the transport department.
- States and union territories: 36
- RTO codes: 1,336
- States verified in full against an official list: 9
- States verified by sample only: 27
- Source citations: 130
Last verified · the pages built from it
Endpoints
Records sit under states in the envelope.
RTO state record fields (/api/rto-codes.json)
Each entry in the states array:
| Field | Type | Always present | What it means |
|---|---|---|---|
slug | string (fixed pattern) | Yes | URL-safe id of the state or union territory. Also its page: /rto-codes/{slug}/. |
state_name | string | Yes | State or union territory name. |
series | array of string (fixed pattern) | Yes | Two-letter registration series the state or UT uses. Some carry more than one. |
codes | array of object {code, office} | Yes | Every RTO code with the office that registers under it. |
verification | object {method, sample_size, official_list_available} | Yes | How this list was checked: method "full" (against a fetchable official list) or "sampled", the sample size where sampled, and official_list_available — whether we found a fetchable official list for that state. That last flag records the outcome of our search, not what the transport department publishes. |
sources | array of string (URL) | Yes | Every URL the record was verified against. |
last_verified | date (YYYY-MM-DD) | Yes | The day the record was last checked against those sources. |
Provenance: how this was verified
45 of the 130 source citations across the 36 state and UT files are official: 41 on Indian government hostnames (.gov.in or .nic.in) and 4 on aptransport.org (2) and punjabtransport.org (2) — sites we each fetched and confirmed are run by the department or authority itself. That is 35% of all citations.
The remaining 85 citations are third-party: acko.com (20), cars24.com (20), insurancedekho.com (13), coverfox.com (11), groww.in (10) and 4 others.
11 of the 36 state and UT files carry no official citation at all — andaman-nicobar-islands, arunachal-pradesh, assam, bihar, dadra-nagar-haveli-daman-diu, haryana, jharkhand, manipur, nagaland, rajasthan, sikkim.
Most of this dataset's citations — 85 of 130 — are commercial directories — insurance, used-car and vehicle-information sites — not transport departments. We could find a fetchable official code list for only 15 of the 36 states and union territories, which is why 27 of 36 are marked verification.method "sampled" against 9 checked in full. That is a statement about our search, not about what those transport departments publish: a state may publish a list we could not fetch or did not find. Of the 27 sampled states, 16 had their sample checked against official office pages; for the other 11 the sample could only be cross-checked across independent directories.
Use it as a working directory, not as an authoritative register. New codes are created whenever a state carves out a new office, so a code missing from this data may simply be newer than the list. Where a state's verification block says "sampled", the codes we did not sample are exactly as reliable as the directories they came from.
Corrections
Found a wrong amount, a dead portal, an RTO code that does not exist, or a source that no longer says what
we say it says? Tell us on the contact page and point at the record — every record
has a slug. Corrections to the data take priority over anything else we are writing, and the
record's last_verified moves only when the fact itself is re-checked against its sources. How
we verify and correct is set out in the editorial policy.
TrafficChallan.com is an independent information website, not affiliated with any government body. Challan payments happen only on official government portals we link to.