GovData Docs

Vehicles API Reference

Look up DfT vehicle licensing stock and registrations, search anonymised MOT results, and compare reliability.

Base URL: https://api.govdata.dev/v1

Licensed vehicle stock

GET /v1/vehicles/licensing returns quarterly licensed and SORN vehicle counts. Filters: make, model, quarter_from, quarter_to, body_type, licence_status, and geography (GB or UK). Exact makes, including prefixes that resolve to one make, are ordered newest quarter first. Prefixes matching 2–25 makes are ordered by make, then newest quarter. A broader prefix returns 422; use a more specific prefix or exact make. Make and model prefixes are case-insensitive, and a model prefix combined with a make remains within that make's indexed range. pagination.total and total_pages are PostgreSQL planner estimates for this 16.8M-row table and are approximate; returned rows are authoritative.

GET /v1/vehicles/licensing

Parameters

Name Type Required Default Description
make string No Case-insensitive make prefix.
model string No Case-insensitive model prefix.
quarter_from date No Inclusive YYYY-MM-DD lower bound.
quarter_to date No Inclusive YYYY-MM-DD upper bound.
body_type string No Exact DfT body type.
licence_status string No Licensed or SORN.
geography string No GB or UK.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/licensing?make=FORD&geography=GB"

Response

{"data":[{"quarter":"2026-03-31","geography":"GB","licence_status":"Licensed","body_type":"Cars","make":"FORD","generic_model":"FOCUS","model":"FOCUS ZETEC","fuel":"Petrol","count":123}],"meta":{"source":"Department for Transport vehicle licensing statistics","api_version":"v1","licence":"Open Government Licence v3.0"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"make_prefix_too_broad","message":"Make prefix matches 48 makes; use a more specific prefix or an exact make.","documentation_url":"https://docs.govdata.dev/errors/make_prefix_too_broad"}}

Invalid dates return 400. A make prefix matching more than 25 known makes returns 422 make_prefix_too_broad and reports the match count. No matches return an empty 200 response; 404 is not applicable. GB coverage begins 1994 Q4 and UK coverage begins 2014 Q3. DfT revises this quarterly series; counts are individual vehicles, and zero-count combinations are omitted.

New registrations

GET /v1/vehicles/registrations returns quarterly counts of vehicles first registered in Great Britain. Filters: make, model, quarter_from, quarter_to, body_type, and geography (GB or UK).

GET /v1/vehicles/registrations

Parameters

Name Type Required Default Description
make string No Case-insensitive make prefix.
model string No Case-insensitive model prefix.
quarter_from date No Inclusive lower bound.
quarter_to date No Inclusive upper bound.
body_type string No Exact DfT body type.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/registrations?make=FORD&per_page=1"

Response

{"data":[{"quarter":"2026-03-31","geography":"GB","body_type":"Heavy goods vehicles","make":"FORD","generic_model":"FORD ADRIA A 70 DK","model":"ADRIA A 70 DK AUTO","fuel":"Diesel","count":1}],"meta":{"source":"Department for Transport vehicle licensing statistics","source_url":"https://www.gov.uk/government/statistical-data-sets/vehicle-licensing-statistics-data-files","api_version":"v1","licence":"Open Government Licence v3.0","last_updated":"2026 Q1","coverage":{"from":"2001 Q1","to":"2026 Q1"}},"pagination":{"total":59286,"page":1,"per_page":1,"total_pages":59286}}

Invalid dates return 400; 404 and 422 are not applicable. Coverage is Great Britain from 2001 Q1, refreshed quarterly. A first registration can be a new vehicle or a used import entering the GB register.

Search MOT tests

GET /v1/vehicles/mot-tests returns index-backed, paginated individual test results. Use it for statistical exploration, not vehicle-history checks.

GET /v1/vehicles/mot-tests

Parameters

Name Type Required Default Description
make string No Case-insensitive make prefix.
model string No Case-insensitive model prefix.
test_year integer No Year of test; this slice contains 2025.
fuel_type string No Enum label such as petrol, diesel, electric, or unknown.
result string No Enum label such as passed, failed, or pass_with_rectification.
postcode_area string No High-level station postcode area.
first_use_year_from integer No Inclusive first-use year lower bound.
first_use_year_to integer No Inclusive first-use year upper bound.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/mot-tests?make=LEXMOTO&test_year=2025"

Response

{"data":[{"test_id":1326094865,"test_date":"2025-01-08","test_year":2025,"test_class":"1","test_type":"NT","result":"pass_with_rectification","odometer":{"reading":6,"unit":"mi"},"postcode_area":"BH","make":"LEXMOTO","model":"ADRENALINE 125 EFi","colour":"BLACK","fuel_type":"petrol","cylinder_capacity_cc":125,"first_use_date":"2017-09-05"}],"meta":{"api_version":"v1","licence":"Open Government Licence v3.0","source":"DVSA anonymised MOT test results","source_url":"https://open.data.dvsa.gov.uk/mot-anonymised/index.html","test_year":2025,"coverage":"results_only"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"invalid_parameter","message":"result is not recognised.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Malformed year filters and unknown test-result values return 400. Valid filters with no matches return an empty 200 response; there is no 404 or request-body 422 branch.

Error response

{"error":{"code":"invalid_parameter","message":"fuel_type is not recognised.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

MOT pass rates

GET /v1/vehicles/mot-pass-rates reads the importer-built aggregate table, so requests never scan 42.7 million raw rows.

GET /v1/vehicles/mot-pass-rates

Parameters

Name Type Required Default Description
make string No Case-insensitive make prefix.
model string No Case-insensitive model prefix.
fuel_type string No Normalised fuel label.
vehicle_age_band string No 0-3, 4-6, 7-9, 10-14, 15-19, or 20+.
test_year integer No 2025 Test year.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/mot-pass-rates?make=LEXMOTO&fuel_type=petrol"

Response

{"data":[{"make":"LEXMOTO","model":"ADRENALINE 125 EFi","first_use_year_band":"2015-2019","vehicle_age_band":"7-9","fuel_type":"petrol","test_year":2025,"statistics":{"tests":2,"passes":2,"pass_rate":1.0}}],"meta":{"api_version":"v1","licence":"Open Government Licence v3.0","source":"DVSA anonymised MOT test results","source_url":"https://open.data.dvsa.gov.uk/mot-anonymised/index.html","test_year":2025,"coverage":"results_only","aggregation":"normal_initial_tests"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"invalid_parameter","message":"fuel_type is not recognised.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

A non-integer test year or unknown fuel type returns 400. Valid filters with no matching aggregate return an empty 200 response; there is no 404 or request-body 422 branch.

Common MOT failure reasons

GET /v1/vehicles/mot-failures returns the most common DVSA reason-for-rejection categories for a make and model. It is designed for reliability comparisons and used-vehicle research; requests read only the importer-built aggregate and never scan the 92.5 million detail rows.

GET /v1/vehicles/mot-failures

Parameters

Name Type Required Default Description
make string No Case-insensitive make prefix.
model string No Case-insensitive model prefix.
rfr_type string No fail, prs, advisory, minor, or unknown.
dangerous_only boolean No false Only reasons in DVSA's Dangerous deficiency category.
test_year integer No 2025 Test year.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/mot-failures?make=LEXMOTO&model=MICHIGAN&rfr_type=fail"

Response

{"data":[{"make":"LEXMOTO","model":"MICHIGAN 125","test_year":2025,"rfr_type":"fail","defect_category":"Major","defect_description":"pin or bush excessively worn","dangerous":false,"statistics":{"failures":1,"affected_tests":1}}],"meta":{"api_version":"v1","licence":"Open Government Licence v3.0","source":"DVSA anonymised MOT failure items","source_url":"https://open.data.dvsa.gov.uk/mot-anonymised/index.html","test_year":2025,"coverage":"failure_items","aggregation":"make_model_reason"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

failures counts item rows; affected_tests counts distinct anonymised tests. Repeated defects can therefore make the first value larger.

Errors

{"error":{"code":"invalid_parameter","message":"rfr_type is not recognised.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Invalid filters return 400. This collection has no addressable resource, so 404 is not applicable; no request body is validated, so 422 is not applicable.

Road safety collisions

GET /v1/vehicles/road-safety/collisions returns police-reported personal-injury collisions for safety analysis, local risk research, and transport planning. GET /v1/vehicles/road-safety/collisions/:collision_index returns one collision with its vehicles and casualties.

GET /v1/vehicles/road-safety/collisions
GET /v1/vehicles/road-safety/collisions/:collision_index

Parameters

Name Type Required Default Description
year integer No Exact collision year.
severity integer No DfT code: 1 fatal, 2 serious, 3 slight.
local_authority string No Exact ONS local-authority district code.
date_from date No Inclusive ISO 8601 date.
date_to date No Inclusive ISO 8601 date.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/road-safety/collisions?year=2025&severity=2"

Response

{"data":[{"collision_index":"202517H102225","collision_year":2025,"collision_reference":"17H102225","longitude":"-1.2377","latitude":"54.70743","collision_severity":2,"collision_severity_label":"Serious","number_of_vehicles":3,"number_of_casualties":3,"collision_date":"2025-03-05","collision_time":"12:50:00","police_force":17,"local_authority_ons_district":"E06000001","speed_limit":40,"road_type":3,"road_type_label":"Dual carriageway","urban_or_rural_area":2,"urban_or_rural_area_label":"Rural","lsoa":"E01033467"}],"meta":{"source":"DfT STATS19 road safety open data","source_url":"https://www.gov.uk/government/statistical-data-sets/road-safety-open-data","last_updated":"2026-08-21","api_version":"v1","licence":"Open Government Licence v3.0","coverage":{"from":"2025","to":"2025"},"date_coverage":{"from":"2025-01-01","to":"2025-12-31"},"geography":"Great Britain","cadence":"Annual final data only","caveat":"Police-reported personal-injury collisions on public roads in Great Britain; coded fields use the DfT data guide."},"pagination":{"total":25191,"page":1,"per_page":25,"total_pages":1008}}

The real 2025 import now reports last_updated from the completed ETL run and data-derived coverage: {from: "2025", to: "2025"}; re-capture the complete example from production after the staged 2021–2025 load.

Errors

{"error":{"code":"invalid_parameter","message":"year must be an integer.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}
{"error":{"code":"not_found","message":"STATS19 collision not found.","documentation_url":"https://docs.govdata.dev/errors/not_found"}}
{"error":{"code":"invalid_parameter","message":"date_from must be an ISO 8601 date.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Malformed integers return 400, an unknown collision index returns 404, and malformed dates return 422. Pagination totals are PostgreSQL planner estimates and may be approximate.

Traffic count points

GET /v1/vehicles/traffic/count-points returns paginated DfT road traffic statistics. Unit: Location and road-link metadata.

GET /v1/vehicles/traffic/count-points

Parameters

Name Type Required Default Description
count_point integer No DfT count point ID.
year_from integer No Inclusive first year.
year_to integer No Inclusive final year.
lat number No Latitude; requires lng.
lng number No Longitude; requires lat.
radius_km number No 5 Bounding radius, maximum 100 km.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/traffic/count-points?year_from=2025"

Response

{"data":[{"count_point_id":51,"year":2025,"road_name":"A3111","road_type":"Major","latitude":49.91550316,"longitude":-6.317558051}],"meta":{"source":"DfT road traffic statistics","coverage":"1993–2025; count-point data 2000–2025"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"invalid_parameter","message":"year_from and year_to must be integers.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Malformed numeric filters return 400. Valid filters with no matches return an empty 200 collection; these endpoints accept no request body, so 404 and 422 do not apply.

Annual average daily flow

GET /v1/vehicles/traffic/aadf returns paginated DfT road traffic statistics. Unit: vehicles/day.

GET /v1/vehicles/traffic/aadf

Parameters

Name Type Required Default Description
count_point integer No DfT count point ID.
year_from integer No Inclusive first year.
year_to integer No Inclusive final year.
road_name string No Road-name substring.
road_class string No Road category substring.
region string No Region substring.
local_authority string No Local-authority substring.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/traffic/aadf?year_from=2025"

Response

{"data":[{"count_point_id":51,"year":2025,"road_name":"A3111","estimation_method":"Estimated","daily_flows":{"cars_and_taxis":837,"all_motor_vehicles":1430}}],"meta":{"source":"DfT road traffic statistics","unit":"vehicles/day"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"invalid_parameter","message":"year_from and year_to must be integers.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Malformed numeric filters return 400. Valid filters with no matches return an empty 200 collection; these endpoints accept no request body, so 404 and 422 do not apply.

Regional traffic

GET /v1/vehicles/traffic/regional returns paginated DfT road traffic statistics. Unit: vehicle miles; present rounded to nearest million.

GET /v1/vehicles/traffic/regional

Parameters

Name Type Required Default Description
year_from integer No Inclusive first year.
year_to integer No Inclusive final year.
region string No Region substring.
breakdown string No vehicle_type or road_type.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/traffic/regional?year_from=2025"

Response

{"data":[{"year":2025,"region_name":"South West","breakdown":"vehicle_type","vehicle_miles":{"all_motor_vehicles":23856600000}}],"meta":{"unit":"vehicle miles","presentation":"Round to the nearest million vehicle miles when presenting regional or local-authority figures."},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"invalid_parameter","message":"year_from and year_to must be integers.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Malformed numeric filters return 400. Valid filters with no matches return an empty 200 collection; these endpoints accept no request body, so 404 and 422 do not apply.

Local-authority traffic

GET /v1/vehicles/traffic/local-authority returns paginated DfT road traffic statistics. Unit: vehicle miles; present rounded to nearest million.

GET /v1/vehicles/traffic/local-authority

Parameters

Name Type Required Default Description
year_from integer No Inclusive first year.
year_to integer No Inclusive final year.
local_authority string No Local-authority substring.
page integer No 1 One-based page.
per_page integer No 25 Results per page, maximum 100.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/vehicles/traffic/local-authority?year_from=2025"

Response

{"data":[{"year":2025,"local_authority_name":"Isles of Scilly","vehicle_miles":{"all_motor_vehicles":1400000}}],"meta":{"unit":"vehicle miles","presentation":"Round to the nearest million vehicle miles when presenting regional or local-authority figures."},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}

Errors

{"error":{"code":"invalid_parameter","message":"year_from and year_to must be integers.","documentation_url":"https://docs.govdata.dev/errors/invalid_parameter"}}

Malformed numeric filters return 400. Valid filters with no matches return an empty 200 collection; these endpoints accept no request body, so 404 and 422 do not apply.

Data notes

Coverage: result and failure/RfR coverage for the 2025 test year. Failure aggregates become complete after the initial production failure-item import finishes.

Method: pass rates use normal initial tests (NT) with pass, fail, or pass-with-rectification outcomes. A PRS outcome counts as a final pass.

Source and cadence: DVSA anonymised MOT test results, refreshed annually after publication, reused under the Open Government Licence v3.0 with Crown copyright attribution.

STATS19: This package loads DfT's discoverable per-year final files from 2021 onwards; coverage metadata reports the actual loaded MIN/MAX years. A separate combined-file historical backfill is implemented but disk-gated and not staged. Only police-reported personal-injury collisions are included.

Road traffic units and presentation: AADF is measured in vehicles/day. Regional and local-authority annual totals are supplied as unrounded vehicle miles; DfT requires presented figures to be rounded to the nearest million vehicle miles.

Mandatory AADF limitation: link-level AADF figures are modelled estimates, not continuous measurements. Most count points are counted manually once and factored. Consult estimation_method; link and small-area estimates are less robust than regional totals, and newer local-highway-authority counts may be more appropriate.

Failure detail: coded reasons, deficiency categories, and locations are decoded with DVSA's published lookup tables. The dangerous flag is derived from the post-May 2018 Dangerous deficiency category; the legacy D-mark is not used. Unknown codes remain explicitly unknown. Raw per-test failure detail is not exposed: anonymised test IDs are not useful vehicle identifiers, while the consumer use case is served more safely and efficiently by the indexed aggregate.

This is an anonymised statistical dataset. It contains no registration or VIN and is not an official DVSA vehicle-history service. Make/model, fuel, mileage, and first-use values can be incomplete or entered incorrectly; small groups are not predictions of an individual vehicle's reliability.