Skift fra Synsbasen API til Motorbay: endpoints, felter og en tjekliste
Du kalder i dag Synsbasens API og overvejer at flytte opslag på nummerplade og stelnummer til Motorbay. Her er forskellene i adgang, svarformat og felter, hvad Synsbasen kan ud over 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 Synsbasens API og mest bruger køretøjets grunddata: nummerplade, stelnummer, status, mærke, model, variant, seneste syn og tekniske data. Så kan du som regel flytte til Motorbay på en eftermiddag. Bruger du Synsbasens gældsdata, forsikring, vurderinger, overvågning eller statistik, så læs afsnittet om det, Synsbasen kan ud over Motorbay, før du går videre.
Vi har læst Synsbasens dokumentation og forside den 9. okt. 2026, og alt, hvad der står om Synsbasen 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, vi nævner hos Motorbay, står i OpenAPI-filen, som er API'ets kontrakt.
| Synsbasen | Motorbay | |
|---|---|---|
| Base-URL | https://api.synsbasen.dk/v1 | https://api.motorbay.app/v1 |
| Nøgle | Authorization: Bearer <APIKEY> og Content-Type: application/json | X-Api-Key: <nøgle> |
| Opslag på nummerplade | GET /v1/vehicles/registration/:registration | GET /v1/vehicles/plate/{plate} |
| Opslag på stelnummer | GET /v1/vehicles/vin/:vin | GET /v1/vehicles/vin/{vin} |
| Opslag på ID | GET /v1/vehicles/:id, ID er et heltal | GET /v1/vehicles/{id}, ID er tekst |
| Svarets form | Objektet ligger i data | Køretøjet er selve svaret. Lister har data og metadata |
| Feltnavne | snake_case, fx first_registration_date | camelCase, fx firstRegisteredOn |
| Flere oplysninger | expand[]=emission og andre udvidelser i samme kald | Egne endpoints pr. køretøj, fx /engine og /inspection |
| Datoer | Tekst som yyyy-mm-dd | Dage som …On og tidspunkter i UTC som …At |
| Fejl | HTTP-statuskoderne 400, 401, 403, 404, 429 og 500 | application/problem+json med en stabil code, fx VehicleNotFound |
Samme kilde, forskellige rettelser
Begge bygger på Motorstyrelsens ugentlige udtræk. Synsbasen skriver, at den primært bygger på udtrækket og lægger gæld, forsikring og syn fra andre kilder oven i. Motorbay importerer udtrækket, som det er, uden at rette eller udfylde værdier. Synsbasen skriver til gengæld, at den retter og udfylder fx modelår og EF-typegodkendelse. En værdi kan derfor afvige mellem de to, selv om begge kommer fra samme fil.
Data er data pr. udtrækkets dato, ikke i realtid. Hvert svar fra Motorbay har headeren Motorbay-Data-As-Of med tidspunktet for det udtræk, du får. 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.
Feltoversigt: fra Synsbasen til Motorbay
Tabellerne følger Synsbasens køretøjsobjekt og dets udvidelser. Kolonnen Endpoint siger, hvor Motorbay-feltet ligger: Køretøjet er svaret fra opslag på nummerplade, stelnummer eller ID, og de andre er endpoints under /v1/vehicles/{vehicleId}. Står der Nærmeste felt, er det den bedste match i begge dokumentationer, men ingen af dem siger, at det er det samme. Sammenlign dem på en stikprøve, før du stoler på dem.
Køretøjet
| Synsbasen | Motorbay | Endpoint | Bemærkning |
|---|---|---|---|
id | id | Køretøjet | Heltal hos Synsbasen, tekst hos Motorbay. Gå ikke ud fra, at værdierne er ens. Slå op på nummerplade eller stelnummer og gem Motorbays ID. |
registration | registrationNumber | Køretøjet | null, når køretøjet ikke har en nummerplade. |
vin | vin | Køretøjet | Samme navn. |
first_registration_date | firstRegisteredOn | Køretøjet | En dag, eller null. |
status | status | Køretøjet | Danske tekster hos Synsbasen, faste værdier hos Motorbay. Se værditabellen. |
status_updated_at | statusUpdatedAt | Køretøjet | Tidspunkt i UTC, ikke kun en dag. |
registration_status | registrationStatus | Køretøjet | Se værditabellen. |
registration_status_updated_at | registrationStatusUpdatedAt | Køretøjet | Tidspunkt i UTC, eller null. |
kind | kind | Køretøjet | Objekt med id, name og originalName. Navnet er dansk, fx Personbil, så læs kind.name. |
usage | primaryUsage | Køretøjet | Nærmeste felt. Objekt som kind. Motorbay har også GET /v1/vehicles/{vehicleId}/secondary-usages. |
brand | make | Køretøjet | Objekt, læs make.name. |
model, variant | model, variant | Køretøjet | Objekter, eller null hvis køretøjet ingen har. |
version | designationType | Køretøjet | Nærmeste felt. Motorstyrelsens typebetegnelse, objekt eller null. |
brand_id, model_id, variant_id | makeId, modelId, variantId | Køretøjet | Tekst hos begge. Sammenlign værdierne, før du bruger dem som nøgler. |
color (under expand[]=body) | color | Køretøjet | Objekt, læs color.name. Hos Motorbay ligger farven på køretøjet selv. |
model_year | modelYear | /technical-details | Hos Motorbay værdien fra udtrækket. Synsbasen retter og udfylder den. |
category | typeApprovedCategory | /technical-details | Nærmeste felt. |
fuel_type | fuelType.name | /fuel-types | Én værdi hos Synsbasen, en liste hos Motorbay med det primære drivmiddel først. Navnene er danske, fx Benzin. |
mileage | odometerReading | /engine | Nærmeste felt. Motorbay opgiver tusinde km: 228 betyder ca. 228.000 km. Synsbasens enhed er km. |
ncap_five | hasFiveStarNcapRating | /technical-details | Sandt eller falsk. |
eu_version, eu_variant | euVersion, euVariant | /technical-details | Samme indhold, nye navne. |
ec_type_approval | typeApprovalNumber | /technical-details | Nærmeste felt. Motorbay har ingen rettet udgave som ec_type_approval_corrected. |
extra_equipment | additionalEquipment | /technical-details | Nærmeste felt. |
body_type | bodyType | /technical-details | En fast liste af værdier, fx sedan, hatchback og stationcar. |
Seneste syn
| Synsbasen | Motorbay | Endpoint | Bemærkning |
|---|---|---|---|
last_inspection_date | inspectedOn | /inspection | En dag. |
last_inspection_result | result | /inspection | Se værditabellen. |
last_inspection_kind | type | /inspection | Se værditabellen. |
mileage (på /v1/inspections/:id) | odometerReading | /inspection | Nærmeste felt. Synsbasen opgiver km, Motorbay tusinde km. |
| Ikke i det samme objekt | status, statusUpdatedOn | /inspection | Synets status og dagen, den ændrede sig. Værdien er i dag altid active. |
Hos Synsbasen ligger de tre last_inspection_*-felter på køretøjet. Hos Motorbay er seneste syn sit eget kald, og det svarer 204 uden indhold, når der ikke er noget syn at vise. Behandl 204 som "intet syn", ikke som en fejl.
Motor, miljø og drivmidler
| Synsbasen | Motorbay | Endpoint | Bemærkning |
|---|---|---|---|
emission.co2 | co2Emission | /fuel-types | Nærmeste felt. g/km pr. drivmiddel. Brug ikke co2Emission fra /environmental-information, det er et tal for lastbiler i g/tkm. |
emission.co | coEmission | /environmental-information | mg/km. |
emission.hc_plus_nox | hcPlusNoxEmission | /environmental-information | mg/km. |
emission.nox | noxEmission | /environmental-information | mg/km. |
emission.particles | particleEmission | /environmental-information | mg/km. |
emission.particle_filter | hasParticleFilter | /environmental-information | Sandt eller falsk. |
emission.smoke_density, emission.smoke_density_engine_speed | smokeDensity, smokeDensityRpm | /environmental-information | Samme to størrelser. |
emission.euronorm | emissionStandard | Køretøjet | Objekt, læs emissionStandard.name. Skrivemåden kan være en anden: Synsbasens dokumentation viser Euro V, Motorbays OpenAPI nævner Euro 6 som eksempel. |
engine.engine_power | maximumPower | /engine | kW begge steder. |
engine.engine_displacement | displacement | /engine | cm³ begge steder. |
engine.cylinders | cylinderCount | /engine | Samme indhold. |
engine.engine_code | engineMarking | /engine | Nærmeste felt. |
engine.top_speed | maximumSpeed | /technical-details | km/h. |
engine.gears | numberOfGears | /technical-details | Samme indhold. |
engine.fuel_efficiency | kilometersPerLiter | /fuel-types | km/l. Synsbasen opgiver ét samlet tal, Motorbay et tal pr. drivmiddel. |
engine.electricity_efficiency | electricConsumption | /fuel-types | Wh/km hos Motorbay. Synsbasens dokumentation bruger Wh/km under engine og km/kWh under fuel_types, så tjek enheden. |
fuel_types[].name, primary_fuel, fuel_cell | fuelType.name, isPrimary, hasFuelCell | /fuel-types | En liste med sider, primært drivmiddel først. |
Vægt, mål og udstyr
| Synsbasen | Motorbay | Endpoint | Bemærkning |
|---|---|---|---|
weight.technical_total_weight | technicalTotalWeight | /technical-details | kg. |
weight.total_weight | totalWeight | /technical-details | kg. |
weight.vehicle_weight | ownWeight | /technical-details | Nærmeste felt. kg. |
weight.driveable_weight_minimum, weight.driveable_weight_maximum | minimumRoadWorthyWeight, maximumRoadWorthyWeight | /technical-details | Nærmeste felt. Køreklar vægt, kg. |
weight.road_train_weight | roadTrainWeight | /technical-details | kg. |
weight.coupling_device | isCouplingPossible | /technical-details | Nærmeste felt. Sandt eller falsk. |
weight.trailer_with_brakes_weight_maximum, weight.trailer_without_brakes_weight_maximum | couplingWeightWithBrakes, couplingWeightWithoutBrakes | /technical-details | kg. |
weight.trailer_total_weight_maximum | trailerTotalWeight | /technical-details | kg. |
axle.axles | axleCount | /technical-details | Samme indhold. |
axle.axle_track | axleDistance | /technical-details | Nærmeste felt. mm. |
axle.pulling_axles | drivingAxles | /technical-details | Nærmeste felt. Tekst. |
body.doors, body.passengers | numberOfDoors, passengerCount | /technical-details | Heltal. |
body.seats_minimum, body.seats_maximum | minimumSeats, maximumSeats | /technical-details | Heltal. |
body.track_width_front, body.track_width_rear | frontTrackWidth, rearTrackWidth | /technical-details | mm. |
body.vin_placement, body.rims_and_tires | vinPlacement, wheelAndTire | /technical-details | Nærmeste felt for hjul og dæk. Tekst. |
equipment[].name, equipment[].quantity | name, count | /equipment | En liste med sider (page, pageSize). Navnet er Motorstyrelsens, og originalName ændrer sig aldrig. Sammenlign skrivemåden, før du matcher på tekst. |
Værdier
Synsbasen bruger Motorstyrelsens danske tekster som værdier. Motorbay bruger faste værdier i camelCase. Navnene på art, anvendelse, mærke, farve og drivmiddel er derimod stadig danske tekster i name. Motorbays lister over værdier står i OpenAPI-filen.
| Felt | Synsbasen | Motorbay |
|---|---|---|
status | Oprettet | created |
status | Registreret | registered |
status | Afmeldt | deregistered |
status | Skrottet | scrapped |
status | Eksporteret | exported |
status | Slettet | deleted |
status | UnderOprettelse | underCreation |
status | DelvistOprettet | partiallyCreated |
status | AdministrativOprettelse | administrativeCreation |
status | HarGennemførtRegistreringssyn | completedRegistrationInspection |
registration_status | Registreret | registered |
registration_status | Afmeldt | deregistered |
registration_status | UnderUdarbejdelse | pending |
last_inspection_result | Godkendt | approved |
last_inspection_result | IkkeFuldstaendigtSyn | incomplete |
last_inspection_result | IkkeGodkendt | rejected |
last_inspection_result | IkkeGodkendtKanGenfremstilles | rejectedReinspectionAllowed |
last_inspection_result | KanGodkendesVedOmsynAfOmsynsvirksomhed | reinspectionCompanyReinspectionAllowed |
last_inspection_result | KanGodkendesVedOmsynAfSynsvirksomhed | inspectionCompanyReinspectionAllowed |
last_inspection_kind | KontrolSyn | scrutiny |
last_inspection_kind | MOT | mot |
last_inspection_kind | PeriodiskSyn | periodic |
last_inspection_kind | RegistreringsSyn | registration |
last_inspection_kind | RegistreringssynToldsyn | customs |
Motorbays status har tre værdier, som Synsbasens dokumenterede liste ikke viser: exportMarking, declaredByImporter og declaredByImporterAndDealer. Motorbays registrationStatus har desuden unknown. Skriv derfor en default-gren, når du oversætter værdierne i din kode.
Det, Synsbasen kan ud over Motorbay
Det her bruger du måske i dag. Motorbay har det ikke, så læs listen, før du flytter noget.
- Gæld:
tinglysning_datagiver hæftelser og meddelelser fra Tinglysningen, fx om konkurs. Motorbay har ingen gældsdata. - Forsikring og næste syn:
dmr_dataslår live op hos DMR og giver forsikringsselskab og forsikringsstatus, datoen for næste periodiske syn og indkaldelser. Motorbay har ingen af delene. - Vurderinger:
appraisalsgiver vurderinger af værdi og registreringsafgift. Motorbay har ingen vurderinger. - Opslag samme uge:
dmr_fallback=trueslår nye eller ændrede nummerplader op live, før næste udtræk er hentet. Motorbay svarer kun fra det seneste udtræk og er ikke i realtid. - Overvågning og webhooks: med
watched_vehiclesog webhooks får du besked, når et køretøj ændrer sig, eller et nyt syn kommer til. Motorbay har ingen webhooks. Du kan læseMotorbay-Data-As-OfellerGET /v1/datasetfor at se, om et nyt udtræk er importeret. - Søgning og statistik:
POST /v1/vehicles/searchhar søgeprædikater,COUNT, gennemsnit og gruppering. MotorbaysGET /v1/vehiclesfiltrerer på mærke, art, anvendelse, farve, modelår og nummerplade, men tæller og grupperer ikke. - Alle syn:
/v1/inspectionsgiver hvert syn med testcenter, fejlkoder, PDF og dokumentation. Motorbay giver kun det seneste syn med type, dag, resultat og kilometerstand. - Spærringer, tilladelser og leasing:
registration_blocks,permits,leasing_periodsogleasing_period_start. Motorbay har dem endnu ikke. De er under udvikling. - Rettede og beregnede felter: rettet modelår og EF-typegodkendelse, energiklasse, miljøzonestatus, hestekræfter, kilometer pr. år, alder og estimeret næste syn. Motorbay giver værdierne, som de står i udtrækket.
- Øvrige udvidelser: periodiske afgifter, EU Safety Gate-varsler, nummerpladegenkendelse på billeder, nummerplader til forhandlere og widgets til forhandlersider. Motorbay har ingen af dem.
Synsbasen tilbyder også en Postman-samling og en Ruby-gem. Motorbay har en OpenAPI-fil, så du kan generere en klient i dit eget sprog. Bruger du noget fra listen i produktion, kan du godt køre begge: behold Synsbasen til det, Motorbay ikke har, og flyt opslagene på grunddata.
Et opslag på nummerplade før og efter
Eksemplerne bruger pladen AB12345 som pladsholder. Først curl. Synsbasens svar kommer med alt, du beder om med expand. Hos Motorbay henter du motor og miljø fra hvert sit endpoint med køretøjets id.
curl -i -H "Authorization: Bearer $SYNSBASEN_API_KEY" \
"https://api.synsbasen.dk/v1/vehicles/registration/AB12345" curl -i -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/vehicles/plate/AB12345"
# Det, Synsbasen giver med expand[]=engine og expand[]=emission,
# henter du pr. køretøj med id fra svaret ovenfor:
curl -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/vehicles/$VEHICLE_ID/engine"
curl -H "X-Api-Key: $MOTORBAY_API_KEY" \
"https://api.motorbay.app/v1/vehicles/$VEHICLE_ID/environmental-information" Så JavaScript med fetch. Begge funktioner returnerer det samme objekt, og begge giver null, når pladen ikke findes. 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://api.synsbasen.dk/v1/vehicles/registration/" + encodeURIComponent(plate), {
headers: {
Authorization: "Bearer " + process.env.SYNSBASEN_API_KEY,
"Content-Type": "application/json",
},
});
if (res.status === 404) return null;
if (res.status === 429) throw new Error("Synsbasen: too many requests");
if (!res.ok) throw new Error("Synsbasen: HTTP " + res.status);
const { data } = await res.json();
return {
plate: data.registration,
vin: data.vin,
firstRegistered: data.first_registration_date,
make: data.brand,
model: data.model,
};
} 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(); // no data wrapper
return {
plate: vehicle.registrationNumber,
vin: vehicle.vin,
firstRegistered: vehicle.firstRegisteredOn,
make: vehicle.make.name,
model: vehicle.model?.name ?? null,
};
} Nummerplader genbruges. Hos Motorbay giver opslaget det køretøj, der er registreret med pladen nu. Synsbasen skriver, at opslaget giver det seneste køretøj med pladen, så sammenlign de to på plader, der har siddet på flere køretøjer. Vil du se alle køretøjer, der har haft pladen, så brug GET /v1/vehicles?registrationNumber=.
Pris ved dit volumen
Synsbasen sælger månedlige abonnementer med 500, 2.500 eller 12.500 forespørgsler inkluderet. Forespørgsler ud over det koster et fast beløb stykket, og nogle udvidelser koster tokens. Aktuelle priser står på Synsbasens side. Synsbasen skriver, at kun forespørgsler, der svarer 200, tæller med i kvoten.
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. Ét kald hos Synsbasen med
expandkan give det, der hos Motorbay er flere kald. Et opslag på nummerplade plus motor og seneste syn er tre kald, 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 Synsbasens eller Motorbays navne.
- Oversæt felterne med tabellerne her, og tilføj kun de underendpoints, du bruger:
/inspection,/engine,/technical-details,/environmental-information,/fuel-typesog/equipment. - 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, rettede felter hos Synsbasen, 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 Synsbasen-nøglen stå, til der er kommet mindst ét nyt udtræk.
- Opsig bagefter, hvis du ikke bruger noget, Synsbasen har ud over Motorbay.
Kilderne er Motorstyrelsens egne sider, Motorstyrelsens udtræk og Motorbays API-dokumentation.