# RDW Kenteken Scraper - Dutch Vehicle Registry Lookup (`studio-amba/rdw-kenteken-scraper`) Actor

Look up any Dutch license plate (kenteken) in the official RDW vehicle registry. Get make, model, APK expiry, catalog price, fuel type, CO2 emissions, and recall status for 16.8M vehicles. Bulk plate lists and filter search supported. Official open data, no login required.

- **URL**: https://apify.com/studio-amba/rdw-kenteken-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## RDW Kenteken Scraper

Look up any Dutch license plate (kenteken) in the official RDW vehicle registry. The actor queries the RDW open data API directly, so you get authoritative registration data for all 16.8 million vehicles registered in the Netherlands. No login, no cookies, no scraping tricks. The data is refreshed by RDW daily.

Give it one plate, a list of thousands, or a filter query (make, vehicle type, APK expiry date) and get back a clean, structured record per vehicle: make, model, APK/MOT expiry, catalog price, fuel type, CO2 emissions, open recall status, and more.

### What is the RDW registry

RDW (Rijksdienst voor het Wegverkeer) is the Dutch national vehicle authority. Every vehicle registered in the Netherlands has a record in its registry, published as open data. This actor wraps that dataset (plus the fuel/emissions sub-dataset) into a simple bulk lookup tool, so you don't have to learn the Socrata query language or write your own batching logic.

### Use cases

- **Fleet checks**: verify APK (MOT) expiry dates and insurance status for a whole fleet in one run
- **Car dealers and marketplaces**: enrich listings with official registration data, catalog price, and recall flags
- **Lead generation for garages**: find vehicles of a given make whose APK expires soon
- **Insurance and finance**: validate plate, model, first registration date, and weight class before quoting
- **Data teams**: join official vehicle data onto your own datasets by license plate

### Input

| Field | Type | Description |
|-------|------|-------------|
| `kentekens` | array | Dutch plates to look up. Any format: `1-KBB-99`, `1KBB99`, `1 kbb 99` all work |
| `searchFilters` | object | Alternative to plates: `make` (e.g. `TESLA`), `vehicleType` (e.g. `Personenauto`), `apkExpiryBefore` (ISO date). Filter searches can match MANY vehicles, so set `maxResults` |
| `includeFuelData` | boolean | Join fuel type, CO2, consumption, power, and emission class per vehicle (default `true`) |
| `maxResults` | integer | Cap on the number of vehicles returned (default 100) |
| `appToken` | string | Optional free Socrata app token for guaranteed throughput on large runs |
| `proxyConfiguration` | object | Standard Apify proxy settings. The API is public, so the default works |

Example input:

```json
{
    "kentekens": ["1-KBB-99", "0001-TJ"],
    "includeFuelData": true,
    "maxResults": 10
}
````

Or search by filters instead of plates:

```json
{
    "searchFilters": {
        "make": "TESLA",
        "apkExpiryBefore": "2026-09-01"
    },
    "maxResults": 100
}
```

### Output

One record per vehicle. Real sample for plate `1-KBB-99`:

```json
{
    "kenteken": "1-KBB-99",
    "kentekenRaw": "1KBB99",
    "make": "HYUNDAI",
    "model": "VELOSTER",
    "vehicleType": "Personenauto",
    "bodyType": "hatchback",
    "color": "ZWART",
    "firstRegistrationDate": "2013-03-08",
    "firstRegistrationNL": "2013-03-08",
    "apkExpiryDate": "2027-03-08",
    "catalogPrice": 30545,
    "grossBpm": 5250,
    "numberOfSeats": 4,
    "numberOfCylinders": 4,
    "engineDisplacement": 1591,
    "massEmpty": 1160,
    "curbWeight": 1260,
    "numberOfDoors": 4,
    "euVehicleCategory": "M1",
    "energyLabel": "B",
    "odometerJudgment": "Logisch",
    "insured": true,
    "openRecall": false,
    "exportIndicator": false,
    "taxiIndicator": false,
    "fuelType": "Benzine",
    "co2Emission": 137,
    "fuelConsumptionCombined": 5.9,
    "powerKw": 103,
    "electricRange": null,
    "emissionClass": "EURO 5 A",
    "url": "https://ovi.rdw.nl/default.aspx?kenteken=1KBB99",
    "scrapedAt": "2026-07-11T12:00:00.000Z"
}
```

### How to scrape RDW kenteken data

1. Go to this actor's page on the [Apify Store](https://apify.com/store) and click **Try for free**.
2. Enter one or more Dutch license plates in the **License Plates** field. Dashes and spaces don't matter, the actor normalizes them.
3. Leave **Include Fuel & Emissions Data** on if you want fuel type, CO2, and emission class per vehicle.
4. Click **Start**. Results appear in the dataset within seconds and can be exported as JSON, CSV, or Excel.
5. For bulk lookups, paste your full plate list. Plates are queried in batches of 100 per API call, so even thousands of plates run fast.
6. To search instead of look up, fill **Search Filters** with a make, vehicle type, or APK expiry date and set **Max Results**.

You can also run the actor programmatically via the [Apify API](https://docs.apify.com/api):

```bash
curl "https://api.apify.com/v2/acts/studio-amba~rdw-kenteken-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"kentekens": ["1-KBB-99"]}'
```

### Rate limits and app tokens

The RDW open data API is keyless, but anonymous callers share a soft rate-limit pool on the Socrata platform. For normal volumes (up to thousands of plates per run) this is not a problem, since the actor batches 100 plates per request and paces its calls. For very large or frequent runs, get a free app token at [opendata.rdw.nl](https://opendata.rdw.nl/profile/edit/developer_settings) and paste it into the **Socrata App Token** field for guaranteed throughput.

### FAQ

**Is this legal?**
Yes. RDW publishes this registry as official open data, intended for reuse. The actor only reads public data through the official API.

**Does it include owner information?**
No. The RDW open data contains vehicle data only. Owner names and addresses are not public.

**How fresh is the data?**
RDW refreshes the open dataset daily. APK expiry dates, insurance status, and recall flags reflect the latest published state.

**What happens with a plate that doesn't exist?**
It's logged as not found. If at least one plate resolves, the run succeeds and the missing plates are listed in the log. If nothing resolves, the run fails loudly so a typo'd list can't silently produce an empty dataset.

**Which vehicles are covered?**
Everything with a Dutch registration: passenger cars, commercial vehicles, motorcycles, mopeds, trailers. That's 16.8 million records.

**Can I filter by APK expiry?**
Yes. Use `searchFilters.apkExpiryBefore` with an ISO date to find vehicles whose APK inspection expires before that date, optionally combined with `make` or `vehicleType`.

### Related Scrapers

- [AutoHero Scraper](https://apify.com/store?search=autohero-scraper) for used-car listings across Europe
- [Marktplaats Scraper](https://apify.com/store?search=marktplaats-scraper) for the biggest Dutch classifieds site
- [AutoScout24 Scraper](https://apify.com/store?search=autoscout24-scraper) for Europe's largest car marketplace
- [AutoTrader UK Scraper](https://apify.com/store?search=autotrader-uk-scraper) for the UK's largest car marketplace

### Support

Found an issue or missing a field you need? Open an issue on the actor's page and it gets picked up quickly.

# Actor input Schema

## `kentekens` (type: `array`):

One or more Dutch license plates to look up. Any format works: '1-KBB-99', '1KBB99', '1 kbb 99' are all normalized automatically. Plates are fetched in efficient batches.

## `searchFilters` (type: `object`):

Search the registry by criteria instead of exact plates. Supported keys: 'make' (e.g. 'TESLA'), 'vehicleType' (e.g. 'Personenauto', 'Bedrijfsauto', 'Motorfiets'), 'apkExpiryBefore' (ISO date, e.g. '2026-09-01' — vehicles whose APK/MOT inspection expires before that date). Filters can match MANY vehicles — use Max Results to cap the output. When both plates and filters are set, plates win.

## `includeFuelData` (type: `boolean`):

Join the RDW fuel/emissions sub-dataset per vehicle: fuel type, CO2 emissions, combined fuel consumption, engine power, and EU emission class. Adds one extra batched API call per 100 vehicles.

## `maxResults` (type: `integer`):

Maximum number of vehicles to return. Mostly relevant for filter searches, which can match millions of vehicles.

## `appToken` (type: `string`):

Optional free Socrata app token (X-App-Token header). The RDW API works without one, but anonymous callers share a soft rate-limit pool. Get a free token at https://opendata.rdw.nl/profile/edit/developer\_settings for guaranteed throughput on large runs.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. The RDW open data API is public and does not block datacenter IPs, so the default works fine.

## Actor input object example

```json
{
  "kentekens": [
    "1-KBB-99"
  ],
  "includeFuelData": true,
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "kentekens": [
        "1-KBB-99"
    ],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/rdw-kenteken-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "kentekens": ["1-KBB-99"],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/rdw-kenteken-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "kentekens": [
    "1-KBB-99"
  ],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/rdw-kenteken-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/rdw-kenteken-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RDW Kenteken Scraper - Dutch Vehicle Registry Lookup",
        "description": "Look up any Dutch license plate (kenteken) in the official RDW vehicle registry. Get make, model, APK expiry, catalog price, fuel type, CO2 emissions, and recall status for 16.8M vehicles. Bulk plate lists and filter search supported. Official open data, no login required.",
        "version": "0.0",
        "x-build-id": "WMBhK8bZy439qgEoD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~rdw-kenteken-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-rdw-kenteken-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~rdw-kenteken-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-rdw-kenteken-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~rdw-kenteken-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-rdw-kenteken-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "kentekens": {
                        "title": "License Plates (Kentekens)",
                        "type": "array",
                        "description": "One or more Dutch license plates to look up. Any format works: '1-KBB-99', '1KBB99', '1 kbb 99' are all normalized automatically. Plates are fetched in efficient batches.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchFilters": {
                        "title": "Search Filters (instead of plates)",
                        "type": "object",
                        "description": "Search the registry by criteria instead of exact plates. Supported keys: 'make' (e.g. 'TESLA'), 'vehicleType' (e.g. 'Personenauto', 'Bedrijfsauto', 'Motorfiets'), 'apkExpiryBefore' (ISO date, e.g. '2026-09-01' — vehicles whose APK/MOT inspection expires before that date). Filters can match MANY vehicles — use Max Results to cap the output. When both plates and filters are set, plates win."
                    },
                    "includeFuelData": {
                        "title": "Include Fuel & Emissions Data",
                        "type": "boolean",
                        "description": "Join the RDW fuel/emissions sub-dataset per vehicle: fuel type, CO2 emissions, combined fuel consumption, engine power, and EU emission class. Adds one extra batched API call per 100 vehicles.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum number of vehicles to return. Mostly relevant for filter searches, which can match millions of vehicles.",
                        "default": 100
                    },
                    "appToken": {
                        "title": "Socrata App Token (optional)",
                        "type": "string",
                        "description": "Optional free Socrata app token (X-App-Token header). The RDW API works without one, but anonymous callers share a soft rate-limit pool. Get a free token at https://opendata.rdw.nl/profile/edit/developer_settings for guaranteed throughput on large runs."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. The RDW open data API is public and does not block datacenter IPs, so the default works fine."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
