API Documentation
Complete reference for the MotorAPI vehicle data service
MotorAPI provides data about Danish vehicles from the Danish Motor Register (DMR): registration, technical data, weights, tyres and rims, inspections (syn), environmental data and equipment.
Data freshness: the data comes from DMR's bulk extract, not from live lookups. DMR publishes a new extract roughly once a week, and MotorAPI imports it the same night it is published. A change registered in DMR typically shows up in the API within a week. Looking up the same vehicle more than once a day therefore doesn't return newer data.
Billing: lookups of vehicles, environmental data and equipment count towards your account's daily request limit. /usage and /vehicles/_search are free.
Authentication
All requests to the API must contain the X-AUTH-TOKEN HTTP header with your API token.
Errors
A lookup without a match returns 404 Not Found with an empty body. A missing or invalid auth token returns 401 Unauthorized, and an exceeded daily limit on a free account returns 403 Forbidden.
If the vehicle lookup is temporarily unavailable on our side, the API returns 503 Service Unavailable with a Retry-After header. These requests are not counted towards your usage. Error responses with a body use the format {"errors": ["..."]}.
API End points
| MotorAPI v1 | https://v1.motorapi.dk |
|---|---|
| OpenAPI spec | openapi.yaml (OpenAPI 3.1.0), for code generators and API tools |
Vehicles
Get the details of a vehicle by registration number or VIN. Values longer than 8 characters are treated as a VIN. Only an exact match is returned.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
identifier | path | string | required | Registration number, or VIN (values longer than 8 characters). |
Responses
| Code | Description |
|---|---|
| 200 | Body: Vehicle. The vehicle. |
| 401 | Missing or invalid |
| 403 | Body: ErrorResponse. Your daily request limit has been reached. |
| 404 | No vehicle with this registration number or VIN. Empty body. |
| 503 | Body: ErrorResponse. The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the |
Response example
{
"registration_number": "AB12345",
"status": "Registreret",
"status_date": "2021-03-12T11:22:31.000+01:00",
"type": "Personbil",
"use": "Privat personkørsel",
"first_registration": "2019-08-26+02:00",
"vin": "KNACD81DGL5310845",
"own_weight": null,
"cerb_weight": 1621,
"total_weight": 2000,
"technical_total_weight": 2000,
"combination_weight": 3300,
"max_axle_load": 1060,
"axels": 2,
"pulling_axels": 1,
"seats": 5,
"coupling": true,
"trailer_maxweight_nobrakes": 600,
"trailer_maxweight_withbrakes": 1300,
"doors": 5,
"wheels": {
"raw": "1. aksel: 205/60R16 92H 6.5Jx16/ET45 / B. 2. aksel: 205/60R16 92H 6.5Jx16/ET45 / B",
"axles": [
{
"axle": 1,
"fitments": [
{
"tire": {
"width": 205,
"aspect_ratio": 60,
"construction": "R",
"rim_diameter": 16,
"commercial": false,
"load_index": "92",
"speed_rating": "H"
},
"rim": {
"width": 6.5,
"diameter": 16,
"offset": 45
}
}
]
},
{
"axle": 2,
"fitments": [
{
"tire": {
"width": 205,
"aspect_ratio": 60,
"construction": "R",
"rim_diameter": 16,
"commercial": false,
"load_index": "92",
"speed_rating": "H"
},
"rim": {
"width": 6.5,
"diameter": 16,
"offset": 45
}
}
]
}
]
},
"dimensions": {
"wheelbase": 2700,
"track_width_front": 1565,
"track_width_rear": 1579
},
"make": "KIA",
"model": "Niro",
"variant": "1.6 GDI Plug-in Hybrid 5 dørs DCT 6",
"model_type": "DE",
"model_year": 2020,
"color": "Grå",
"chassis_type": "Stationcar",
"engine_cylinders": 4,
"engine_volume": 1580,
"engine_power": 77.2,
"fuel_type": "Benzin",
"is_hybrid": true,
"hybrid_type": "plugin",
"registration_zipcode": "",
"vehicle_id": 9000000003275377,
"mot_info": {
"type": "PeriodiskSyn",
"date": "2023-08-09",
"result": "Godkendt",
"status": "Aktiv",
"status_date": "2023-08-09",
"mileage": 60000,
"next_inspection_date": "2025-08-09"
},
"is_leasing": false,
"leasing_from": null,
"leasing_to": null
}
Get all vehicles that have had the given registration number, including deregistered and scrapped vehicles. Use status to filter.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
registration_number | query | string | required | A single registration number (exact match). |
status | query | string: registreret, afmeldt, skrottet | optional | Only return vehicles with this status. Case insensitive. |
Responses
| Code | Description |
|---|---|
| 200 | Body: array of Vehicle. Matching vehicles. An empty array when there are none. |
| 400 |
|
| 401 | Missing or invalid |
| 403 | Body: ErrorResponse. Your daily request limit has been reached. |
| 503 | Body: ErrorResponse. The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the |
Search vehicles by the start of a registration number, optionally filtered by make, model and status. Returns a short summary per vehicle, 25 at most per page. Free: doesn't count towards your request limit.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
registration_number | query | string | required | The first characters of the registration number (at least 2). |
make | query | string | optional | Exact make, case insensitive. |
model | query | string | optional | Start of the model name, case insensitive. |
status | query | string: registreret, afmeldt, skrottet | optional | Vehicle status. Case insensitive. Default: <code>registreret</code>. |
page | query | integer | optional | Default: <code>1</code>. Range: 1–. |
per_page | query | integer | optional | Default: <code>25</code>. Range: 1–25. |
Responses
| Code | Description |
|---|---|
| 200 | Body: SearchResult. Matching vehicles and pagination. |
| 400 | Body: SearchError. Invalid parameters. |
| 401 | Missing or invalid |
| 503 | Body: ErrorResponse. The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the |
Fuel and electricity consumption, emissions, noise and Euro norm of a vehicle.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
identifier | path | string | required | Registration number, or VIN (values longer than 8 characters). |
Responses
| Code | Description |
|---|---|
| 200 | Body: Environmental data. Environmental data. |
| 401 | Missing or invalid |
| 403 | Body: ErrorResponse. Your daily request limit has been reached. |
| 404 | No vehicle with this registration number or VIN. Empty body. |
| 503 | Body: ErrorResponse. The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the |
Response example
{
"vin": "KNACD81DGL5310845",
"fuel_type": "Benzin",
"fuel_usage": 44.2,
"electric_usage": 100.8,
"total_usage": null,
"co2_emission": 31,
"co_emission": 74.7,
"hc_nox_emission": null,
"nox_emission": 7.5,
"particles": 0.13,
"particle_filter": 0,
"idle_noise": 81,
"idle_noise_rpm": 3750,
"driving_noise": 70,
"euro_norm": "Euro VI",
"measurement_norm": "WLTP",
"innovation_technology": 0,
"co2_savings": null
}
Equipment registered for the vehicle. When several vehicles have had the registration number, the currently registered one is used.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
identifier | path | string | required | Registration number, or VIN (values longer than 8 characters). |
Responses
| Code | Description |
|---|---|
| 200 | Body: array of EquipmentItem. Equipment. An empty array when none is registered. |
| 401 | Missing or invalid |
| 403 | Body: ErrorResponse. Your daily request limit has been reached. |
| 404 | No vehicle with this registration number or VIN. Empty body. |
| 503 | Body: ErrorResponse. The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the |
Response example
[
{
"id": "6028",
"name": "selealarm",
"quantity": 4
},
{
"id": "6029",
"name": "radio",
"quantity": 1
},
{
"id": "9901",
"name": "Airbags",
"quantity": 6
}
]
Account
Today's request count and limit, and the number of requests per month. Free.
Responses
| Code | Description |
|---|---|
| 200 | Body: Usage. Usage statistics. |
| 401 | Missing or invalid |
Response example
{
"today": {
"date": "2026-10-31",
"requests": 47,
"limit": 100,
"remaining": 53
},
"history": [
{
"month": 9,
"year": 2026,
"requests": 2150
},
{
"month": 10,
"year": 2026,
"requests": 1847
}
]
}
Data models
A vehicle as registered in DMR.
| Field | Type | Description |
|---|---|---|
registration_number | string | Registration number (nummerplade). |
status | string | Registration status, e.g. |
status_date | string | When the status last changed (ISO 8601 with offset). |
type | string | Vehicle type, e.g. |
use | string | Registered use, e.g. |
first_registration | string | Date of first registration, with UTC offset (e.g. |
vin | string | Vehicle identification number (stelnummer). |
own_weight | number or null | Own weight in kg. |
cerb_weight | number or null | Minimum kerb weight (køreklar vægt) in kg. |
total_weight | number or null | Permitted total weight in kg. |
technical_total_weight | number or null | Technical total weight in kg. |
combination_weight | number or null | Permitted combination weight (vogntogsvægt) in kg. |
max_axle_load | number or null | Largest permitted axle load in kg. |
axels | integer or null | Number of axles. |
pulling_axels | integer | Number of driven axles. |
seats | integer | Number of seats including the driver. |
coupling | boolean | Whether a trailer may be coupled. |
trailer_maxweight_nobrakes | integer or null | Maximum trailer weight without brakes in kg. |
trailer_maxweight_withbrakes | integer or null | Maximum trailer weight with brakes in kg. |
doors | integer or null | Number of doors. |
wheels | Tyres and rims or null | Tyre and rim sizes, parsed from DMR's free-text field. Parsing is best effort: |
dimensions | Dimensions or null | Wheelbase and track widths in mm. |
make | string | Make. |
model | string | Model. |
variant | string | Variant. |
model_type | string | Type designation. |
model_year | integer | Model year. |
color | string or null | Colour. |
chassis_type | string | Body type. May be empty. |
engine_cylinders | integer or null | Number of cylinders. |
engine_volume | number or null | Engine displacement in cm³. |
engine_power | number or null | Maximum engine power in kW. |
fuel_type | string | Primary fuel, e.g. |
is_hybrid | boolean | Whether the vehicle is a hybrid (combustion engine plus electric drive). |
hybrid_type | string: mild, plugin or null |
|
registration_zipcode | string | Postal code of the registered address. Often empty. |
vehicle_id | integer (int64) | DMR's internal vehicle id. |
mot_info | Inspection (syn) | The vehicle's latest inspection (syn) as registered in DMR, and the expected next |
is_leasing | boolean | Whether the vehicle is registered as leased. |
leasing_from | string or null | Start of the leasing period. |
leasing_to | string or null | End of the leasing period. |
MotInfoThe vehicle's latest inspection (syn) as registered in DMR, and the expected next inspection date.
next_inspection_date is calculated by MotorAPI, not registered in DMR. It is the latest inspection date plus the normal interval for the vehicle type (e.g. 2 years for cars and vans, 1 year for lorries, buses and heavy trailers), or the first inspection after first registration. The official deadline can differ, for example when a vehicle was inspected early or didn't pass. Treat it as an estimate.
| Field | Type | Description |
|---|---|---|
type | string | Inspection type, e.g. |
date | string (date) or null | Date of the latest inspection. |
result | string | Result, e.g. |
status | string | Status of the inspection result, e.g. |
status_date | string (date) or null | Date of the status. |
mileage | integer or null | Odometer reading at the inspection, in km (registered in thousands of km). |
next_inspection_date | string (date) or null | Expected next inspection date, calculated by MotorAPI (see above). |
WheelsTyre and rim sizes, parsed from DMR's free-text field. Parsing is best effort: raw always contains the original text, and values that can't be read unambiguously are null. null when DMR has no tyre data for the vehicle.
| Field | Type | Description |
|---|---|---|
raw | string | The original text from DMR. |
axles | array of WheelAxle |
| Field | Type | Description |
|---|---|---|
axle | integer or null | Axle number (1 = front). |
fitments | array of WheelFitment | Permitted tyre/rim combinations for the axle. |
| Field | Type | Description |
|---|---|---|
width | integer | Tyre width in mm. |
aspect_ratio | integer | Aspect ratio in %. |
construction | string or null | Construction, e.g. |
rim_diameter | integer | Rim diameter in inches. |
commercial | boolean | Commercial (C) tyre. |
load_index | string or null | Load index, e.g. |
speed_rating | string or null | Speed rating, e.g. |
| Field | Type | Description |
|---|---|---|
width | number | Rim width in inches. |
diameter | integer | Rim diameter in inches. |
offset | number or null | Offset (ET) in mm. |
DimensionsWheelbase and track widths in mm. null when none are registered.
| Field | Type | Description |
|---|---|---|
wheelbase | integer or null | Wheelbase (akselafstand) in mm. |
track_width_front | integer or null | Front track width in mm. |
track_width_rear | integer or null | Rear track width in mm. |
EnvironmentInfo| Field | Type | Description |
|---|---|---|
vin | string | Vehicle identification number. |
fuel_type | string or null | Fuel type, e.g. |
fuel_usage | number or null | Fuel consumption in km/l. |
electric_usage | number or null | Electricity consumption in Wh/km. |
total_usage | number or null | Total consumption in km/l. |
co2_emission | number or null | CO₂ emission in g/km. |
co_emission | number or null | CO emission in mg/km. |
hc_nox_emission | number or null | HC+NOx emission in mg/km. |
nox_emission | number or null | NOx emission in mg/km. |
particles | number or null | Particle emission. |
particle_filter | integer or boolean or null | Whether a particle filter is fitted ( |
idle_noise | number or null | Stationary noise in dB. |
idle_noise_rpm | integer or null | Engine speed (rpm) of the stationary noise measurement. |
driving_noise | number or null | Driving noise in dB. |
euro_norm | string or null | Euro norm, e.g. |
measurement_norm | string or null | Measurement norm, e.g. |
innovation_technology | integer or boolean or null | Whether eco-innovation technology is fitted ( |
co2_savings | number or null | CO₂ savings from eco-innovations in g/km. |
| Field | Type | Description |
|---|---|---|
id | string | DMR equipment type number. |
name | string | Equipment name (Danish). |
quantity | integer | Quantity. |
| Field | Type | Description |
|---|---|---|
registration_number | string | |
vin | string | |
make | string | |
model | string | |
variant | string | |
model_year | integer | |
fuel_type | string | |
status | string |
| Field | Type | Description |
|---|---|---|
data | array of VehicleSummary | |
pagination | object | |
pagination.page | integer | |
pagination.per_page | integer | |
pagination.total | integer | Total number of matches. |
pagination.total_pages | integer |
| Field | Type | Description |
|---|---|---|
error | string | What is wrong with the request. |
| Field | Type | Description |
|---|---|---|
today | object | |
today.date | string (date) | |
today.requests | integer | Requests counted today. |
today.limit | integer | Your daily request limit. |
today.remaining | integer | Requests left today. |
history | array of object | Requests per month. |
history[].month | integer | |
history[].year | integer | |
history[].requests | integer |
| Field | Type | Description |
|---|---|---|
errors | array of string |