Nøgle
Alle kald skal have din nøgle i headeren Authorization som Bearer. Nøglen er hemmelig: brug den fra din egen server, aldrig i kode, der kører i browseren.
Authorization: Bearer DIN_NØGLE Endpoints
GET /v1/plates/{country}/{plate}
Slår en nummerplade op. country er DK eller NL. Store og små bogstaver, mellemrum og bindestreger i nummerpladen er ligegyldige.
GET /v1/catalog/{country}/makes
Alle mærker i et land med antal køretøjer, flest først. country er dk, nl, fi eller all (summen af landene). Finland findes kun i kataloget, ikke i opslag. Slugs er de samme i alle lande.
GET /v1/catalog/{country}/makes/{make_slug}/models
Alle modeller af et mærke, samlet på tværs af registrene, så ID.3 og ID.3 Pro 150 kW er én model. make_slug er slug fra listen over mærker. Et land viser kun modeller med biler i det land.
Uden ?type= viser kataloget personbiler og varebiler (car,van). Du kan angive en eller flere køretøjsarter adskilt af komma, fx ?type=motorcycle. Kataloget har kun car, van og motorcycle, og en model skal have mindst 100 køretøjer i alt. Svaret må gemmes i et døgn.
Svar fra kataloget
[
{ "name": "Volkswagen", "slug": "volkswagen", "count": 312456 },
{ "name": "Toyota", "slug": "toyota", "count": 254321 },
…
] Felter
Svaret har altid alle felter. Et felt uden værdi er null. Tekstfelterne står på kildens sprog (dansk fra Motorstyrelsen, hollandsk fra RDW), mens felterne med _code er ens for begge lande. Datoer skrives ÅÅÅÅ-MM-DD. Vi udleverer aldrig oplysninger om ejeren.
| Felt | Type | Eksempel | Lande | Beskrivelse |
|---|---|---|---|---|
country | string | "DK" | DK · NL | Landet fra adressen: DK eller NL. |
plate | string | "AB12345" | DK · NL | Nummerpladen med store bogstaver, uden mellemrum og bindestreger. |
make | string | "Volkswagen" | DK · NL | Mærke. |
model | string | "Golf" | DK · NL | Model. |
variant | string | "1.5 TSI EVO 150 DSG7" | DK | Variant, som den står i registret. |
make_slug | string | "volkswagen" | DK · NL | Mærket som slug, som i registret. |
model_slug | string | "golf" | DK · NL | Modellen som slug, som i registret. |
catalog_make_slug | string | "volkswagen" | DK · NL | Mærket i kataloget. null, hvis mærket ikke er i kataloget. |
catalog_model_slug | string | "golf" | DK · NL | Modellen i kataloget, fx id-3 for en ID.3 Pro 150 kW. null, hvis modellen ikke er i kataloget. |
vehicle_type | string | "Personbil" | DK · NL | Køretøjsart på kildens sprog. |
vehicle_type_code | string | "car" | DK · NL | Køretøjsart som kode. Se koderne nedenfor. |
body_type | string | "Stationcar" | DK · NL | Karrosseri på kildens sprog. |
colour | string | "Rød" | DK · NL | Farve på kildens sprog. |
colour_code | string | "red" | DK · NL | Farve som kode. |
doors | integer | 5 | DK · NL | Antal døre. |
seats | integer | 5 | DK · NL | Antal siddepladser, inklusive føreren. |
fuel | string | "Benzin" | DK · NL | Brændstof på kildens sprog. |
fuel_code | string | "petrol" | DK · NL | Brændstof som kode. Hybrider skelnes fra plugin-hybrider. |
power_kw | number | 110 | DK · NL | Motorens effekt i kW. Gang med 1,36 for hk. |
engine_volume_cc | integer | 1498 | DK · NL | Slagvolumen i cm³. |
cylinders | integer | 4 | DK · NL | Antal cylindre. |
kerb_weight_kg | integer | 1310 | DK · NL | Egenvægt i kg. Sjældent udfyldt for danske personbiler. |
total_weight_kg | integer | 1830 | DK · NL | Tilladt totalvægt i kg. |
towbar | boolean | true | DK | Om bilen er registreret med anhængertræk. |
max_trailer_weight_kg | integer | 1500 | DK · NL | Største vægt af en påhængsvogn med bremser, i kg. |
max_trailer_weight_unbraked_kg | integer | 670 | DK · NL | Største vægt af en påhængsvogn uden bremser, i kg. |
status | string | "Registreret" | DK | Registreringsstatus. |
usage | string | "Privat personkørsel" | DK | Anvendelse. |
first_registration | date | "2019-04-25" | DK · NL | Første registrering. |
model_year | integer | 2019 | DK | Modelår. |
vin | string | "WVWZZZAUZKP000000" | DK | Stelnummer (VIN). |
euro_norm | string | "Euro VI" | DK · NL | Euronorm. |
co2_g_km | number | 116 | DK · NL | CO₂-udslip i g/km. |
last_inspection | date | "2025-04-01" | DK | Dato for seneste syn. |
next_inspection | date | "2027-04-25" | NL | Hvornår APK udløber. Kun Holland. |
odometer_km | integer | 77000 | DK | Kilometerstand ved seneste syn. |
odometer_date | date | "2025-04-01" | DK | Datoen for kilometerstanden. |
source | string | "dmr" | DK · NL | dmr (Motorstyrelsen) eller rdw (RDW). |
data_date | date | "2026-11-01" | DK · NL | Datoen for de data, svaret bygger på. |
Eksempel på svar
{
"country": "DK",
"plate": "AB12345",
"make": "Volkswagen",
"model": "Golf",
"variant": "1.5 TSI EVO 150 DSG7",
"make_slug": "volkswagen",
"model_slug": "golf",
"catalog_make_slug": "volkswagen",
"catalog_model_slug": "golf",
"vehicle_type": "Personbil",
"vehicle_type_code": "car",
"body_type": "Stationcar",
"colour": "Rød",
"colour_code": "red",
"doors": 5,
"seats": 5,
"fuel": "Benzin",
"fuel_code": "petrol",
"power_kw": 110,
"engine_volume_cc": 1498,
"cylinders": 4,
"kerb_weight_kg": null,
"total_weight_kg": 1830,
"towbar": true,
"max_trailer_weight_kg": 1500,
"max_trailer_weight_unbraked_kg": 670,
"status": "Registreret",
"usage": "Privat personkørsel",
"first_registration": "2019-04-25",
"model_year": 2019,
"vin": "WVWZZZAUZKP000000",
"euro_norm": "Euro VI",
"co2_g_km": 116,
"last_inspection": "2025-04-01",
"next_inspection": null,
"odometer_km": 77000,
"odometer_date": "2025-04-01",
"source": "dmr",
"data_date": "2026-11-01"
} Koder
Kodefelterne har altid en af disse værdier, så du kan sortere uden at oversætte. Kender vi ikke værdien, er koden other.
vehicle_type_code | car, van, truck, bus, motorcycle, moped, trailer, caravan, tractor, other |
|---|---|
fuel_code | petrol, diesel, electric, hybrid_petrol, hybrid_diesel, plugin_hybrid, lpg, cng, hydrogen, other |
colour_code | black, white, grey, silver, blue, red, green, yellow, orange, brown, beige, purple, other |
Fejlkoder
Ved en fejl får du en HTTP-statuskode og et JSON-svar med feltet error. Fejl tæller ikke som opslag.
{ "error": "not_found" } | Status | error | Betydning |
|---|---|---|
| 400 | unsupported_country | Landet er hverken DK eller NL (i kataloget: dk, nl, fi eller all). |
| 400 | invalid_type | En kode i ?type= findes ikke (kun katalog). |
| 401 | unauthorized | Nøglen mangler, er forkert eller er slået fra. |
| 403 | key_paused | Nøglen er sat på pause på grund af usædvanligt forbrug. Svaret har en message. Skriv til kontakt@platerunner.dk. |
| 404 | not_found | Nummerpladen findes ikke i registret. |
| 429 | rate_limited | Mere end 20 kald i sekundet. Vent det antal sekunder, Retry-After siger. |
| 429 | monthly_limit_reached | Månedens opslag er brugt. Køb en ekstrapakke eller en større plan. |
| 502 | upstream_unavailable | RDW svarer ikke lige nu (kun Holland). Prøv igen om lidt. |
| 503 | catalog_unavailable | Kataloget er midlertidigt ikke tilgængeligt. Prøv igen om lidt. |
| 503 | dk_data_unavailable | De danske data er midlertidigt ikke tilgængelige. Prøv igen om lidt. |
Grænser
- Højst 20 kald i sekundet pr. nøgle. Derover svarer API'et 429 rate_limited med headeren Retry-After.
- Antallet af opslag pr. måned afhænger af din plan. Gratis giver 3.000. Måneden er kalendermåneden i UTC.
- Kun opslag, der lykkes, tæller. Et kald til kataloget tæller som ét opslag.
- Vi skriver til dig, når 80 % og 100 % af månedens opslag er brugt.
- Når månedens opslag er brugt, svarer API'et 429 monthly_limit_reached, indtil måneden skifter, eller du køber en ekstrapakke eller en større plan.
Hvert svar fra /v1/plates og /v1/catalog med en gyldig nøgle, også fejl, har tre headere med månedens forbrug:
| Header | Eksempel | Betydning |
|---|---|---|
X-Lookups-Used | 1234 | Opslag brugt i denne måned, dette kald medregnet. |
X-Lookups-Limit | 15000 | Månedens grænse inkl. ekstrapakker. unlimited på Ubegrænset. |
X-Lookups-Reset | 2026-12-01 | Første dag i næste måned (UTC), hvor opslagene starter forfra. |
Eksempler
Eksemplerne læser nøglen fra miljøvariablen PLATERUNNER_KEY.
curl
curl https://api.platerunner.dk/v1/plates/DK/AB12345 \
-H "Authorization: Bearer DIN_NØGLE" JavaScript
const response = await fetch('https://api.platerunner.dk/v1/plates/DK/AB12345', {
headers: { Authorization: `Bearer ${process.env.PLATERUNNER_KEY}` },
});
if (response.status === 404) {
// The plate is not in the register
} else if (!response.ok) {
const { error } = await response.json();
throw new Error(error);
}
const vehicle = await response.json();
console.log(vehicle.make, vehicle.model, vehicle.power_kw); PHP
<?php
$ch = curl_init('https://api.platerunner.dk/v1/plates/DK/AB12345');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('PLATERUNNER_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$vehicle = json_decode($body, true);
if ($status === 200) {
echo $vehicle['make'] . ' ' . $vehicle['model'];
} else {
echo 'Error: ' . $vehicle['error'];
} Python
import os
import requests
response = requests.get(
"https://api.platerunner.dk/v1/plates/DK/AB12345",
headers={"Authorization": f"Bearer {os.environ['PLATERUNNER_KEY']}"},
timeout=10,
)
if response.status_code == 200:
vehicle = response.json()
print(vehicle["make"], vehicle["model"], vehicle["power_kw"])
else:
print("Error:", response.json()["error"])