Data source and freshness
What the Motorbay API serves, where it comes from, and how to tell how old it is.
The source
The data comes from Motorstyrelsen's weekly public statistics extract of the Danish Motor Register (Det Digitale Motorregister, DMR). Motorstyrelsen is the Danish Motor Vehicle Agency. Motorbay is not affiliated with Motorstyrelsen, and the data is provided as-is.
We import the extract as it is registered. We convert types and normalize identifiers. We don't correct, guess or fill in values.
The extract holds no owners, keepers or other people, and neither does the API.
It's weekly, not real time
Motorstyrelsen publishes a new extract about once a week. We import it after it's published. A change registered at Motorstyrelsen reaches the API after their next extract and our import, usually within a week. The API is not real time.
The previous extract stays live while an import runs, so the API doesn't pause during imports.
Check how old the data is
GET /v1/dataset describes the extract being served:
curl -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/dataset"
{
"sourcePublishedAt": "2026-09-21T04:43:39+00:00",
"importedAt": "2026-09-21T17:01:50.9719+00:00",
"vehicleCount": 4869,
"source": "Motorstyrelsen, weekly public statistics extract (ESStatistikListeModtag)"
}
| Field | Meaning |
|---|---|
sourcePublishedAt |
When Motorstyrelsen published the extract |
importedAt |
When our import of it finished and it went live |
vehicleCount |
How many vehicles the extract holds. null for older imports |
source |
Where the data comes from |
Before the first import has finished, it answers 503 with the code DatasetNotLoaded.
Every response to a request with a valid key also carries a Motorbay-Data-As-Of header with the extract's publication time, so you can record it next to what you store:
Motorbay-Data-As-Of: 2026-09-21T04:43:39Z
When importedAt changes, a new extract is live. That's a good moment to refresh anything you cached.
Reading the data
- IDs are strings. They hold Motorstyrelsen's numeric identifiers, for example
"9000000006320919". Treat them as opaque text. Don't parse them as numbers: they don't all fit in a JavaScript number. - Calendar dates are
YYYY-MM-DDwith no time zone, in fields whose names end inOn, such asfirstRegisteredOn. - Points in time are ISO 8601 with a UTC offset, in fields whose names end in
At, such asstatusUpdatedAt. The offset isn't alwaysZ:/v1/datasetsends+00:00, and some vehicle fields send+02:00. Parse the offset rather than assuming UTC. - Missing values are
null, never left out. Some fields come with a flag such asisMaximumPowerUnavailable, which istruewhen the register marks the value as not reported. - Lists are never
null. An empty list is[]. - Numbers keep Motorstyrelsen's units, such as kg, mm and kW. Each field's unit is in the API reference.
- Status values are camelCase, such as
registeredandderegistered. Motorstyrelsen adds values over time, so handle values you don't know. - Reference data has two names. Kinds, colors, usages and other reference data carry
nameandoriginalName, Motorstyrelsen's Danish text. Todaynameis the same Danish text, for examplePersonbil. English names innamemay come later. - Ignore fields you don't know. We add fields without a new API version.
Every vehicle stays in the data
Deregistered, scrapped and exported vehicles stay in the data with their status. Check registrationStatus and status if you only want vehicles on the road.
Look up a vehicle by registration number
GET /v1/vehicles/plate/{plate} looks up a vehicle by registration number. Registration numbers are reused, and personal plates move between vehicles, so several vehicles in the register can have had the same one.
- Input is trimmed, uppercased, and spaces and hyphens are removed, so
ab 12 345andAB-12345findAB12345. - Only A to Z, 0 to 9, Æ, Ø and Å are accepted, at most 10 of them. Anything else is a
400withRegistrationNumberInvalidundererrors. - If several vehicles have had the registration number, you get the one currently registered with it. If none is, you get the most recent one, and its
registrationStatustells you it's no longer registered. The answer is the same on every request. GET /v1/vehicles?registrationNumber=AB12345lists every vehicle that has had it, in the same order, so the first item is the one the lookup returns.