Skip to content

API reference

Every endpoint of the KentekenFeed API, with its parameters, the fields it returns and its errors. The reference is generated from the same OpenAPI document the API is tested against, so it matches what the API answers.

Load the OpenAPI document into Postman or Insomnia, or generate a client from it.

Download OpenAPI (JSON) OpenAPI 3.1 · API version 1
Base URL
https://api.kentekenfeed.nl/api/v1
Authentication
Authorization: Bearer kf_live_… or X-Api-Key: kf_live_…. Create keys in the portal.
Errors
{"error": {"code", "message", "request_id", "details?"}}. code is stable; message is for people.
Formats
JSON. Timestamps in ISO-8601 UTC, dates as YYYY-MM-DD. Amounts are numbers in euros: in a vehicle with _eur in the name (catalog_price_eur), in analytics without (catalog_price). Every response has an X-Request-Id.

Vehicles

Look up a vehicle by its registration, and see which RDW datasets the API holds and how fresh they are.

Look up a vehicle

get /vehicles/{registration}

What RDW’s open data holds about one vehicle, by its registration: technical data, inspections, defects and recalls.

One vehicle (vehicles:read, plan with the vehicle API). Billed only on 200.

The vehicle.v1 record. Choose the view (compact by default, full, or raw RDW names) and, for compact and full, the sections to include. Invalid parameters are 422 validation_failed and are not billed.

API key

curl "https://api.kentekenfeed.nl/api/v1/vehicles/{registration}" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • registration path string required

    Six letters and digits, separators allowed (AB-123-C).

  • view query string

    compact (default) leaves out fields RDW has no value for and empty collections; full returns every field (null when unavailable) and every collection; raw returns the typed values under RDW dataset and column names.

    Values
    compact full raw
    Default
    compact
  • include query string

    Comma-separated sections to return (vehicle, technical, environment, status, inspections, history); registration and metadata are always returned. Unknown names are a 422. Not with view=raw.

    Example
    technical,environment

Responses

200 The vehicle, as {data} with the response metadata inside data.

Headers: X-RateLimit-Limit X-RateLimit-Remaining

One of

VehicleResponse

4xx · 5xx Errors: Error

List the datasets

get /datasets

Which RDW datasets the API holds, with their rows, version and when RDW last published them.

Every dataset with its public name, key, rows, version and freshness (any key; vehicle API or feed plan)

API key

curl "https://api.kentekenfeed.nl/api/v1/datasets" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Responses

200 Datasets.

  • data array of object required
    Fields (10)
    • source_published_at NullableTimestamp required
    • last_checked_at NullableTimestamp required
    • stale boolean required

      Not checked against RDW recently, or its current version not in Elasticsearch yet. Stale data is still served.

    • name string required
    • source_dataset string required
    • role string required
      Values
      vehicle vehicle_child reference
    • description string required
    • key array of string required
    • rows integer | null required
    • version string | null required
  • meta object required
    Fields (2)
    • schema_version string required
    • data_version string required

4xx · 5xx Errors: Error

Analytics

Count, group and measure the vehicles in the register, or the defects found at inspections.

Fields you can filter, group and measure

Use these names in filter[…], group_by and metrics, for vehicles and for defects alike. They are the field names per dataset, the same as field in the feed; a vehicle response names the same fields differently (trade_name is vehicle.model there, catalog_price is vehicle.fiscal.catalog_price_eur). Fields from a linked dataset start with its name, such as fuels.fuel. GET /analytics/fields returns the same list.

Attributes (22)

Filter on one or more values and group by value. Yes/no fields take true or false.

  • make string

    Make.

  • trade_name string

    Trade name (model) given by the manufacturer.

  • vehicle_type string

    Kind of vehicle in RDW wording, e.g. "Personenauto" or "Bedrijfsauto".

  • body_style string

    Body arrangement in RDW wording, e.g. "hatchback" or "stationwagen".

  • primary_color string

    Main colour in RDW wording.

  • secondary_color string

    Second colour in RDW wording.

  • european_vehicle_category string

    European vehicle category, e.g. M1 or N1.

  • fuel_efficiency_class string

    Fuel efficiency label, A to G.

  • odometer_judgement string

    RDW judgement of the odometer history in RDW wording, e.g. "Logisch" or "Onlogisch".

  • insured boolean

    Whether third-party liability (WAM) insurance is registered; null when not applicable.

  • exported boolean

    Whether the vehicle has been exported.

  • taxi boolean

    Whether the vehicle is registered as a taxi.

  • open_recall boolean

    Whether a recall is open for the vehicle.

  • registration_allowed boolean

    Whether the vehicle can currently be registered to an owner.

  • fuels.fuel string

    Fuel in RDW wording, e.g. "Benzine", "Diesel" or "Elektriciteit".

  • fuels.emission_code string

    Emission standard (Euro class) code.

  • fuels.hybrid_class string

    Hybrid class: OVC-HEV (externally chargeable) or NOVC-HEV.

  • bodies.body_type_description string

    European description of the body type.

  • recalls.recall_code string

    RDW reference code of the recall campaign.

  • recalls.status string

    Status as reported by the manufacturer, in RDW wording.

  • defects.defect_code string

    Code of the defect in the RDW defect catalogue.

  • defects.approval_type string

    Kind of approval of the inspection station.

Dates (5)

Filter on a period with gte, gt, lte or lt, and group by year or month.

  • first_admission_date date

    Date the vehicle was first admitted to the road, in any country.

  • first_registration_nl_date date

    Date the vehicle was first registered to an owner in the Netherlands.

  • registration_date date

    Date of the current registration to an owner (tenaamstelling).

  • apk_expiry_date date

    Date the periodic inspection (APK) expires.

  • defects.report_date date

    Date of the inspection report the defect belongs to.

Numbers (17)

Filter on a range and measure with avg, min, max, sum or median, such as metrics=median:catalog_price.

  • catalog_price integer

    Catalogue price including VAT and BPM, in euros.

  • gross_bpm integer

    Gross BPM (registration tax) at first registration, in euros.

  • empty_mass integer

    Mass of the empty vehicle in kg.

  • curb_mass integer

    Ready-to-drive mass (massa rijklaar) in kg.

  • max_mass integer

    Permitted maximum mass in kg.

  • displacement integer

    Engine displacement in cc.

  • cylinders integer

    Number of cylinders.

  • seats integer

    Number of seats, the driver included.

  • doors integer

    Number of doors.

  • length integer

    Length in cm.

  • width integer

    Width in cm.

  • wheelbase integer

    Wheelbase in cm.

  • power_to_mass_ratio number

    Power per ready-to-drive mass, in kW/kg.

  • fuels.co2_combined_wltp number

    Combined CO2 emission in g/km (WLTP).

  • fuels.fuel_consumption_combined_wltp number

    Combined fuel consumption in l/100 km (WLTP).

  • fuels.electric_range_electric_only_wltp number

    Range of a pure electric vehicle in km (WLTP).

  • fuels.net_max_power_electric number

    Net maximum electric power in kW.

Limits of one request

  • Up to 2 levels in group_by, outer first, such as make,trade_name.
  • Up to 100 groups per level with limit, 20 by default, largest first.
  • Up to 50 values per filter, separated by commas.
  • Up to 5 metrics, as operation:field with avg, min, max, sum or median.
  • Grouping a date by :month spans at most 120 months, with a filter on that date that has a start and an end.

List the fields

get /analytics/fields

The fields you can filter, group and measure, and the limits of one request. Free.

The fields analytics can filter, group and measure, the subjects and the limits (not billed)

API key

curl "https://api.kentekenfeed.nl/api/v1/analytics/fields" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Responses

200 The analytics vocabulary.

  • data object required
    Fields (3)
    • subjects array of object required
      Fields (4)
      • name string required
        Values
        vehicles defects
      • description string required
      • counts string required
        Values
        vehicles defects
      • default_group_by string | null required
    • fields array of object required
      Fields (8)
      • name string required
        Example
        make fuels.fuel
      • dataset string required
      • type string required
        Values
        string integer number date time boolean
      • kind string required
        Values
        dimension date metric
      • description string required
      • filter string required
        Values
        values range
      • group_by array of string | null required

        [null]: group by value; year/month: the intervals a date takes; []: cannot be grouped by.

        Values
        year month null
      • metrics array of string required
        Values
        avg min max sum median
    • limits object required
      Fields (6)
      • group_levels integer required
      • groups_per_level integer required
      • default_groups_per_level integer required
      • filter_values integer required
      • metrics integer required
      • month_groups integer required
  • meta object required
    Fields (1)
    • schema_version "analytics.v1" required

4xx · 5xx Errors: Error

Count vehicles

get /analytics/vehicles

Count the vehicles in the register, filtered and grouped as you choose, with averages, sums or medians. Exported and deregistered vehicles are counted; registration_allowed says whether a vehicle can be registered to an owner, not whether it may be on the road.

Count vehicles in the register, grouped and measured (vehicles:read, plan with analytics). One analytics query per 200.

Counts every vehicle in RDW's open register, exported and deregistered ones included (filter[registration_allowed]=true for vehicles that can be on the road). A child dataset field (fuels.fuel) filters on and groups by the vehicle's rows of that dataset, and count is still vehicles. Answers are cached until the next sync; a cached answer is still billed.

API key

curl "https://api.kentekenfeed.nl/api/v1/analytics/vehicles" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • filter query object

    filter[make]=TESLA,BMW (any of the values, any case; booleans take true/false), filter[first_admission_date][gte]=2020-01-01 (dates as YYYY-MM-DD and metrics take gte, gt, lte, lt). At most 50 values per field.

  • group_by query string

    Up to 2 comma-separated fields, outer first, e.g. make,trade_name. Dates take :year or :month (month needs a filter on that date spanning at most 120 months).

  • metrics query string

    Up to 5 comma-separated operation:field (avg, min, max, sum, median), e.g. avg:catalog_price.

  • limit query integer

    Groups per level, largest first.

    Default
    20
    Minimum
    1
    Maximum
    100

Responses

200 The analytics.v1 answer.

Headers: X-RateLimit-Limit X-RateLimit-Remaining

  • data object required
    Fields (5)
    • count integer required

      Vehicles (subject vehicles) or defect findings (subject defects).

    • vehicles integer

      Subject defects only: the distinct vehicles the counted defects were found on.

    • metrics map of number | null required

      Keyed by the requested operation:field; null when no vehicle in the group has a value.

    • groups null | array of AnalyticsOuterGroup required
    • other_count integer | null required

      Counted items in groups beyond the limit. Null for date groups and for child dataset groups of vehicles (whose leftovers are rows, not vehicles).

  • meta object required
    Fields (4)
    • schema_version "analytics.v1" required
    • data_version string required
    • datasets map of Freshness required
    • query object required

      The query in its canonical form (filters by field, values sorted), as answered.

      Fields (5)
      • subject string required
        Values
        vehicles defects
      • filter object required

        Keyed by field: the values, or the range bounds. Empty without filters.

      • group_by array of string required
      • metrics array of string required
      • limit integer required

4xx · 5xx Errors: Error

Count defects

get /analytics/defects

Count the defects found at inspections, by defect code or grouped as you choose, with the number of vehicles they were found on.

Count defects found at inspections, by defect code unless grouped otherwise (vehicles:read, plan with analytics). One analytics query per 200.

count is defect findings (one per defect row of an inspection report) and vehicles the distinct vehicles they were found on. defects.* filters select the findings counted; vehicle filters select the vehicles. Defect code groups carry the description and article of the code's latest catalogue version.

API key

curl "https://api.kentekenfeed.nl/api/v1/analytics/defects" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • filter query object

    filter[make]=TESLA,BMW (any of the values, any case; booleans take true/false), filter[first_admission_date][gte]=2020-01-01 (dates as YYYY-MM-DD and metrics take gte, gt, lte, lt). At most 50 values per field.

  • group_by query string

    Up to 2 comma-separated fields, outer first, e.g. make,trade_name. Dates take :year or :month (month needs a filter on that date spanning at most 120 months).

  • metrics query string

    Up to 5 comma-separated operation:field (avg, min, max, sum, median), e.g. avg:catalog_price.

  • limit query integer

    Groups per level, largest first.

    Default
    20
    Minimum
    1
    Maximum
    100

Responses

200 The analytics.v1 answer.

Headers: X-RateLimit-Limit X-RateLimit-Remaining

  • data object required
    Fields (5)
    • count integer required

      Vehicles (subject vehicles) or defect findings (subject defects).

    • vehicles integer

      Subject defects only: the distinct vehicles the counted defects were found on.

    • metrics map of number | null required

      Keyed by the requested operation:field; null when no vehicle in the group has a value.

    • groups null | array of AnalyticsOuterGroup required
    • other_count integer | null required

      Counted items in groups beyond the limit. Null for date groups and for child dataset groups of vehicles (whose leftovers are rows, not vehicles).

  • meta object required
    Fields (4)
    • schema_version "analytics.v1" required
    • data_version string required
    • datasets map of Freshness required
    • query object required

      The query in its canonical form (filters by field, values sorted), as answered.

      Fields (5)
      • subject string required
        Values
        vehicles defects
      • filter object required

        Keyed by field: the values, or the range bounds. Empty without filters.

      • group_by array of string required
      • metrics array of string required
      • limit integer required

4xx · 5xx Errors: Error

Mutation feed

Start with a snapshot of the whole register, then read the changes from its cursor and keep up. A change is a difference between two successive versions of RDW’s open data. Batches show what each import brought; mutation files put a day of changes in one file.

How cursors work

A cursor is a bookmark in the feed. Every change has a position, a number that only goes up. A cursor marks a position, and GET /mutations?after=<cursor> returns the changes that came after it, oldest first.

Reading the feed page by page

  1. GET /mutations?after=CURSOR_1 1,000 changes · next_cursor: CURSOR_2 · has_more: true
  2. GET /mutations?after=CURSOR_2 412 changes · next_cursor: CURSOR_3 · has_more: false
  3. later: GET /mutations?after=CURSOR_3 the changes imported since

Where you get a cursor

  • cursor of a snapshot: where the snapshot ends. Start here after loading its files.
  • GET /mutations/checkpoint: the newest change. Start here to follow the feed from now on.
  • meta.next_cursor of every page of /mutations: where that page ends. Continue here.
  • start_cursor of a batch: where one import begins, to read that import again.
  • No after at all: from the oldest change the feed still holds.

Good to know

  • Save next_cursor once you have processed a page, also when data is empty, and continue from it next time. When has_more is false you are up to date; new batches arrive a few times a day.
  • Store a cursor as it is. It is a sealed string: you cannot build or change one yourself.
  • A cursor only works with the filters it came with (registration, dataset, type). Other filters give 400 cursor_filter_mismatch; to change filters, start from a checkpoint with the new ones.
  • Following next_cursor never skips a change. After an error you may get a change twice: skip an id you already processed.
  • The feed holds changes for 90 days. An older cursor gives 410 cursor_expired; start again from the latest snapshot.
  • A range mutation file takes two cursors: the changes after after up to until.

Read changes

get /mutations

The detected changes in order, page by page from a cursor. Keep the last cursor and continue from it next time.

mutation.v1 records in position order (mutations:read, plan with the feed). Not billed.

API key

curl "https://api.kentekenfeed.nl/api/v1/mutations" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • after query string

    A cursor from this API (next_cursor, checkpoint, a batch or snapshot).

  • registration query string
  • dataset query string

    Public dataset name.

  • type query MutationType
    Values
    appeared changed disappeared
  • limit query integer
    Default
    100
    Minimum
    1
    Maximum
    1000

Responses

200 A page. next_cursor is always set; keep it even when data is empty.

  • data array of Mutation required
  • meta object required
    Fields (4)
    • schema_version "mutation.v1" required
    • next_cursor string required
    • has_more boolean required
    • head_position integer required

4xx · 5xx Errors: Error

Start from now

get /mutations/checkpoint

A cursor at the newest change, to follow the feed from this moment without reading what came before.

A cursor at the current head (same filters as /mutations)

API key

curl "https://api.kentekenfeed.nl/api/v1/mutations/checkpoint" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • registration query string
  • dataset query string
  • type query MutationType
    Values
    appeared changed disappeared

Responses

200 Head.

  • data object required
    Fields (2)
    • position integer required
    • cursor string required

4xx · 5xx Errors: Error

List batches

get /mutations/batches

The imports per dataset and day, newest first, with their counts and the cursor each one starts at.

Imported batches, newest first

API key

curl "https://api.kentekenfeed.nl/api/v1/mutations/batches" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • dataset query string
  • date query string (date)
  • limit query integer
    Default
    50
    Minimum
    1
    Maximum
    100
  • cursor query string

    meta.next_cursor of the previous page.

Responses

200 Batches.

4xx · 5xx Errors: Error

Get a batch

get /mutations/batches/{batch}

One import, with its counts and cursors.

One imported batch

API key

curl "https://api.kentekenfeed.nl/api/v1/mutations/batches/{batch}" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • batch path string required

Responses

200 Batch.

4xx · 5xx Errors: Error

List snapshots

get /snapshots

Full copies of the register, newest first, each with the cursor to follow the feed from.

Completed snapshots, newest first (plan with snapshots)

API key

curl "https://api.kentekenfeed.nl/api/v1/snapshots" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Responses

200 Snapshots.

4xx · 5xx Errors: Error

Get a snapshot

get /snapshots/{snapshot}

One snapshot, with its files.

One completed snapshot

API key

curl "https://api.kentekenfeed.nl/api/v1/snapshots/{snapshot}" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • snapshot path string required

Responses

200 A snapshot.

4xx · 5xx Errors: Error

Download a snapshot file

post /snapshots/{snapshot}/files/{file}/download-url

A link to one file of a snapshot, valid for 10 minutes.

A 10-minute signed URL for one snapshot file

API key

curl -X POST "https://api.kentekenfeed.nl/api/v1/snapshots/{snapshot}/files/{file}/download-url" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • snapshot path string required
  • file path string required

    File name, e.g. axles.csv.gz.

Responses

200 A signed download URL.

  • data object required
    Fields (2)
    • url string (uri) required
    • expires_at Timestamp required
      Example
      2026-11-03T08:07:10Z

4xx · 5xx Errors: Error

List mutation files

get /mutation-files

The mutation files your account requested, newest first.

The account's mutation files, newest first (plan with mutation files)

API key

curl "https://api.kentekenfeed.nl/api/v1/mutation-files" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • limit query integer
    Default
    50
    Minimum
    1
    Maximum
    100
  • cursor query string

    meta.next_cursor of the previous page.

Responses

200 Mutation files.

4xx · 5xx Errors: Error

Request a mutation file

post /mutation-files

Have the changes of one day, or between two cursors, written to one JSONL or CSV file.

Request a mutation file (202), or get the existing one with the same contents (200, not counted)

API key

curl -X POST "https://api.kentekenfeed.nl/api/v1/mutation-files" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"daily","format":"jsonl"}'

Request body

application/json

  • kind string required
    Values
    daily range
  • format string required
    Values
    jsonl csv
  • dataset string | null

    Public dataset name.

  • date string (date)

    daily only.

  • after string

    range only; a feed cursor.

  • until string

    range only; a feed cursor.

Responses

200 A mutation file.

202 A mutation file.

4xx · 5xx Errors: Error

Get a mutation file

get /mutation-files/{mutationFile}

One mutation file. Check it until its status is completed.

One mutation file (poll until completed)

API key

curl "https://api.kentekenfeed.nl/api/v1/mutation-files/{mutationFile}" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • mutationFile path string required

Responses

200 A mutation file.

4xx · 5xx Errors: Error

Download a mutation file

post /mutation-files/{mutationFile}/download-url

A link to a completed mutation file, valid for 10 minutes.

A 10-minute signed URL for a completed mutation file

API key

curl -X POST "https://api.kentekenfeed.nl/api/v1/mutation-files/{mutationFile}/download-url" \
  -H "Authorization: Bearer $KENTEKENFEED_API_KEY"

Parameters

  • mutationFile path string required

Responses

200 A signed download URL.

  • data object required
    Fields (2)
    • url string (uri) required
    • expires_at Timestamp required
      Example
      2026-11-03T08:07:10Z

4xx · 5xx Errors: Error

Schemas

The objects the endpoints above return, linked from their responses.

AnalyticsGroupFields

  • key string | boolean required

    The value grouped on: a string, true/false for indicators, 2024 or 2024-03 for dates.

  • description string | null

    Defect code groups only: from the code's latest catalogue version.

  • article_number string | null

    Defect code groups only.

AnalyticsInnerGroup

  • key string | boolean required

    The value grouped on: a string, true/false for indicators, 2024 or 2024-03 for dates.

  • description string | null

    Defect code groups only: from the code's latest catalogue version.

  • article_number string | null

    Defect code groups only.

  • count integer required

    Vehicles (subject vehicles) or defect findings (subject defects).

  • vehicles integer

    Subject defects only: the distinct vehicles the counted defects were found on.

  • metrics map of number | null required

    Keyed by the requested operation:field; null when no vehicle in the group has a value.

  • groups any required

    The groups of the next level, largest first (dates oldest first); null without (another) group level. At the innermost level always null.

  • other_count integer | null required

    Counted items in groups beyond the limit. Null for date groups and for child dataset groups of vehicles (whose leftovers are rows, not vehicles).

AnalyticsLevel

  • count integer required

    Vehicles (subject vehicles) or defect findings (subject defects).

  • vehicles integer

    Subject defects only: the distinct vehicles the counted defects were found on.

  • metrics map of number | null required

    Keyed by the requested operation:field; null when no vehicle in the group has a value.

  • groups any required

    The groups of the next level, largest first (dates oldest first); null without (another) group level. At the innermost level always null.

  • other_count integer | null required

    Counted items in groups beyond the limit. Null for date groups and for child dataset groups of vehicles (whose leftovers are rows, not vehicles).

AnalyticsOuterGroup

  • key string | boolean required

    The value grouped on: a string, true/false for indicators, 2024 or 2024-03 for dates.

  • description string | null

    Defect code groups only: from the code's latest catalogue version.

  • article_number string | null

    Defect code groups only.

  • count integer required

    Vehicles (subject vehicles) or defect findings (subject defects).

  • vehicles integer

    Subject defects only: the distinct vehicles the counted defects were found on.

  • metrics map of number | null required

    Keyed by the requested operation:field; null when no vehicle in the group has a value.

  • groups null | array of AnalyticsInnerGroup required
  • other_count integer | null required

    Counted items in groups beyond the limit. Null for date groups and for child dataset groups of vehicles (whose leftovers are rows, not vehicles).

Error

  • error object required
    Fields (4)
    • code string required
      Example
      validation_failed
    • message string required
    • request_id string required
    • details object

      Codes with details: validation_failed (fields), usage_cap_reached, query_cap_reached, mutation_file_limit_reached, cursor_expired, not_entitled, …

FeedBatch

  • id string required
  • dataset string required
  • source_dataset string required
  • source_version string required
  • date string (date) required
  • source_published_at NullableTimestamp required
  • observed_at Timestamp required
    Example
    2026-11-03T08:07:10Z
  • imported_at Timestamp required
    Example
    2026-11-03T08:07:10Z
  • counts object required
    Fields (3)
    • appeared integer required
    • changed integer required
    • disappeared integer required
  • record_count integer | null required
  • first_position integer | null required
  • last_position integer | null required
  • start_cursor string | null required

    Reads the feed from this batch on (no filters); null without records.

  • pruned boolean required

Freshness

  • source_published_at NullableTimestamp required
  • last_checked_at NullableTimestamp required
  • stale boolean required

    Not checked against RDW recently, or its current version not in Elasticsearch yet. Stale data is still served.

Mutation

  • id string required

    Deduplicate on this: delivery is at least once.

  • position integer required
  • batch_id string required
  • dataset string required
  • registration string | null required
  • type MutationType required
    Values
    appeared changed disappeared
  • key object required

    The record's key fields (dataset key order).

  • changes array of object required
    Fields (5)
    • field string required

      Public field name in the dataset (see GET /datasets).

    • source_field string required

      RDW's column.

    • path string | null required

      Where the field is in the vehicle.v1 lookup response ([] marks a list), or null for a field the lookup does not carry.

    • old string | number | boolean | null required
    • new string | number | boolean | null required
  • source_published_at NullableTimestamp required
  • observed_at Timestamp required
    Example
    2026-11-03T08:07:10Z
  • effective_at string (date-time) | null required

    Always null: RDW publishes no per-record event time.

MutationFile

  • id string required
  • kind string required
    Values
    daily range
  • format string required
    Values
    jsonl csv
  • dataset string | null required
  • date string (date) | null required
  • after_position integer | null required
  • until_position integer | null required
  • status string required
    Values
    pending processing completed failed expired
  • schema_version string required
  • file_name string required
  • record_count integer | null required
  • first_position integer | null required
  • last_position integer | null required
  • batch_ids array of string | null required

    A day's batches from the request on; a range's once generated.

  • bytes integer | null required
  • sha256 string | null required
  • error string | null required
  • created_at Timestamp required
    Example
    2026-11-03T08:07:10Z
  • completed_at NullableTimestamp required
  • expires_at NullableTimestamp required

MutationType

string

Values
appeared changed disappeared

NullableTimestamp

string (date-time) | null

PageMeta

  • next_cursor string | null required

    Pass as cursor for the next page; null on the last page.

Snapshot

  • id string required
  • schema_version string required
  • aligned_position integer required
  • cursor string required

    Read /mutations with after=<cursor> once the files are loaded.

  • started_at Timestamp required
    Example
    2026-11-03T08:07:10Z
  • finished_at Timestamp required
    Example
    2026-11-03T08:07:10Z
  • files array of object required
    Fields (6)
    • name string required
      Example
      axles.csv.gz
    • dataset string required
    • format string required
      Values
      jsonl csv
    • rows integer required
    • bytes integer required
    • sha256 string required

Timestamp

string (date-time)

Example
2026-11-03T08:07:10Z

Vehicle

The vehicle.v1 record: the register and its child datasets arranged in sections. In the compact view (default) a field is either absent or has a value: null fields and empty collections are left out, false and 0 are kept. In the full view every field is present (null when RDW has no value) and every collection is present (empty when there are no records). include limits the response to the named sections; registration and metadata are always present. Field names, units and nesting are the same in both views. Units are RDW's own (cm, kg, kW, km/h, g/km, l/100 km, Wh/km, km, dB(A), rpm, l, EUR) and are named in the field.

VehicleEnvironment

Fuels and energy sources with power, emissions, consumption, range and noise per record. NEDC and WLTP figures are separate fields; weighted figures (plug-in hybrids) are separate from combined ones.

  • fuel_efficiency_class string | null

    Fuel efficiency label, A to G.

  • gas_installation_type string | null

    Type of gas (LPG/CNG) installation.

  • fuels array of object
    Fields (9)
    • sequence integer | null

      Order of this fuel for the vehicle.

    • type string | null

      Fuel in RDW wording, e.g. "Benzine", "Diesel" or "Elektriciteit".

    • hybrid_class string | null

      Hybrid class: OVC-HEV (externally chargeable), NOVC-HEV, OVC-FCHV or NOVC-FCHV (fuel cell).

    • declared_max_speed_kmh number | null

      Maximum speed declared by the manufacturer (km/h).

    • power object
      Fields (2)
      • net_max_kw number | null

        Net maximum power of the combustion engine (kW).

      • electric object
        Fields (3)
        • nominal_continuous_max_kw number | null

          Nominal continuous maximum power of the electric motor (kW).

        • max_15_minutes_kw number | null

          Maximum electric power over 15 minutes (kW).

        • net_max_kw number | null

          Net maximum electric power (kW).

    • emissions object
      Fields (7)
      • euro_class_code string | null

        Emission standard (Euro class) code (emissiecode_omschrijving), e.g. "6".

      • exhaust_emission_level string | null

        Exhaust emission level (uitlaatemissieniveau), e.g. "EURO 6 AP" or "EURO VI E".

      • directive_light string | null

        EU emission directive the light vehicle was approved under.

      • directive_heavy string | null

        EU emission directive the heavy-duty engine was approved under.

      • co2_class string | null

        CO2 emission class (heavy-duty vehicles).

      • co2 object
        Fields (4)
        • combined_g_per_km number | null

          Combined CO2 emission (NEDC, g/km).

        • weighted_g_per_km number | null

          Weighted CO2 emission of an externally chargeable hybrid (NEDC, g/km).

        • combined_wltp_g_per_km number | null

          Combined CO2 emission (WLTP, g/km).

        • weighted_combined_wltp_g_per_km number | null

          Weighted combined CO2 emission (WLTP, g/km).

      • particulates object
        Fields (3)
        • light_g_per_km number | null

          Particulate emission in g/km (light vehicles) (g/km).

        • heavy_g_per_kwh number | null

          Particulate emission in g/kWh (heavy-duty engines) (g/kWh).

        • type1_wltp number | null

          Particulate mass emission in the WLTP type 1 test (emis_deeltjes_type1_wltp); RDW does not state the unit, so none is named.

    • consumption object
      Fields (2)
      • fuel object
        Fields (4)
        • combined_l_per_100km number | null

          Combined fuel consumption (NEDC, l/100 km).

        • weighted_combined_l_per_100km number | null

          Weighted combined fuel consumption (l/100 km).

        • combined_wltp_l_per_100km number | null

          Combined fuel consumption (WLTP, l/100 km).

        • weighted_combined_wltp_l_per_100km number | null

          Weighted combined fuel consumption (WLTP, l/100 km).

      • electric object
        Fields (4)
        • electric_only_wh_per_km number | null

          Electricity consumption when driving fully electric (Wh/km).

        • weighted_combined_wh_per_km number | null

          Weighted combined electricity consumption (Wh/km).

        • electric_only_wltp_wh_per_km number | null

          Electric consumption of a pure electric vehicle (WLTP, Wh/km).

        • external_charging_wltp_wh_per_km number | null

          Electric consumption of an externally chargeable hybrid (WLTP, Wh/km).

    • range object
      Fields (4)
      • electric_km number | null

        Electric range (km).

      • external_charging_km number | null

        Electric range of an externally chargeable vehicle (km).

      • electric_only_wltp_km number | null

        Range of a pure electric vehicle (WLTP, km).

      • external_charging_wltp_km number | null

        Electric range of an externally chargeable hybrid (WLTP, km).

    • noise object
      Fields (3)
      • driving_db number | null

        Noise level while driving (dB(A)).

      • stationary_db number | null

        Noise level when stationary with the engine running (dB(A)).

      • measurement_rpm number | null

        Engine speed during the stationary noise measurement (rpm).

VehicleHistory

Dated records: objects added to the vehicle and recalls with their status.

  • added_objects array of object
    Fields (8)
    • type string | null

      Kind of object, e.g. "LPG Installatie" or "Tachograaf".

    • make string | null

      Make of the object.

    • make_code string | null

      Make code of the object.

    • version_sequence integer | null

      Version sequence number of the object.

    • classification string | null

      Classification of the object.

    • mounted_date string (date) | null

      Date the object was mounted.

    • removed_date string (date) | null

      Date the object was removed.

    • gas_tank_capacity_l number | null

      Capacity of the gas tank (l).

  • recalls array of object
    Fields (3)
    • code string | null

      RDW reference code of the recall campaign (referentiecode_rdw).

    • status object
      Fields (2)
      • code string | null

        Status code: O for open, P when the manufacturer reports the vehicle as repaired, or another RDW code.

      • description string | null

        Status as reported by the manufacturer, in RDW wording.

    • campaign object | null

      The recall campaign from the RDW recall register, or null when it is not in the register. Its code is the recall's code.

      Fields (17)
      • published_date string (date) | null

        Date RDW published the recall in its register.

      • reporting_party string | null

        Manufacturer or distributor that reported the recall.

      • manufacturer_reference string | null

        The manufacturer's own code for the recall.

      • defect_description string | null

        Description of the defect the recall is for.

      • defect_category string | null

        Part of the vehicle the defect concerns.

      • consequences string | null

        Consequences of the defect the user may notice.

      • remedy string | null

        What is done to repair the defect.

      • risk_assessment string | null

        RDW risk assessment of the defect.

      • remarks string | null

        Additional remarks from RDW.

      • info_url string | null

        Website with more information from the manufacturer or distributor.

      • info_phone string | null

        Phone number for more information.

      • announced_date string (date) | null

        Date the manufacturer announced the recall.

      • reported_date string (date) | null

        Date the recall was reported to RDW.

      • owners_to_be_informed_date string (date) | null

        Date by which owners are to be informed.

      • owners_informed_date string (date) | null

        Date owners were informed.

      • vehicles_total integer | null

        Number of vehicles in the recall worldwide.

      • vehicles_national integer | null

        Number of vehicles in the recall in the Netherlands.

VehicleIdentity

Identity, classification, appearance, body and type approval.

  • type string | null

    Kind of vehicle (voertuigsoort) in RDW wording, e.g. "Personenauto", "Bedrijfsauto", "Motorfiets" or "Aanhangwagen".

  • make string | null

    Make.

  • model string | null

    Trade name (handelsbenaming) as registered by RDW, used as the model name.

  • colors object
    Fields (2)
    • primary string | null

      Main colour in RDW wording.

    • secondary string | null

      Second colour in RDW wording.

  • body object
    Fields (6)
    • style string | null

      Body arrangement in RDW wording, e.g. "hatchback" or "stationwagen".

    • extended_cab boolean | null

      Whether the cab is extended.

    • aerodynamic_devices_code string | null

      Code for aerodynamic devices fitted, as recorded by RDW.

    • types array of object
      Fields (5)
      • sequence integer | null

        Sequence number of the body; specifications and classes are those of this body.

      • code string | null

        European body type code, e.g. AB.

      • description string | null

        European description of the body type.

      • specifications array of object
        Fields (3)
        • sequence integer | null

          Sequence number of the specification.

        • code string | null

          European body code of an approved complete or completed vehicle.

        • description string | null

          European description of the specification.

      • classes array of object
        Fields (3)
        • sequence integer | null

          Sequence number of the class.

        • code string | null

          Vehicle class code set at approval.

        • description string | null

          Description of the vehicle class.

    • unmatched_specifications array of object

      Body specifications whose body_sequence matches no body in types.

      Fields (4)
      • body_sequence integer | null

        Sequence number of the body this belongs to.

      • sequence integer | null

        Sequence number of the specification.

      • code string | null

        European body code of an approved complete or completed vehicle.

      • description string | null

        European description of the specification.

    • unmatched_classes array of object

      Vehicle classes whose body_sequence matches no body in types.

      Fields (4)
      • body_sequence integer | null

        Sequence number of the body this belongs to.

      • sequence integer | null

        Sequence number of the class.

      • code string | null

        Vehicle class code set at approval.

      • description string | null

        Description of the vehicle class.

  • seats integer | null

    Number of seats, the driver included.

  • passenger_seats_legal integer | null

    Legal number of passenger seats.

  • standing_places integer | null

    Number of standing places.

  • wheelchair_places integer | null

    Number of wheelchair places.

  • doors integer | null

    Number of doors.

  • wheels integer | null

    Number of wheels.

  • category object
    Fields (5)
    • european string | null

      European vehicle category, e.g. M1 or N1.

    • european_addition string | null

      Addition to the European vehicle category.

    • european_version_addition string | null

      Addition to the European category of the version.

    • national_subcategory string | null

      Dutch subcategory of the vehicle.

    • european_subcategories array of object
      Fields (3)
      • sequence integer | null

        Sequence number of the subcategory.

      • code string | null

        European code for the special-purpose body type.

      • description string | null

        Description of the subcategory.

  • type_approval object
    Fields (6)
    • type string | null

      Type code from the type approval.

    • variant string | null

      Variant code from the type approval.

    • version string | null

      Version (uitvoering) code from the type approval.

    • number string | null

      EU or national type approval number.

    • amendment_sequence integer | null

      Sequence number of the amendment to the EU type approval.

    • designation_number string | null

      Designation number (aanwijzingsnummer), where one applies.

  • chassis_number_location string | null

    Where the chassis number (VIN) is stamped.

  • fiscal object
    Fields (2)
    • catalog_price_eur integer | null

      Catalogue price including VAT and BPM (EUR).

    • gross_bpm_eur integer | null

      Gross BPM (registration tax) at first registration (EUR).

  • particulars array of object
    Fields (5)
    • sequence integer | null

      Sequence number of the particular.

    • code integer | null

      Code of the particular.

    • description string | null

      Description of the code, e.g. "Wielbasis:".

    • value string | null

      Variable text completing the description, e.g. "1155-1825".

    • unit string | null

      Unit of the value, e.g. "cm".

VehicleInspections

Current expiry dates, the odometer judgement and the inspection reports with their defects.

  • apk object
    Fields (1)
    • expiry_date string (date) | null

      Date the periodic inspection (APK) expires.

  • tachograph object
    Fields (1)
    • expiry_date string (date) | null

      Date the tachograph inspection expires.

  • odometer object
    Fields (3)
    • last_registration_year integer | null

      Year the odometer reading was last registered.

    • judgement string | null

      RDW judgement of the odometer history in RDW wording, e.g. "Logisch" or "Onlogisch".

    • explanation_code string | null

      Code explaining the odometer judgement.

  • inspection_register array of object

    Records of RDW's separate inspection register (dataset Keuringen): the current inspection expiry as that register has it, normally one record with the same date as apk.expiry_date.

    Fields (1)
    • expiry_date string (date) | null

      Date the current inspection expires.

  • reports array of object
    Fields (6)
    • report_date string (date) | null

      Date the inspection station filed the report.

    • report_time string | null

      Time the report was filed, as HH:MM. Date, time and approval type code together identify a report.

    • approval_type object
      Fields (2)
      • code string | null

        Code of the kind of approval the inspection station holds.

      • description string | null

        Kind of approval, e.g. "APK Lichte voertuigen" or "APK Zware voertuigen".

    • report_type string | null

      Kind of report, e.g. a periodic inspection.

    • expiry_date string (date) | null

      Inspection expiry date resulting from this report.

    • defects array of object
      Fields (4)
      • code string | null

        Code of the defect in the RDW defect catalogue.

      • count integer | null

        How many times the defect was found.

      • description string | null

        Description of the defect.

      • article_number string | null

        Article number in the inspection rules.

  • unmatched_defects array of object

    Defects whose report (same date, time and approval type code) is not in the register, kept here with their own report fields instead of being attached to another report.

    Fields (7)
    • report_date string (date) | null

      Date of the inspection report the defect belongs to.

    • report_time string | null

      Time of the inspection report, as HH:MM.

    • approval_type object
      Fields (2)
      • code string | null

        Code of the kind of approval the inspection station holds.

      • description string | null

        Kind of approval of the inspection station.

    • code string | null

      Code of the defect in the RDW defect catalogue.

    • count integer | null

      How many times the defect was found.

    • description string | null

      Description of the defect.

    • article_number string | null

      Article number in the inspection rules.

VehicleMetadata

About this response: schema, source, which view and sections, and how fresh the data is.

  • schema_version "vehicle.v1" required

    Public schema version of the record. A breaking change gets a new version; additive changes do not.

  • source "RDW" required

    The data source: RDW open data (opendata.rdw.nl). GET /datasets names the datasets.

  • view string required

    The view this response is in.

    Values
    compact full raw
  • sections array of string | null required

    Sections in this response, in order (registration always); null in the raw view.

  • data_version string required

    Hash of the synced dataset versions the record was built from; changes with every sync.

  • stale boolean required

    True when any dataset in datasets is stale (see Freshness). Stale data is still served.

  • retrieved_at string (date-time) required

    When this response was produced (UTC). Not a data timestamp: see datasets for RDW publication (source_published_at) and sync (last_checked_at) times.

  • datasets map of Freshness required

    Freshness per dataset (public name): when RDW published the version served, when the sync last checked RDW, and whether it is stale.

VehicleRaw

The raw view (view=raw): the same typed values under RDW's own dataset and column names, for customers who know RDW's open data. One key per RDW dataset: the register as an object, each child dataset as a list of objects; every mapped column present, null when RDW has no value. Columns the API never exposes (RDW API links, columns RDW does not fill) are absent. Enrichments appear under the reference dataset's names: gebrek_omschrijving and gebrek_artikel_nummer in geconstateerde_gebreken, terugroep_actie (object or null) in terugroepacties.

  • voertuigen object required
    Fields (1)
    • kenteken string required
  • brandstof array of object required
  • assen array of object required
  • carrosserie array of object required
  • carrosserie_specificatie array of object required
  • voertuigklasse array of object required
  • subcategorie array of object required
  • bijzonderheden array of object required
  • rupsbanden array of object required
  • keuringen array of object required
  • apk_meldingen array of object required
  • geconstateerde_gebreken array of object required
  • terugroepacties array of object required
  • toegevoegde_objecten array of object required
  • metadata VehicleMetadata required

VehicleRegistration

Registration identifiers and dates. Always present.

  • plate string required

    Registration (kenteken), uppercase without separators.

  • first_admission_date string (date) | null

    Date the vehicle was first admitted to the road, in any country.

  • first_nl_registration_date string (date) | null

    Date the vehicle was first registered to an owner in the Netherlands.

  • registration_date string (date) | null

    Date of the current registration to an owner (tenaamstelling).

  • bpm_depreciation_date string (date) | null

    Approval date used as the depreciation moment for BPM (registration tax).

VehicleResponse

VehicleStatus

Indicators. true/false are RDW's answer; null (absent in the compact view) means RDW gives none.

  • insured boolean | null

    Whether third-party liability (WAM) insurance is registered; null (absent in the compact view) when RDW gives no answer, e.g. not applicable.

  • exported boolean | null

    Whether the vehicle has been exported.

  • taxi boolean | null

    Whether the vehicle is registered as a taxi.

  • open_recall boolean | null

    Whether a recall is open for the vehicle.

  • registration_allowed boolean | null

    Whether the vehicle can currently be registered to an owner.

VehicleTechnical

Technical specifications. Lengths in cm, masses in kg, as RDW publishes them.

  • engine object
    Fields (3)
    • cylinders integer | null

      Number of cylinders.

    • displacement_cc integer | null

      Engine displacement (cc).

    • power_to_mass_ratio_kw_per_kg number | null

      Power per ready-to-drive mass (kW/kg).

  • dimensions object
    Fields (14)
    • length_cm integer | null

      Length (cm).

    • length_min_cm integer | null

      Minimum length, for vehicles with a variable length (cm).

    • length_max_cm integer | null

      Maximum length, for vehicles with a variable length (cm).

    • width_cm integer | null

      Width (cm).

    • width_min_cm integer | null

      Minimum width (cm).

    • width_max_cm integer | null

      Maximum width (cm).

    • height_cm integer | null

      Height (cm).

    • height_min_cm integer | null

      Minimum height (cm).

    • height_max_cm integer | null

      Maximum height (cm).

    • wheelbase_cm integer | null

      Wheelbase (cm).

    • wheelbase_min_cm integer | null

      Minimum wheelbase (cm).

    • wheelbase_max_cm integer | null

      Maximum wheelbase (cm).

    • front_to_coupling_cm integer | null

      Distance from the front of the vehicle to the centre of the coupling (cm).

    • coupling_to_rear_cm integer | null

      Distance from the centre of the coupling to the rear of the vehicle (cm).

  • weights object
    Fields (14)
    • empty_kg integer | null

      Mass of the empty vehicle (kg).

    • curb_kg integer | null

      Ready-to-drive mass (massa rijklaar) (kg).

    • payload_kg integer | null

      Payload (kg).

    • maximum_kg integer | null

      Permitted maximum mass (kg).

    • technical_maximum_kg integer | null

      Technically permitted maximum mass (kg).

    • technical_maximum_min_kg integer | null

      Lower bound of the technically permitted maximum mass (kg).

    • technical_maximum_max_kg integer | null

      Upper bound of the technically permitted maximum mass (kg).

    • operating_min_kg integer | null

      Minimum mass in running order (kg).

    • operating_max_kg integer | null

      Maximum mass in running order (kg).

    • combination_maximum_kg integer | null

      Maximum mass of the vehicle combination (kg).

    • alternative_drive_kg integer | null

      Additional mass of an alternative drivetrain (kg).

    • average_load_value number | null

      Average payload value used for heavy-duty CO2 classification (gem_lading_wrde); RDW does not state the unit, so none is named.

    • towing object
      Fields (5)
      • unbraked_kg integer | null

        Maximum mass of an unbraked trailer (kg).

      • braked_kg integer | null

        Maximum mass of a braked trailer (kg).

      • semi_trailer_braked_kg integer | null

        Maximum mass of a braked semi-trailer (kg).

      • trailer_autonomous_braked_kg integer | null

        Maximum mass of an autonomously braked trailer (kg).

      • center_axle_trailer_braked_kg integer | null

        Maximum mass of a braked centre-axle trailer (kg).

    • coupling object
      Fields (3)
      • point_technical_maximum_kg integer | null

        Technically permitted mass on the coupling point (kg).

      • front_axles_load_coupled_kg integer | null

        Maximum load under the front axle(s) together with the coupling (kg).

      • vertical_load_towed_kg integer | null

        Vertical load on the coupling point of a towed vehicle (kg).

  • speed object
    Fields (3)
    • max_design_kmh integer | null

      Maximum design speed (km/h).

    • deviating_max_kmh integer | null

      Deviating maximum speed, where one applies (km/h).

    • max_assisted_kmh integer | null

      Maximum speed up to which the motor assists (e.g. speed pedelecs) (km/h).

  • brake_system_type_code string | null

    Code of the vehicle's brake system type.

  • tracks object
    Fields (2)
    • configuration_code string | null

      Code of the track (caterpillar) undercarriage configuration.

    • sets array of object
      Fields (6)
      • set_number integer | null

        Sequence number of the track set.

      • driven boolean | null

        Whether the track set is driven.

      • braked boolean | null

        Whether the track set is braked.

      • technical_max_kg integer | null

        Technically permitted maximum mass on the track set (kg).

      • technical_max_min_kg integer | null

        Lower bound of the technically permitted maximum mass (kg).

      • technical_max_max_kg integer | null

        Upper bound of the technically permitted maximum mass (kg).

  • axles array of object
    Fields (12)
    • number integer | null

      Number of the physical axle, counted from the front.

    • axle_count integer | null

      Total number of axles of the vehicle as RDW records it on this axle (aantal_assen); not the number of axle records.

    • position_code string | null

      V for a front axle, A for a rear axle.

    • driven boolean | null

      Whether the axle is driven.

    • liftable_code string | null

      Whether the axle can be lifted (hefas): J or N per RDW, other codes occur in the data.

    • braked boolean | null

      Whether the axle is braked.

    • track_width_cm integer | null

      Track width of the axle (cm).

    • road_behaviour_code string | null

      Suspension of a driven axle: L air suspension, G equivalent to air suspension, A other.

    • loads object
      Fields (4)
      • legal_max_kg integer | null

        Legally permitted maximum axle load (kg).

      • technical_max_kg integer | null

        Technically permitted maximum axle load given by the manufacturer (kg).

      • technical_max_min_kg integer | null

        Lower bound of the technically permitted axle load (kg).

      • technical_max_max_kg integer | null

        Upper bound of the technically permitted axle load (kg).

    • distance_to_next_axle_cm integer | null

      Distance to the next axle (cm).

    • distance_to_next_axle_min_cm integer | null

      Minimum distance to the next axle (cm).

    • distance_to_next_axle_max_cm integer | null

      Maximum distance to the next axle (cm).