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/vehicles/{identifier}Get a vehicle

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

NameInTypeRequiredDescription
identifierpathstringrequired

Registration number, or VIN (values longer than 8 characters).

Responses

CodeDescription
200Body: Vehicle.

The vehicle.

401

Missing or invalid X-AUTH-TOKEN. Empty body.

403Body: ErrorResponse.

Your daily request limit has been reached.

404

No vehicle with this registration number or VIN. Empty body.

503Body: ErrorResponse.

The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the Retry-After header (60). The request is not counted towards your usage.

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/vehiclesList vehicles by registration number

Get all vehicles that have had the given registration number, including deregistered and scrapped vehicles. Use status to filter.

Parameters

NameInTypeRequiredDescription
registration_numberquerystringrequired

A single registration number (exact match).

statusquerystring: registreret, afmeldt, skrottetoptional

Only return vehicles with this status. Case insensitive.

Responses

CodeDescription
200Body: array of Vehicle.

Matching vehicles. An empty array when there are none.

400

registration_number is missing or status is invalid. Empty body.

401

Missing or invalid X-AUTH-TOKEN. Empty body.

403Body: ErrorResponse.

Your daily request limit has been reached.

503Body: ErrorResponse.

The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the Retry-After header (60). The request is not counted towards your usage.

GET/vehicles/_searchSearch vehicles

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

NameInTypeRequiredDescription
registration_numberquerystringrequired

The first characters of the registration number (at least 2).

makequerystringoptional

Exact make, case insensitive.

modelquerystringoptional

Start of the model name, case insensitive.

statusquerystring: registreret, afmeldt, skrottetoptional

Vehicle status. Case insensitive. Default: <code>registreret</code>.

pagequeryintegeroptional

Default: <code>1</code>. Range: 1–.

per_pagequeryintegeroptional

Default: <code>25</code>. Range: 1–25.

Responses

CodeDescription
200Body: SearchResult.

Matching vehicles and pagination.

400Body: SearchError.

Invalid parameters.

401

Missing or invalid X-AUTH-TOKEN. Empty body.

503Body: ErrorResponse.

The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the Retry-After header (60). The request is not counted towards your usage.

GET/vehicles/{identifier}/environmentGet environmental data

Fuel and electricity consumption, emissions, noise and Euro norm of a vehicle.

Parameters

NameInTypeRequiredDescription
identifierpathstringrequired

Registration number, or VIN (values longer than 8 characters).

Responses

CodeDescription
200Body: Environmental data.

Environmental data.

401

Missing or invalid X-AUTH-TOKEN. Empty body.

403Body: ErrorResponse.

Your daily request limit has been reached.

404

No vehicle with this registration number or VIN. Empty body.

503Body: ErrorResponse.

The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the Retry-After header (60). The request is not counted towards your usage.

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
}
GET/vehicles/{identifier}/equipmentGet equipment

Equipment registered for the vehicle. When several vehicles have had the registration number, the currently registered one is used.

Parameters

NameInTypeRequiredDescription
identifierpathstringrequired

Registration number, or VIN (values longer than 8 characters).

Responses

CodeDescription
200Body: array of EquipmentItem.

Equipment. An empty array when none is registered.

401

Missing or invalid X-AUTH-TOKEN. Empty body.

403Body: ErrorResponse.

Your daily request limit has been reached.

404

No vehicle with this registration number or VIN. Empty body.

503Body: ErrorResponse.

The vehicle lookup is temporarily unavailable on our side. Retry after the number of seconds in the Retry-After header (60). The request is not counted towards your usage.

Response example

[
    {
        "id": "6028",
        "name": "selealarm",
        "quantity": 4
    },
    {
        "id": "6029",
        "name": "radio",
        "quantity": 1
    },
    {
        "id": "9901",
        "name": "Airbags",
        "quantity": 6
    }
]

Account

GET/usageGet your API usage

Today's request count and limit, and the number of requests per month. Free.

Responses

CodeDescription
200Body: Usage.

Usage statistics.

401

Missing or invalid X-AUTH-TOKEN. Empty body.

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

Vehicle

A vehicle as registered in DMR.

FieldTypeDescription
registration_numberstring

Registration number (nummerplade).

statusstring

Registration status, e.g. Registreret, Afmeldt or Skrottet.

status_datestring

When the status last changed (ISO 8601 with offset).

typestring

Vehicle type, e.g. Personbil, Varebil, Lastbil, Motorcykel.

usestring

Registered use, e.g. Privat personkørsel, Godstransport erhverv.

first_registrationstring

Date of first registration, with UTC offset (e.g. 2013-12-18+01:00).

vinstring

Vehicle identification number (stelnummer).

own_weightnumber or null

Own weight in kg.

cerb_weightnumber or null

Minimum kerb weight (køreklar vægt) in kg.

total_weightnumber or null

Permitted total weight in kg.

technical_total_weightnumber or null

Technical total weight in kg.

combination_weightnumber or null

Permitted combination weight (vogntogsvægt) in kg.

max_axle_loadnumber or null

Largest permitted axle load in kg.

axelsinteger or null

Number of axles.

pulling_axelsinteger

Number of driven axles.

seatsinteger

Number of seats including the driver. 0 when unknown.

couplingboolean

Whether a trailer may be coupled.

trailer_maxweight_nobrakesinteger or null

Maximum trailer weight without brakes in kg.

trailer_maxweight_withbrakesinteger or null

Maximum trailer weight with brakes in kg.

doorsinteger or null

Number of doors.

wheelsTyres and rims or null

Tyre and rim sizes, parsed from DMR's free-text field. Parsing is best effort: raw

dimensionsDimensions or null

Wheelbase and track widths in mm. null when none are registered.

makestring

Make.

modelstring

Model.

variantstring

Variant.

model_typestring

Type designation.

model_yearinteger

Model year. 0 when unknown.

colorstring or null

Colour.

chassis_typestring

Body type. May be empty.

engine_cylindersinteger or null

Number of cylinders.

engine_volumenumber or null

Engine displacement in cm³.

engine_powernumber or null

Maximum engine power in kW.

fuel_typestring

Primary fuel, e.g. Benzin, Diesel, El.

is_hybridboolean

Whether the vehicle is a hybrid (combustion engine plus electric drive).

hybrid_typestring: mild, plugin or null

plugin for chargeable hybrids, mild for other hybrids, null when not a hybrid.

registration_zipcodestring

Postal code of the registered address. Often empty.

vehicle_idinteger (int64)

DMR's internal vehicle id.

mot_infoInspection (syn)

The vehicle's latest inspection (syn) as registered in DMR, and the expected next

is_leasingboolean

Whether the vehicle is registered as leased.

leasing_fromstring or null

Start of the leasing period.

leasing_tostring or null

End of the leasing period.

Inspection (syn)MotInfo

The 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.

FieldTypeDescription
typestring

Inspection type, e.g. PeriodiskSyn. Empty when no inspection is registered.

datestring (date) or null

Date of the latest inspection.

resultstring

Result, e.g. Godkendt. Empty when no inspection is registered.

statusstring

Status of the inspection result, e.g. Aktiv.

status_datestring (date) or null

Date of the status.

mileageinteger or null

Odometer reading at the inspection, in km (registered in thousands of km).

next_inspection_datestring (date) or null

Expected next inspection date, calculated by MotorAPI (see above). null for vehicles without periodic inspection.

Tyres and rimsWheels

Tyre 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.

FieldTypeDescription
rawstring

The original text from DMR.

axlesarray of WheelAxle
WheelAxle
FieldTypeDescription
axleinteger or null

Axle number (1 = front). null when the text doesn't say.

fitmentsarray of WheelFitment

Permitted tyre/rim combinations for the axle.

WheelFitment
FieldTypeDescription
tireTire or null
rimRim or null
Tire
FieldTypeDescription
widthinteger

Tyre width in mm.

aspect_ratiointeger

Aspect ratio in %.

constructionstring or null

Construction, e.g. R (radial).

rim_diameterinteger

Rim diameter in inches.

commercialboolean

Commercial (C) tyre.

load_indexstring or null

Load index, e.g. 92 or 99/97.

speed_ratingstring or null

Speed rating, e.g. H.

Rim
FieldTypeDescription
widthnumber

Rim width in inches.

diameterinteger

Rim diameter in inches.

offsetnumber or null

Offset (ET) in mm.

DimensionsDimensions

Wheelbase and track widths in mm. null when none are registered.

FieldTypeDescription
wheelbaseinteger or null

Wheelbase (akselafstand) in mm.

track_width_frontinteger or null

Front track width in mm.

track_width_rearinteger or null

Rear track width in mm.

Environmental dataEnvironmentInfo
FieldTypeDescription
vinstring

Vehicle identification number.

fuel_typestring or null

Fuel type, e.g. Benzin, Diesel, El.

fuel_usagenumber or null

Fuel consumption in km/l.

electric_usagenumber or null

Electricity consumption in Wh/km.

total_usagenumber or null

Total consumption in km/l.

co2_emissionnumber or null

CO₂ emission in g/km.

co_emissionnumber or null

CO emission in mg/km.

hc_nox_emissionnumber or null

HC+NOx emission in mg/km.

nox_emissionnumber or null

NOx emission in mg/km.

particlesnumber or null

Particle emission.

particle_filterinteger or boolean or null

Whether a particle filter is fitted (1/0).

idle_noisenumber or null

Stationary noise in dB.

idle_noise_rpminteger or null

Engine speed (rpm) of the stationary noise measurement.

driving_noisenumber or null

Driving noise in dB.

euro_normstring or null

Euro norm, e.g. Euro VI.

measurement_normstring or null

Measurement norm, e.g. WLTP or NEDC.

innovation_technologyinteger or boolean or null

Whether eco-innovation technology is fitted (1/0).

co2_savingsnumber or null

CO₂ savings from eco-innovations in g/km.

EquipmentItem
FieldTypeDescription
idstring

DMR equipment type number.

namestring

Equipment name (Danish).

quantityinteger

Quantity.

VehicleSummary
FieldTypeDescription
registration_numberstring
vinstring
makestring
modelstring
variantstring
model_yearinteger
fuel_typestring
statusstring
SearchResult
FieldTypeDescription
dataarray of VehicleSummary
paginationobject
pagination.pageinteger
pagination.per_pageinteger
pagination.totalinteger

Total number of matches.

pagination.total_pagesinteger
SearchError
FieldTypeDescription
errorstring

What is wrong with the request.

Usage
FieldTypeDescription
todayobject
today.datestring (date)
today.requestsinteger

Requests counted today.

today.limitinteger

Your daily request limit.

today.remaininginteger

Requests left today.

historyarray of object

Requests per month.

history[].monthinteger
history[].yearinteger
history[].requestsinteger
ErrorResponse
FieldTypeDescription
errorsarray of string