vin
, registration
, status
, brand
, mileage
etc. but also includes more advanced information eg. emission, weight, permits and equipment and much more. Additionally our API includes information from the Danish Road Traffic Authority (Færdelsstyrelsen) regarding vehicle inspections and test centers.
The Synsbasen API primarily relies on the XML export of the entire vehicle registry, provided weekly by DMR through their public FTP server. We download and update our data to the most recent export every week. Most information included in the DMR export is available through our API V1. We also combine the vehicle data with additional information about debt, insurance and inspections from other data sources.
Feel free to submit suggestions/feature requests to info@synsbasen.dk.
We have created a forkable Postman collection. The collection contains examples of our most common requests. We regularly expand the collection with new examples.
NB: Remember to update the collection variables with your own private API key.
Authorization: Bearer <APIKEY>
Content-Type: application/json
Your API keys carry many privileges, so be sure to keep them secure! Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth.
Requests without authentication will fail - this also applies to free endpoints. Sign up now and get a free API key.
expand
query parameter on supported endpoints.
Expandable resources are noted in this documentation both in the request- and response parameters wherever expanded resourses is available.
Example
The vehicles endpoint includes 14 expandable resources. You can include the emission data by adding ?expand[]=emission
to the request of the vehicles endpoint.
You can expand multiple attributes at once by including multiple query parameters eg. ?expand[]=emission&expand[]=weight
.
See vehicles for the complete list of expandable resources.
{
"data": {
"id": 1004501200018020,
"registration": "AS87640",
"vin": "VF7X1REVF72378327",
...,
"emission": {
"co2": 100.0,
"co": 274.9,
"hc_plus_nox": 0.0,
"nox": 25.5,
"particles": null,
"particle_filter": false,
"smoke_density": null,
"smoke_density_engine_speed": 0,
"energy_class": "A++",
"euronorm": "Euro V"
}
}
}
query
object is called search matchers and consists of the name of the attribute concatenated with a predicate
. The predicate determines how to match the attribute with the search value.
For instance, using registration_start
on the vehicles endpoint will only return vehicles where registration
starts with the given search value. Note all predicates are by default case sensitive with the exception of *_i_cont
.
See available search attributes in the documentation of the individual resources.
SELECT
.
The available methods are:
- COUNT
- SELECT
- PERCENTAGE
Note: The token cost of a resource is the same regardless of the method used.AVG()
, but in the future we will support more functions.
Example
You can calculate the average mileage with the following: select: "AVG(mileage)"
NB: You can only specify a single column for now.group_by
is often used with aggregate functions, which you can read more about in the request parameters select
and method
. Group by supports the following functions:
- YEAR(:attribute)
- QUARTER(:attribute)
- MONTH(:attribute)
- WEEK(:attribute)
- DAY(:attribute)
- ROUND(:attribute)
- ROUND(:attribute, :precision)
- NEAREST(:attribute, :precision)
- SUBSTRING(:attribute, :position, :length)
- CONCAT(:attribute, :attribute, ...)
ASC/DESC
.
You can parse multiple sorting arguments as an array eg. sorts: ["registration ASC", "first_registration_date DESC"]
.RELATIVE
. The available types are:
RELATIVE: Calculates the percentage based on the sum of each group. This means the values within each group are expressed as a percentage of the group's total.
TOTAL: Calculates the percentage based on the total sum of the column. This means the values within each group are expressed as a percentage of the total sum of the column of all groups combined.
The percentage type is only used with method: 'PERCENTAGE'
.COUNT
, the data will be a hash. If the method is SELECT
, the data will be an array.LIKE
clause in a SQL query with a wildcard suffix.LIKE
clause in a SQL query with a wildcard prefix.LIKE
clause in a SQL query with surrounding wildcards.ILIKE
clause in a SQL query with surrounding wildcards.WHERE
clause in a SQL query with an IN
operatorWHERE
clause in a SQL query with a NOT IN
operator.{
"query": {
"registration_start": "AS876"
},
"method": "SELECT",
"page": 1,
"per_page": 10,
"sorts": "registration ASC"
}
{
"data": [
{
"id": 1004501200018020,
"registration": "AS87640",
"vin": "VF7X1REVF72378327",
...
},
{
...
},
{
"id": 1004501200018020,
"registration": "AS87644",
"vin": "VF7X1REVF72378327",
...
}
],
"has_more": true,
"page": 1,
"total_pages": 2,
"total_count": 18,
"per_page": 10
}
{
"data": {
"tokens": 1337
}
}
brand
, model
, fuel type
, mileage
, registration status
etc.
You can get a specific vehicle record by providing either the unique id
, vin
or registration
in the request. When multiple vehicles share the same registration the endpoint will return the most recent vehicle associated with the specified registration.
The vehicles endpoint also supports 14 expandable resources including weight, emission, periodic taxes and much more. To use expand your active subscription must include the expand capability. Read more about using expand here.
Additionally the vehicles endpoint also supports searching. To use search your active subscription must include the search capability. See search for more information.
emission.co2
- emission.co
- emission.hc_plus_nox
- emission.nox
- emission.particles
- emission.particle_filter
- emission.smoke_density
- emission.smoke_density_engine_speed
- emission.euronorm
- engine.fuel_efficiency
- engine.electricity_efficiency
- body.color
See the search endpoint for more information regarding supported predicates
.id
- registration
- vin
- first_registration_date
- registration_status
- registration_status_updated_at
- kind
- usage
- model_year
- fuel_type
- mileage
- extra_equipment
- brand_id
- model_id
- variant_id
- version_id
- co2
- co
- hc_plus_nox
- nox
- particles
- particle_filter
- smoke_density
- smoke_density_engine_speed
- technical_total_weight
- total_weight
- vehicle_weight
- driveable_weight_minimum
- driveable_weight_maximum
- v_value_air_suspension
- v_value_mechanical_suspension
- road_train_weight
- coupling_device
- coupling_device_load_maximum
- trailer_with_brakes_weight_maximum
- trailer_without_brakes_weight_maximum
- trailer_total_weight_maximum
- axles
- axle_track
- pulling_axles
- drive_shaft_pressure_maximum
- trailer_allowed_pressure_maximum
- doors
- vin_placement
- track_width_front
- track_width_rear
- passengers
- seats_minimum
- seats_maximum
- standing_passengers_minimum
- standing_passengers_maximum
- rims_and_tires
- fuel_efficiency
- electricity_efficiency
- top_speed
- cylinders
- engine_displacement
- engine_power
- color_id
- color
- gears
- euronorm
- ncap_five
- last_inspection_date
- last_inspection_result
- last_inspection_kind
- category
- engine_code
- suitable_for_taxi
- eu_version
- eu_variant
- ec_type_approval
- body_type
- brand
- model
- variant
- version
- inspection_frequency
- next_inspection_date
- insurance_company
- insurance_status
- insurance_policy_number
- insurance_created_at
- cached_at
- inspection_invocations
- status
- status_updated_at
- horsepower
- mileage_annual_average
- energy_class
- power_to_weight_ratio
- age
- electricity_efficiency_measured
- battery_capacity
- electric_range
- plugin_hybrid
- automatic_transmission
- last_modification
- next_inspection_date_estimate
- brand_and_model
- fuel_type_extended
- emission_class
- emission_class_id
- allowed_in_environmental_zones
See the search endpoint for more information regarding group_by
.yyyy-mm-dd
yyyy-mm-dd
yyyy-mm-dd
first_registration_date
and last_inspection_date
. If either of these are null, the average mileage will also return null. Otherwise the mileage
is divided by the number of years.yyyy-mm-dd
.yyyy-mm-dd
.
The date is estimated based on available data and is not guaranteed to be correct. You can use the DMR data endpoint to get the official date of the next periodic inspection. Read more about the frequency of periodic inspections here.yyyy-mm-dd
representing the start date of the current leasing period. Returns null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.yyyy-mm-dd
representing the end date of the current leasing period. Returns null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.{
"data": {
"id": 1004501200018020,
"registration": "AS87640",
"vin": "VF7X1REVF72378327",
"first_registration_date": "2000-08-14",
"status": "Skrottet",
"status_updated_at": "2016-04-18",
"registration_status": "Afmeldt",
"registration_status_updated_at": "2016-04-18",
"kind": "Personbil",
"usage": "Privat personkørsel",
"category": "M1",
"model_year": null,
"fuel_type": "Benzin",
"mileage": 407000,
"mileage_annual_average": 25432,
"brand_and_model": "CITROËN XANTIA",
"brand": "CITROËN",
"brand_id": "10045",
"model": "XANTIA",
"model_id": "10045053",
"variant": "2,0 I 16 V",
"variant_id": "1004505304",
"version": "UOPLYST",
"version_id": "10045053040000000",
"body_type": null,
"eu_version": null,
"eu_variant": null,
"ec_type_approval": null,
"last_inspection_date": "2020-04-20",
"last_inspection_result": "Godkendt",
"last_inspection_kind": "PeriodiskSyn",
"next_inspection_date_estimate": "2022-04-20",
"ncap_five": true,
"leasing_period_start": null,
"leasing_period_end": null,
"extra_equipment": null,
"inspections": [
{
...
}
]
}
}
vehicles
, which you can include by adding the query string ?expand[]=emission
to the url of the vehicles endpoint.
Included in the response is information about gas-, particle emissions and smoke density. Not all vehicles have this information available - especially older vehicles lack this data. You can see a list of included attributes below.
To find information regarding fuel efficiency, fuel type and/or energy efficiency of electric vehicles see engine.
fuel_type
, kind
, registration_date
, particle_filter
and euronorm
of the vehicle.
Read more about environmental zones here on miljoezoner.dk{
"emission": {
"co2": 100.0,
"co": 274.9,
"hc_plus_nox": 0.0,
"nox": 25.5,
"particles": null,
"particle_filter": false,
"smoke_density": null,
"smoke_density_engine_speed": 0,
"energy_class": "A++",
"emission_class": "1",
"euronorm": "Euro V",
"allowed_in_environmental_zones": true
}
}
vehicles
, which you can include by adding the query string ?expand[]=engine
to the url of the vehicles endpoint.
Included in the response is information about fuel efficiency, top speed, horse power etc. Not all vehicles have this information available - especially older vehicles lack this data. You can see a list of included attributes below.
To find information regarding gas- and particle emissions see emission.
horsepower
.1 hp = 0.745699872 kW
.power_to_weight_ratio = engine_power / driveable_weight_minimum
. See the weight endpoint for more information.{
"engine": {
"fuel_efficiency": 23.3,
"electricity_efficiency": null,
"top_speed": null,
"fuel_type": "Benzin",
"fuel_type_extended": "Benzin",
"gears": 5,
"cylinders": 3,
"engine_code": null,
"engine_displacement": null,
"engine_power": 140.0,
"horsepower": 190.0,
"power_to_weight_ratio": 0.06
}
}
vehicles
, which you can include by adding the query string ?expand[]=weight
to the url of the vehicles endpoint.
Included in the response is information about weight limits, min/max load, coupling device, max trailer weight etc. Not all vehicles have this information available - especially older vehicles lack this data. You can see a list of included attributes below.
{
"weight": {
"technical_total_weight": 1340,
"total_weight": 1340,
"vehicle_weight": null,
"driveable_weight_minimum": 943,
"driveable_weight_maximum": null,
"v_value_air_suspension": null,
"v_value_mechanical_suspension": null,
"road_train_weight": 1570,
"coupling_device": false,
"coupling_device_load_maximum": null,
"trailer_with_brakes_weight_maximum": 200,
"trailer_without_brakes_weight_maximum": 100,
"trailer_total_weight_maximum": null,
"division": "light"
}
}
vehicles
, which you can include by adding the query string ?expand[]=axle
to the url of the vehicles endpoint.
Included in the response is information about number of axles, axle track, drive shaft maximum pressure etc. Not all vehicles have this information available - especially older vehicles lack this data. You can see a list of included attributes below.
To find information regarding tires/rims, track width, number of seats/doors etc see body.
{
"data": {
"axle": {
"axles": 2,
"axle_track": 2450,
"pulling_axles": "1",
"drive_shaft_pressure_maximum": 730,
"trailer_allowed_pressure_maximum": null
}
}
}
vehicles
, which you can include by adding the query string ?expand[]=body
to the url of the vehicles endpoint.
Included in the response is information about tires and rims, track width, number of doors, seats and passengers etc. Not all vehicles have this information available - especially older vehicles lack this data. You can see a list of included attributes below.
To find information regarding body type see body type.
{
"body": {
"doors": 4,
"vin_placement": "Forrest i motorrum",
"track_width_front": 1430,
"track_width_rear": 1415,
"passengers": 4,
"seats_minimum": 5,
"seats_maximum": null,
"standing_passengers_minimum": null,
"standing_passengers_maximum": null,
"rims_and_tires": "1. aksel:175/55R15 77S,15x5J/ET46. 2. aksel: 175/55R15 77S,15x5J/ET46",
"color": "Rød"
}
}
vehicles
, which you can include by adding the query string ?expand[]=permits
to the url of the vehicles endpoint.
Some vehicles has special permits associated with them. A permit can be granted to vehicles in relation to the use of the specific vehicle.
Each permit object consists of a name
and a unique id
provided by DMR.
{
"permits": [
{
"id": 1,
"name": "Synsfri Sammenkobling"
},
{
...
}
]
}
vehicles
, which you can include by adding the query string ?expand[]=age
to the url of the vehicles endpoint.
The age of a vehicle is calculated on based on the first_registration_date
, registration_status
and registration_status_updated_at
of the vehicle.
The age of inactive vehicles is calculated between first_registration_date
and registration_status_updated_at
whereas active vehicles use the current date. We clasify the vehicle as inactive if the registration_status = 'Afmeldt'
.
Included in the response is the years
and months
components of the age object.
years: 7
.months: 6
.{
"age": {
"years": 8,
"months": 6
}
}
vehicles
, which you can include by adding the query string ?expand[]=equipment
to the url of the vehicles endpoint.
Most vehicles have different equipment depending on the brand, model, variant and version.
Each equipment object consists of a name
, quantity
and a unique id
provided by DMR,
{
"equipment": [
{
"id": 401,
"name": "Ratbetjent gear",
"quantity": 1
},
{
...
}
]
}
vehicles
, which you can include by adding the query string ?expand[]=manufacturer
to the url of the vehicles endpoint.
The Society of Automotive Engineers (SAE) in the US assigns WMIs to manufacturers. We support the most commonly used WMIs, however we can't guarantee this information will be available and accurate for all vehicles.
Included in the response is information about the manufacturers name
, country
and region
.
{
"manufacturer": {
"name": "Mitsubishi Thailand",
"region": "Asia",
"country": "Thailand"
}
}
vehicles
, which you can include by adding the query string ?expand[]=driving_license
to the url of the vehicles endpoint.
You must have a valid driving licence to legally drive a vehicle in Denmark, which corresponds to the category of your motor vehicle. We support the most common driving license categories, however we can't guarantee this information will be available and accurate for all vehicles.
Vehicles are divided into different categories based on their weight and power. See our weight and engine endpoints for more information.
{
"driving_license": {
"category": "B"
}
}
vehicle kind
, usage
and first registration date
. Certain vehicles are subject to additional taxes: compensation tax, particle emissions tax, road- and private use tax.
The periodic taxes object is an expandable attribute on vehicles
, which you can include by adding the query string ?expand[]=periodic_taxes
to the url of the vehicles endpoint.
Included in the response is an array of periodic taxes which each has a name
, amount
, payment_frequency
and the calculated total_amount
.
The taxes calculated here is an estimate and we can't guarantee this information will be available and accurate for all vehicles. Currently we only support passenger cars. If you want to calculate the periodic taxes of other vehicles, please use the official periodic tax calculator from the danish motor vehicle agency here.
{
"periodic_taxes": {
"taxes": [
{
"name": "Grøn ejerafgift",
"amount": 340.0,
"payment_frequency": "semesterly"
},
{
"name": "Udligningsafgift",
"amount": 1420.0,
"payment_frequency": "semesterly"
}
],
"total_amount": 1760.0,
"payment_frequency": "semesterly"
}
}
vehicles
, which you can include by adding the query string ?expand[]=dmr_data
to the url of the vehicles endpoint.
Included in the response is an object with insurance info and the date of the next inspection.
Our server will contact the remote server live. This takes a few seconds to execute and costs 1 token. We suggest that you avoid using this in combination with search and only expand this information for individual vehicles.
To improve response times, we cache the response from the remote server for a short time, so subsequent requests are served faster without repeated live queries.
yyyy-mm-dd
representing the day the insurance was created.yyyy-mm-dd
representing the date of the next periodic inspection of the vehicle.invocation_type
- invocation_created_at
- invocation_deadline
yyyy-mm-dd
.yyyy-mm-dd
representing the start date of the current leasing period. Returns null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.yyyy-mm-dd
representing the end date of the current leasing period. Returns null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.{
"dmr_data": {
"service_available": true,
"insurance_company": "Alm. Brand",
"insurance_status": "Aktiv",
"insurance_policy_number": "N/A",
"insurance_created_at": "2021-01-25",
"next_inspection_date": "2025-01-25",
"inspection_frequency": "Første gang efter 4 år, herefter hvert 2. år",
"inspection_invocations": [
{
"invocation_type": "PeriodiskSyn",
"invocation_created_at": "2022-04-26",
"invocation_deadline": "2022-07-27"
}
],
"euronorm": "Euro V",
"electricity_efficiency_measured": 213.0,
"battery_capacity": 87.0,
"electric_range": 409.0,
"plugin_hybrid": false,
"automatic_transmission": false,
"last_inspection_kind": "PeriodiskSyn",
"last_inspection_result": "Godkendt",
"last_inspection_date": "2020-06-26",
"leasing_period_start": "2022-05-16",
"leasing_period_end": "2023-05-16",
"leasing_period_certificate_id": "491423425567660834"
}
}
vehicles
, which you can include by adding the query string ?expand[]=tinglysning_data
to the url of the vehicles endpoint.
Included in the response is an object with information about the vehicle's liabilities and ownership.
Our server will contact the remote server live. This takes a few seconds to execute and costs 1 token. We suggest that you avoid using this in combination with search and only expand this information for individual vehicles.
To improve response times, we cache the response from the remote server for a short time, so subsequent requests are served faster without repeated live queries.
date
- creditors
- debtors
- floating_charges
- amount
- currency
{
"tinglysning_data": {
"service_available": true,
"liabilities": [
{
"date": "2023-04-21T08:40:08.137+02:00",
"creditors": [
{
"type": "Person",
"name": "John Doe",
"birth_date": "1996-01-01"
},
{
"type": "Person",
"name": "Jane Doe",
"birth_date": "1996-12-31"
}
],
"debtors": [
{
"type": "Person",
"name": "John Doe",
"birth_date": "1996-01-01"
},
{
"type": "Person",
"name": "Jane Doe",
"birth_date": "1996-12-31"
}
],
"floating_charges": [
{
"amount": 100000,
"currency": "DKK",
"priority": 1,
"owners": [
{
"type": "Company",
"name": "Nordea Danmark",
"cvr": "25992180"
}
]
}
],
"amount": 100000,
"currency": "DKK"
}
]
}
}
vehicles
, which you can include by adding the query string ?expand[]=leasing_periods
to the url of the vehicles endpoint.
Included in the response is an array with all known leasing periods ordered by the newest first. Each leasing period object consists of a leasing_period_start
and leasing_period_end
.
yyyy-mm-dd
yyyy-mm-dd
{
"leasing_periods": [
{
"vehicle_id": 1004501200018020,
"leasing_period_start": "2022-05-16",
"leasing_period_end": "2023-05-15"
},
{
"vehicle_id": 1004501200018020,
"leasing_period_start": "2021-05-16",
"leasing_period_end": "2022-05-15"
},
{
...
}
]
}
vehicles
, which you can include by adding the query string ?expand[]=supplementary_body_types
to the url of the vehicles endpoint.
Included in the response is an array of supplementary body types. Each supplementary body type has a name
and a unique id
provided by DMR.
{
"supplementary_body_types": [
{
"id": 66,
"name": "Presenningsopbygning"
},
{
...
}
]
}
yyyy-mm-dd
yyyy-mm-dd
yyyy-mm-dd
first_registration_date
and last_inspection_date
. If either of these are null, the average mileage will also return null. Otherwise the mileage
is divided by the number of years.yyyy-mm-dd
.yyyy-mm-dd
.
The date is estimated based on available data and is not guaranteed to be correct. You can use the DMR data endpoint to get the official date of the next periodic inspection. Read more about the frequency of periodic inspections here.yyyy-mm-dd
representing the start date of the current leasing period. Returns null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.yyyy-mm-dd
representing the end date of the current leasing period. Returns null
if the vehicle is not currently leased. See leasing periods to get a list of all previous leasing periods.{
"data": {
"id": 1004501200018020,
"registration": "AS87640",
"vin": "VF7X1REVF72378327",
"first_registration_date": "2000-08-14",
"status": "Skrottet",
"status_updated_at": "2016-04-18",
"registration_status": "Afmeldt",
"registration_status_updated_at": "2016-04-18",
"kind": "Personbil",
"usage": "Privat personkørsel",
"category": "M1",
"model_year": null,
"fuel_type": "Benzin",
"mileage": 407000,
"mileage_annual_average": 25432,
"brand_and_model": "CITROËN XANTIA",
"brand": "CITROËN",
"brand_id": "10045",
"model": "XANTIA",
"model_id": "10045053",
"variant": "2,0 I 16 V",
"variant_id": "1004505304",
"version": "UOPLYST",
"version_id": "10045053040000000",
"body_type": null,
"eu_version": null,
"eu_variant": null,
"ec_type_approval": null,
"last_inspection_date": "2020-04-20",
"last_inspection_result": "Godkendt",
"last_inspection_kind": "PeriodiskSyn",
"next_inspection_date_estimate": "2022-04-20",
"ncap_five": true,
"leasing_period_start": null,
"leasing_period_end": null,
"extra_equipment": null,
"inspections": [
{
...
}
]
}
}
?expand[]=appraisals
to the URL of the vehicles endpoint.
Our server will contact the remote server live. This takes a few seconds to execute and costs 1 token. We suggest that you avoid using this in combination with search and only expand this information for individual vehicles.
yyyy-mm-dd
{
"appraisals": [
{
"date": "2024-04-22",
"original_price": 986638,
"market_price": 112000,
"value": 43288,
"registration_tax": 68712
},
{
"date": "2023-04-05",
"original_price": 752145,
"market_price": 141705,
"value": 54495,
"registration_tax": 87210
},
{
...
}
]
}
id
in the request. Additionally you can search for multiple inspections using the search endpoint. See search for more information.
The inspection object is available as an expandable resource on vehicles
, which you can include by adding the query string ?expand[]=inspections
to the url of the vehicles endpoint. Expanding inspections on a vehicle will include an array of every inspection associated with the vehicle.
Note: Each inspection in the response costs 1 token. This also applies to any inspections included by expand and/or search. You can specify a limit with per_page
when using search.
yyyy-mm-dd
.HH:MM:SS
.vehicle_type
.
The following vehicle types are considered light:
- 'Campingvogn <= 3500 kg'
- 'Campingvogn til MC'
- 'Lille Knallert'
- 'M1-Personbil <= 3500 kg'
- 'M2-Stor personbil <= 3500 kg'
- 'Motorcykel'
- 'Motorredskab <= 3500 kg'
- 'N1-Varebil <= 3500 kg'
- 'O1-Påhængsvogn <= 750 kg'
- 'O1-Påhængsvogn til MC'
- 'O1-Sættevogn <= 750 kg'
- 'O2-Påhængsvogn 751-3500 kg'
- 'O2-Sættevogn 751-3500 kg'
- 'Påhængsredskab <= 3500 kg'
- 'Påhængsredskab til MC'
- 'Stor Knallert'
- 'Traktor <= 3500 kg'
- 'Traktorpåhængsvogn <= 3500 kg'
The following vehicle types are considered heavy:
- 'Blokvogn'
- 'Blokpåhængsvogn'
- 'Bloksættevogn'
- 'Blokvognsdolly'
- 'Blokvognsmodul'
- 'Campingvogn > 3500 kg'
- 'M1-Personbil > 3500 kg'
- 'M2-Stor personbil 3501-5000 kg'
- 'M3-Stor personbil > 5000 kg'
- 'Mobilkran'
- 'Motordrevet blokvogn'
- 'Motorredskab > 3500 kg'
- 'N2-Lastbil 3501-12000 kg'
- 'N3-Lastbil > 12000 kg'
- 'O3-Påhængsvogn 3501-10000 kg'
- 'O3-Sættevogn 3501-10000 kg'
- 'O4-Påhængsvogn > 10000 kg'
- 'O4-Sættevogn > 10000 kg'
- 'Påhængsredskab > 3500 kg'
- 'Traktor > 3500 kg'
- 'Traktorpåhængsvogn > 3500 kg'yyyy-mm-dd
. Only vehicles which didn't pass the first inspection will have this date.{
"data": {
"id": 26939482,
"vehicle_id": 9000000000970539,
"registration": "AS67902",
"vin": "MMCXNA03AFH012439",
"date": "2021-01-07",
"time": "07:47:00",
"weekday": "Torsdag",
"week_number": 1,
"month": "Januar",
"kind": "Periodisk syn",
"variant": "Første syn",
"result": "Godkendt",
"vehicle_type": "M1-Personbil <= 3500 kg",
"vehicle_division": "light",
"mileage": 129000,
"reinspection_deadline": null,
"inspection_test_center_id": 1337,
"test_center_company_no": 28519516,
"test_center_name": "Dekra Bilsyn",
"test_center_address": "Frederikstadvej 12A",
"test_center_name_and_address": "Dekra Bilsyn - Frederikstadvej 12A",
"test_center_zip": 9200,
"test_center_city": "Aalborg SV",
"pdf": "https://findsynsrapport.esyn.dk/webapi/v1/Document/26939482",
"error_codes": [
{
"code": "6",
"category": "El-anlæg, lygter, reflekser mv.",
"description": "nummerpladelygte, virker ikke, højre"
},
{
...
}
]
}
}
inspections
which is included by default. Included in the response is information about the error code
, category
and description
.
To find additional information regarding the inspection see the inspections endpoint.
{
"error_codes": [
{
"code": "6",
"category": "El-anlæg, lygter, reflekser mv.",
"description": "nummerpladelygte, virker ikke, højre"
},
{
...
}
]
}
name
and a unique id
provided by DMR. You can get a specific brand by providing id
in the request. The brand object is included in the vehicle response by default.
Additionally you can get a list of all models associated with a specific brand by adding /models
to the request url.
This endpoint also allows you to use the search module. See search for more information.
{
"data": [
{
"id": "1",
"name": "AUDI"
},
{
...
}
]
}
name
and a unique id
provided by DMR. You can get a specific model by providing an id
in the request. The model object is included in the vehicle response by default.
Additionally you can get a list of all variants associated with a specific model by adding /variants
to the request url.
This endpoint also allows you to use the search module. See search for more information.
{
"data": {
"id": "1",
"name": "A1"
}
}
name
and a unique id
provided by DMR. You can get a specific variant by providing an id
in the request. The variant object is included in the vehicle response by default.
Additionally you can get a list of all versions associated with a specific variant by adding /versions
to the request url.
This endpoint also allows you to use the search module. See search for more information.
{
"data": {
"id": "1",
"name": "2,0 I 16 V"
}
}
name
and a unique id
provided by DMR. You can get a specific version by providing the id
in the request. The version object is included in the vehicle response by default.
This endpoint also allows you to use the search module. See search for more information.
{
"data": {
"id": "104",
"name": "Hatchback"
}
}
name
and a unique id
provided by DMR.
You can get a specific body type by providing the id
in the request. The body type object is included in the vehicle response by default.
{
"data": {
"id": "1",
"name": "Sedan"
}
}
division
.
A smiley
is associated with the test center in context of their division
. Most test centers only inspect either light- or heavy vehicles, however some test centers are authorized to inspect both vehicle types. These test centers will have two smileys associated - one for each division, which is why some test centers appears twice in the response.
Read more about the different smileys
in the response parameters below.
{
"data": [
{
"name": "ABC Bilsyn ApS - København",
"address": "Lergravsvej 60",
"zip": 2300,
"city": "København",
"lat": 55.66401,
"lng": 12.62686,
"division": "light",
"phone": 32958082,
"website": "https://www.abcbilsyn.dk",
"smiley": "Elite"
},
{
...
}
]
}
website
and smiley
. We've only been tracking this information since january 2016, and we unfortunately can't obtain historical information prior to this date.
To overcome this limitation, inspection test centers strive to offer a solution by extracting aggregate information across all our inspections, thus enabling us to provide data dating back to 2005.
Included in the response is name
, address
, city
, zip
, lat
, lng
, company_no
as well as the first_inspection_date
and last_inspection_date
.
NB: The inspection_test_center_id
on inspections can be used in combination with the search endpoint to extract inspections for a specific test center in a given period.
id
- name
- address
- city
- zip
- company_no
- first_inspection_date
- last_inspection_date
- deleted_at
- latitude
- longitude
- test_center_id
- confirmed_at
See the search endpoint for more information regarding group_by
.yyyy-mm-dd
representing the date of the first known inspection performed by the test center.yyyy-mm-dd
representing the date of the last known inspection performed by the test center.{
"data": [
{
"id": 1337,
"name": "ABC Bilsyn ApS - København",
"address": "Lergravsvej 60",
"zip": 2300,
"city": "København",
"lat": 55.66401,
"lng": 12.62686,
"company_no": 28519516,
"first_inspection_date": "2017-03-14",
"last_inspection_date": "2022-04-20"
},
{
...
}
]
}
{
"data": [
{
"vehicle_id": 9000000000970539
}
],
"has_more": false,
"page": 1,
"total_pages": 1,
"total_count": 1,
"per_page": 10
}
{
"vehicle_id": 9000000000970539
}
{
"vehicle_id": 9000000000970539
}
event
parameter, which indicates the type of event that triggered the webhook. The payload will also contain a data
attribute, which contains the data associated with the event (if any).
Security
All webhooks will include a signature in the X-Synsbasen-Signature
header. You can use this signature to verify that the webhook was sent by Synsbasen. To verify the webhook signature, use the HMAC-SHA256 algorithm with your webhook endpoint's signing secret as the key and the raw JSON payload as the message. Compare the result with the signature provided in the X-Synsbasen-Signature header. If they match, the webhook is authentic; otherwise, reject the request. Here's a simple example in Ruby/Sinatra.
Retry behavior
All endpoints must respond with a 2xx HTTP response to indicate that the webhook has been successfully received. If a webhook delivery fails (non-2xx HTTP response), the event will be automatically retried up to 10 times using an exponential backoff strategy. Starting with an initial delay of 5 minutes, each subsequent retry interval doubles, giving progressively more time between attempts to allow for temporary issues to resolve. The retry intervals are:
- 5 minutes
- 10 minutes
- 20 minutes
- 40 minutes
- 80 minutes
- 160 minutes
- 320 minutes
- 640 minutes
- 1280 minutes
- 2560 minutes
If the endpoint is disabled when a retry is scheduled, no further retries will be attempted. However, re-enabling the endpoint before the retry occurs will resume the scheduled attempts.
Disable behavior
If five separate events (outside of retries) fail to deliver successfully to the same endpoint, the endpoint will be automatically disabled to prevent further failed attempts. You can re-enable the endpoint manually from the dashboard after addressing the issue, at which point retries for any pending events will resume.
Limits
You can have up to 2 webhook endpoints. If you need more, please contact us at info@synsbasen.dk.
inspection.created
webhook is triggered when we detect a new inspection for one of your watched vehicles.
You can manage your webhooks on your dashboard and watched vehicles through the watched vehicles endpoints.
inspection.created
{
"event": "inspection.created",
"data": {
"id": 26939482,
"vehicle_id": 9000000000970539,
"registration": "AS67902",
"vin": "MMCXNA03AFH012439",
"date": "2021-01-07",
"time": "07:47:00",
"weekday": "Torsdag",
"week_number": 1,
"month": "Januar",
"kind": "Periodisk syn",
"variant": "Første syn",
"result": "Godkendt",
"vehicle_type": "M1-Personbil <= 3500 kg",
"vehicle_division": "light",
"mileage": 129000,
"reinspection_deadline": null,
"inspection_test_center_id": 1337,
"test_center_company_no": 28519516,
"test_center_name": "Dekra Bilsyn",
"test_center_address": "Frederikstadvej 12A",
"test_center_name_and_address": "Dekra Bilsyn - Frederikstadvej 12A",
"test_center_zip": 9200,
"test_center_city": "Aalborg SV",
"pdf": "https://findsynsrapport.esyn.dk/webapi/v1/Document/26939482",
"error_codes": [
{
"code": "6",
"category": "El-anlæg, lygter, reflekser mv.",
"description": "nummerpladelygte, virker ikke, højre"
},
{
...
}
]
}
}
inspections.updated
webhook is triggered when we've successfully uploaded all new inspections from the previous day.
You can manage your webhooks on your dashboard.
inspections.updated
null
for this event.{
"event": "inspections.updated",
"data": null
}
test_centers.created
webhook is triggered when we detect new test centers. Included in the response is an array of the newly created test centers.
You can manage your webhooks on your dashboard.
test_centers.created
{
"event": "test_centers.created",
"data": [
{
"name": "FDM Test og Bilsyn - Aalborg",
"address": "Håndværkervej 20",
"zip": 9000,
"city": "Aalborg",
"lat": 57.03157,
"lng": 9.924997,
"division": "light",
"phone": 70133040,
"website": "https://www.fdmbilsyn.dk",
"smiley": "Elite"
},
{
...
}
]
}
vehicle.updated
webhook is triggered when we detect an update to one of your watched vehicles.
You can manage your webhooks on your dashboard and watched vehicles through the watched vehicles endpoints.
vehicle.updated
{
"event": "vehicle.updated",
"data": {
"id": 1004501200018020,
"registration": "AS87640",
"vin": "VF7X1REVF72378327",
"first_registration_date": "2000-08-14",
"status": "Skrottet",
"status_updated_at": "2016-04-18",
"registration_status": "Afmeldt",
"registration_status_updated_at": "2016-04-18",
"kind": "Personbil",
"usage": "Privat personkørsel",
"category": "M1",
"model_year": null,
"fuel_type": "Benzin",
"mileage": 407000,
"mileage_annual_average": 25432,
"brand_and_model": "CITROËN XANTIA",
"brand": "CITROËN",
"brand_id": "10045",
"model": "XANTIA",
"model_id": "10045053",
"variant": "2,0 I 16 V",
"variant_id": "1004505304",
"version": "UOPLYST",
"version_id": "10045053040000000",
"body_type": null,
"eu_version": null,
"eu_variant": null,
"ec_type_approval": null,
"last_inspection_date": "2020-04-20",
"last_inspection_result": "Godkendt",
"last_inspection_kind": "PeriodiskSyn",
"next_inspection_date_estimate": "2022-04-20",
"ncap_five": true,
"leasing_period_start": null,
"leasing_period_end": null,
"extra_equipment": null,
"inspections": [
{
...
}
]
}
}
vehicles.updated
webhook is triggered once we've successfully uploaded the latest XML export by DMR, meaning all vehicles have been updated to the most recent information. Usually this occours weekly every Monday.
You can manage your webhooks on your dashboard.
vehicles.updated
null
for this event.{
"event": "vehicles.updated",
"data": null
}
allowed_in_environmental_zones
for vehicles in the emission payload.per_page
parameter in the response when using the search endpoint. Only apply to methods that return a collection of resources eg. SELECT
.appraisals
from DMR. Read more about appraisals here.supplementary_body_types
for vehicles. Read more about supplementary body types here.emission_class
of the vehicle in the emission payload. Read more about emission class here.pulling_axles
from an integer to a string, since it can contain multiple free text values.body_type_id
from vehicles
- default_quantity
from equipment
- valid_to
from permitscurrent_page
in the response when using the search endpoint. Only apply to methods that return a collection of resources eg. SELECT
.QUARTER
method in the search endpoint.CONCAT
method in the search endpoint.PERCENTAGE
method in the search endpoint.fuel_type_extended
and can be used to search and group by the extended fuel type of the vehicle.DISTINCT
method in the search endpoint.NEAREST
method in the search endpoint.brand_and_model
and can be used to search and group by the brand and model of the vehicle.SELECT
.SELECT
._cont_any
and i_cont_any
predicates. Read more about the predicates here.in
and not_in
predicates using the search endpoint.