Skift fra MotorAPI.dk til Motorbay: endpoints, felter og en tjekliste
Du kalder i dag MotorAPI.dk og overvejer at flytte opslag på nummerplade og stelnummer til Motorbay. Her er forskellene i adgang og endpoints, hvad MotorAPIs dokumentation siger om felter, hvor felterne ligger hos Motorbay, kode før og efter, og en plan for at skifte uden at gætte.
Af Motorbay · Sidst tjekket
Hvem vejledningen er til, og hvad der ændrer sig
Vejledningen er til dig, der kalder MotorAPI til opslag på nummerplade eller stelnummer og vil flytte til Motorbay. Der er tre ting, der ændrer sig i din kode: adressen og nøglen, at opslag på nummerplade og stelnummer er to endpoints, og at miljø og udstyr hentes med køretøjets ID i stedet for med pladen.
Vi har læst MotorAPIs dokumentation og forside den 9. okt. 2026, og alt, hvad der står om MotorAPI her, kommer derfra. Motorbay er et REST API til danske køretøjsdata fra Motorstyrelsens offentlige ugentlige udtræk. Hvad udtrækket er, forklarer Motorregistret som API. Hvert felt og hver sti, vi nævner hos Motorbay, står i OpenAPI-filen, som er API'ets kontrakt.
| MotorAPI | Motorbay | |
|---|---|---|
| Base-URL | https://v1.motorapi.dk | https://api.motorbay.app/v1 |
| Nøgle | Headeren X-AUTH-TOKEN | Headeren X-Api-Key |
| Opslag på nummerplade eller stelnummer | GET /vehicles/{reg-no-or-vin}, ét endpoint til begge | GET /v1/vehicles/plate/{plate} og GET /v1/vehicles/vin/{vin} |
| Miljø | GET /vehicles/{reg-no-or-vin}/environment | GET /v1/vehicles/{vehicleId}/environmental-information og /fuel-types |
| Udstyr | GET /vehicles/{reg-no-or-vin}/equipment | GET /v1/vehicles/{vehicleId}/equipment, en liste med sider |
| Liste over køretøjer | GET /vehicles med registration_number og valgfrit status | GET /v1/vehicles?registrationNumber=, en liste med sider uden statusfilter |
| Ikke fundet | 404 | 404 med koden VehicleNotFound |
| Brug | GET /usage, gratis og tæller ikke med | Intet endpoint til eget forbrug i OpenAPI-filen |
| Fejl | Dokumentationen nævner 404 og, for /usage, 401 | application/problem+json med en stabil code |
Hvad dokumentationerne siger om data
MotorAPIs dokumentation siger ikke, hvilken kilde dataene kommer fra, eller hvor ofte de opdateres. Derfor skriver vi heller ikke noget om det her. Motorbay importerer Motorstyrelsens ugentlige udtræk, som det er, uden at rette eller udfylde værdier. Data er data pr. udtrækkets dato, ikke i realtid, og hvert svar fra Motorbay har headeren Motorbay-Data-As-Of med tidspunktet for det udtræk, du får.
Kommer to værdier ikke fra samme dato, kan de afvige. Det er den første ting at kigge efter, når du sammenligner. Motorstyrelsen yder ikke support på brug af udtrækket og kan ikke garantere, at opdateringerne finder sted.
Motorbay har ingen tilknytning til Motorstyrelsen. Motorbay leverer tekniske oplysninger om køretøjer, ikke om personer.
Felter: hvad der er dokumenteret, og hvor de ligger hos Motorbay
MotorAPIs dokumentationsside beskriver endpoints, nøgle og fejl, men ikke svarets felter. Vi kan derfor ikke give dig en tabel, der kobler MotorAPIs feltnavne til Motorbays, uden at gætte, og det gør vi ikke. Du har feltnavnene i din egen kode og i de svar, du har gemt. Brug dem sammen med tabellen herunder, der viser, hvor Motorbay lægger hver slags oplysning.
| Oplysning | Motorbay-felter | Endpoint |
|---|---|---|
| Nummerplade og stelnummer | registrationNumber, vin | Køretøjet |
| Status | status, statusUpdatedAt, registrationStatus, registrationStatusUpdatedAt | Køretøjet |
| Første registrering | firstRegisteredOn | Køretøjet |
| Art og anvendelse | kind, primaryUsage | Køretøjet |
| Mærke, model og variant | make, model, variant, designationType | Køretøjet |
| Farve | color | Køretøjet |
| Euronorm | emissionStandard | Køretøjet |
| Modelår, vægte, aksler, sæder, døre og mål | modelYear, totalWeight, ownWeight, axleCount, minimumSeats, maximumSeats, numberOfDoors, isCouplingPossible og flere | /technical-details |
| Karrosseri | bodyType | /technical-details |
| Cylindre, slagvolumen og effekt | cylinderCount, displacement, maximumPower | /engine |
| Kilometerstand | odometerReading, i tusinde km | /engine |
| Drivmidler, forbrug og CO₂ | fuelType, isPrimary, kilometersPerLiter, electricConsumption, co2Emission | /fuel-types |
| Udledninger og partikelfilter | coEmission, hcPlusNoxEmission, noxEmission, particleEmission, hasParticleFilter | /environmental-information |
| Seneste syn | inspectedOn, type, result, odometerReading | /inspection |
| Udstyr | name, originalName, count | /equipment |
Sådan kobler du felterne
- Gem svar. Tag nogle hundrede svar fra MotorAPI fra din egen log, eller kald API'et for en stikprøve af plader.
- Skriv de felter ned, din kode læser. Det er dem, der skal findes hos Motorbay, ikke alle, MotorAPI sender.
- Find hvert felt i tabellen, og slå det op i OpenAPI-filen for enhed og format.
- Sammenlign værdierne for de samme plader hos begge, felt for felt.
Formater hos Motorbay
- Navne: camelCase. Art, anvendelse, mærke, model, variant, farve og euronorm er objekter med
id,nameogoriginalName.nameer Motorstyrelsens danske tekst, fx Personbil. - Datoer: dage hedder
…Onog eryyyy-mm-dd. Tidspunkter hedder…Atog er UTC. - Værdier: status og syn bruger faste værdier som
registered,deregistered,approvedogperiodic. De står i OpenAPI-filen. - ID'er: tekst. Behandl dem som uigennemsigtige.
- Kilometerstand: i tusinde km. 228 betyder ca. 228.000 km.
- Tomme svar:
/inspection,/engineog/environmental-informationsvarer 204 uden indhold, når der ikke er noget at vise.
Det, MotorAPI kan ud over Motorbay
Det er ikke meget, men læs listen, før du flytter. Alt her er fra MotorAPIs dokumentation.
- Ét endpoint til plade og stelnummer. MotorAPI tager begge i
GET /vehicles/{reg-no-or-vin}. Hos Motorbay vælger du selv endpoint, så hvis din kode ikke ved, hvad den har fået, skal den afgøre det først. - Miljø og udstyr direkte på pladen. Hos MotorAPI bruger
/environmentog/equipmentpladen eller stelnummeret. Hos Motorbay skal du først slå køretøjet op og bruge detsid, så et opslag med miljø og udstyr er tre kald. - Et statusfilter på listen. MotorAPI kan filtrere
GET /vehiclespåregistreretellerafmeldt. MotorbaysGET /v1/vehiclesfiltrerer på mærke, art, anvendelse, farve, modelår og nummerplade. LæsregistrationStatuspå hvert køretøj og filtrer i din kode. - Et brugsendpoint.
GET /usagegiver dagens forbrug og månedshistorik uden at tælle med i kvoten. OpenAPI-filen har intet endpoint til eget forbrug.
Dokumentationerne beskriver opslaget på en plade forskelligt. MotorAPI beskriver /vehicles/{reg-no-or-vin} som opslag på et køretøj, der er registreret nu. Motorbay giver det køretøj, der er registreret med pladen nu, og hvis ingen er det, det køretøj med den nyeste registreringsstatusdato, hvor registrationStatus fortæller, at det ikke er registreret. Test derfor plader på afmeldte køretøjer i din stikprøve, og læs registrationStatus.
Motorbays OpenAPI-fil har ingen webhooks, gældsdata eller forsikringsdata, og MotorAPIs dokumentation nævner heller ikke nogen af delene. Hvis du har brug for en af dem, er det ikke et skift, men et andet valg.
Et opslag på nummerplade før og efter
Eksemplerne bruger pladen AB12345 som pladsholder. Først curl. Hos Motorbay henter du miljø og udstyr med køretøjets id fra det første svar.
curl -i -H "X-AUTH-TOKEN: $MOTORAPI_TOKEN" \
"https://v1.motorapi.dk/vehicles/AB12345" curl -i -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/vehicles/plate/AB12345"
# Miljø og udstyr ligger på køretøjets id fra svaret ovenfor:
curl -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/vehicles/$VEHICLE_ID/environmental-information"
curl -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/vehicles/$VEHICLE_ID/equipment" Så JavaScript med fetch. Begge funktioner giver null, når pladen ikke findes. MotorAPIs dokumentation nævner ikke, hvad der sker, når en grænse nås, så den gamle kode tjekker kun 404 og ellers res.ok. Hos Motorbay venter koden på Retry-After én gang ved RateLimitExceeded (60 i minuttet pr. nøgle) og giver op ved QuotaExceeded, fordi månedens forespørgsler så er brugt.
async function lookupPlate(plate) {
const res = await fetch("https://v1.motorapi.dk/vehicles/" + encodeURIComponent(plate), {
headers: { "X-AUTH-TOKEN": process.env.MOTORAPI_TOKEN },
});
if (res.status === 404) return null;
if (!res.ok) throw new Error("MotorAPI: HTTP " + res.status);
return res.json(); // the whole object, with the field names you use today
} const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function lookupPlate(plate, retried = false) {
const res = await fetch("https://api.motorbay.app/v1/vehicles/plate/" + encodeURIComponent(plate), {
headers: { "X-Api-Key": process.env.MOTORBAY_API_KEY },
});
if (res.status === 404) return null; // VehicleNotFound
if (res.status === 429) {
const problem = await res.json();
if (problem.code === "QuotaExceeded" || retried) throw new Error("Motorbay: " + problem.code);
await sleep(Number(res.headers.get("Retry-After") ?? 1) * 1000);
return lookupPlate(plate, true);
}
if (!res.ok) throw new Error("Motorbay: HTTP " + res.status);
const vehicle = await res.json();
return {
id: vehicle.id, // use it for /engine, /equipment and the other sub-resources
plate: vehicle.registrationNumber,
vin: vehicle.vin,
registrationStatus: vehicle.registrationStatus, // 'registered', 'deregistered', ...
make: vehicle.make.name,
model: vehicle.model?.name ?? null,
};
} Nummerplader genbruges, så en plade kan have siddet på flere køretøjer. Vil du se dem alle, så brug GET /v1/vehicles?registrationNumber=.
Pris ved dit volumen
MotorAPI viser sine priser på forsiden, og der står også, hvordan opslag opgøres og faktureres. Læs dem dér, så får du de gældende tal. Forsiden tilbyder også 100 gratis opslag hver dag. Hvilke abonnementer Motorbay har, og hvad de koster, står på Motorbays prisside.
Hos Motorbay starter du gratis uden betalingskort, og de betalte abonnementer har en fast pris pr. måned med forespørgsler inkluderet og derefter en fast pris pr. forespørgsel. Priserne og en beregner står på prissiden, og de læses fra API'et, så de står ikke her.
- Tæl kald, ikke opslag. Et opslag på nummerplade plus miljø og udstyr er tre kald hos Motorbay, og hvert kald er en forespørgsel.
- Brug kun de endpoints, du bruger. Har du kun brug for mærke, model og stelnummer, er opslaget på nummerplade nok.
- Indtast tallene i beregneren. Tag antallet af kald pr. måned fra din egen log, ikke fra et skøn.
Skift over på en eftermiddag: tjekliste
Kør begge API'er side om side, indtil du har set, at forskellene er dem, du forventer.
- Opret en konto og en API-nøgle, og kør curl-eksemplet med en plade fra din egen test.
- Saml opslaget ét sted. Lav en funktion, der returnerer dine egne feltnavne, så resten af koden hverken kender MotorAPIs eller Motorbays navne.
- Koble felterne med tabellen og trinene ovenfor, og tilføj kun de underendpoints, du bruger.
- Skil plade og stelnummer ad, hvis din kode i dag sender begge til samme endpoint.
- **Læs
registrationStatus,** så afmeldte køretøjer ikke bliver behandlet som registrerede. - Kør begge parallelt. Slå en stikprøve på nogle hundrede plader fra din egen log op hos begge, og sammenlign felt for felt.
- Sortér forskellene. Typiske årsager er udtrækkets dato, tusinde km, skrivemåden af euronorm og udstyr, og plader med flere køretøjer.
- Håndtér 404, 429 og 204. 404 er
VehicleNotFound, 429 kan væreRateLimitExceededellerQuotaExceeded, og 204 betyder, at underressourcen er tom. - **Gem
Motorbay-Data-As-Of** sammen med det, du gemmer, så du ved, hvor gamle dine data er. - Skift trafikken gradvist, fx med en feature-flag, og lad MotorAPI-nøglen stå, til der er kommet mindst ét nyt udtræk.
Kilderne er Motorstyrelsens egne sider, Motorstyrelsens udtræk og Motorbays API-dokumentation.