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

Få en gratis 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.

FeltTypeEksempelLandeBeskrivelse
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_codecar, van, truck, bus, motorcycle, moped, trailer, caravan, tractor, other
fuel_codepetrol, diesel, electric, hybrid_petrol, hybrid_diesel, plugin_hybrid, lpg, cng, hydrogen, other
colour_codeblack, 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" }
StatuserrorBetydning
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

Hvert svar fra /v1/plates og /v1/catalog med en gyldig nøgle, også fejl, har tre headere med månedens forbrug:

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

Se priserne

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"])