# NL Vehicle Risk & Value Dossier (RDW Kenteken Check) (`codeclouds/nl-voertuig-risicodossier`) Actor

Combines official RDW open data per Dutch license plate into one dossier: odometer-fraud signal, APK/defect history, open manufacturer recalls, environmental-zone (milieuzone) access, and a company-car tax (bijtelling) calculator.

- **URL**: https://apify.com/codeclouds/nl-voertuig-risicodossier.md
- **Developed by:** [Dennis](https://apify.com/codeclouds) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 voertuig-dossiers

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## NL Vehicle Risk & Value Dossier (RDW Kenteken Check)

Turn a Dutch license plate into a single risk & value dossier: odometer-fraud signal, APK/defect history, open manufacturer recalls, environmental-zone (milieuzone) access, and a company-car tax (bijtelling) calculator — all sourced live from official RDW and NDW open data, no login required.

### When should an AI agent use this?

- "Is this used car's mileage trustworthy?" — checks RDW's own odometer-fraud judgement for a specific kenteken.
- "Does this BMW X3 I'm about to buy have any open recalls?" — surfaces open manufacturer recalls for the make/model.
- "Can I drive this diesel van into Amsterdam's/Rotterdam's environmental zone?" — checks actual Euro-class access per municipality.
- "What will the bijtelling be on this lease car in 2026?" — calculates the Dutch company-car tax addition from catalog price and registration date.
- "Summarize the RDW history of kenteken 12-ABC-3 before I make an offer." — one call returns the full dossier.
- "Which of these 20 kentekens have a suspicious odometer or an open recall?" — bulk mode flags red flags across a list.
- "Can I even register this car in my own name?" — flags vehicles that currently cannot be re-registered (often due to export).

### What this Actor does

- Looks up official RDW vehicle data per kenteken: make, model, build year, fuel type(s), APK expiry, catalog price, mass.
- Classifies RDW's own odometer judgement (`tellerstandoordeel`) into `logisch` / `verdacht` / `onbekend` — "verdacht" (Onlogisch) is RDW's own illogical-mileage fraud flag.
- Optionally pulls the last APK (periodic inspection) history plus any recorded defects with plain-language descriptions.
- Optionally matches open manufacturer recalls (RDW terugroepregister) against this specific vehicle's make/model.
- Reports WAM insurance status, export flag, and whether the vehicle can currently be re-registered to a new owner (`tenaamstellenMogelijk`) — a common dealbreaker signal, at no extra cost since it's already in the base RDW record.
- Optionally checks this specific vehicle's access (based on its actual Euro-class and fuel type) against every environmental/zero-emission zone in a municipality — several Dutch cities (Amsterdam, Rotterdam, Utrecht, Den Haag and others) run a regular low-emission zone *and* a separate zero-emission zone at the same time, and both are reported.
- Optionally calculates the Dutch company-car tax addition (bijtelling privégebruik), including the zero-emission discount tiers and the 60-month rule.
- Bulk mode: up to 200 kentekens in a single run.

### Input

| Field | Type | Description |
|---|---|---|
| `kentekens` | array of strings | Dutch license plates, with or without dashes. Required, 1-200. |
| `includeApkHistorie` | boolean | Include APK history + defects. Default `true`. |
| `includeTerugroepacties` | boolean | Include open manufacturer recalls when RDW flags one. Default `true`. |
| `milieuzoneGemeenten` | array of strings | Municipality names to check this vehicle's zone access against. Default `[]` (skip). |
| `berekenBijtelling` | boolean | Calculate the company-car tax addition. Default `false`. |

### Output

```json
{
  "recordType": "voertuigdossier",
  "kenteken": "JDX29F",
  "gevonden": true,
  "merk": "DACIA",
  "handelsbenaming": "SANDERO",
  "voertuigsoort": "Personenauto",
  "brandstoffen": ["Benzine", "LPG"],
  "bouwjaar": 2025,
  "apkVervaldatum": "2028-09-09",
  "apkVerlopen": false,
  "catalogusprijs": 24100,
  "massaRijklaar": 1228,
  "europeseVoertuigcategorie": "M1",
  "tellerstand": {
    "oordeel": "Logisch",
    "classificatie": "logisch",
    "jaarLaatsteRegistratie": 2025,
    "toelichting": "De geregistreerde kilometerstanden zijn consistent bevonden bij eerdere keuringen."
  },
  "apkHistorie": { "laatsteKeuringen": [], "gebreken": [] },
  "wamVerzekerd": "Ja",
  "exportIndicator": false,
  "tenaamstellenMogelijk": true,
  "heeftOpenstaandeTerugroepactie": false,
  "terugroepacties": null,
  "terugroepactiesAantalGevonden": null,
  "milieuzoneToegang": null,
  "bijtelling": null,
  "samenvatting": {
    "risiconiveau": "laag",
    "aandachtspunten": [],
    "omschrijving": "Geen aandachtspunten gevonden in de gecontroleerde RDW-signalen."
  },
  "disclaimer": "Indicatief dossier op basis van publieke RDW/NDW-open-data — geen taxatie, keuring, garantie of juridisch/fiscaal advies.",
  "bron": "RDW Open Data + NDW Emissiezones"
}
```

The `samenvatting` block (`risiconiveau`: laag/middel/hoog/onbekend) is a free summary derived from data already fetched — no extra charge.

### Use cases

- Occasion buyers/dealers verifying a vehicle's history before purchase (odometer trust, open recalls, APK defects).
- Leasing companies and insurers screening vehicles at acceptance/intake.
- Fleet/logistics planners checking environmental-zone access before routing a specific vehicle into a city center.
- Employers/employees calculating the exact bijtelling for a company car offer.

### Pricing

This Actor uses Apify's Pay-Per-Event (PPE) pricing model.

- **Actor Start:** $0.00005 (Apify default)
- **voertuig-dossier:** $0.012 per license plate found
- **tellerstand-fraude-signaal:** $0.02 when a suspicious ("Onlogisch") odometer judgement is detected
- **terugroepactie-resultaat:** $0.015 per vehicle when 1+ open recalls are found (flat, not per recall)
- **milieuzone-resultaat:** $0.008 per municipality checked
- **bijtelling-berekening:** $0.01 when a full calculation is delivered

### Legal

Data sources: RDW Open Data (kenteken/APK/tellerstand/recall registers) and NDW's official emission-zones feed — both public Dutch government open data, no authentication. No personal/owner data is retrieved or exposed; only vehicle-level technical data. Recall matching is by make+model (RDW's open data does not link a recall to an individual VIN/kenteken), so recall results are **indicative**, not a guaranteed per-vehicle confirmation — always shown alongside RDW's own kenteken-specific "open recall" indicator. The bijtelling calculation follows the standard national tax rules and does not account for individual tax situations — it is not tax advice. This is an indicative dossier, not a vehicle inspection, valuation or legal/fiscal advice.

### FAQ

**Q: Does this check who owns the vehicle?**
A: No. Only vehicle-level technical data is retrieved — no owner/keeper personal data.

**Q: Is a "verdacht" (suspicious) odometer result proof of fraud?**
A: No — it reflects RDW's own "Onlogisch" classification, based on inconsistent mileage readings across inspections. Always verify further before acting on it.

**Q: Why is the recall list capped at 15?**
A: For long-running models the make+model match can surface dozens of historical recalls that are not individually excludable per VIN. The dossier shows the 15 most recent and always reports the true total found (`terugroepactiesAantalGevonden`).

**Q: Can I check zone access without knowing the vehicle's Euro class myself?**
A: Yes — the actor derives it directly from RDW's own emission-level field per vehicle, no manual lookup needed.

**Q: A municipality shows up twice in `milieuzoneToegang` — is that a bug?**
A: No. Several Dutch cities (Amsterdam, Rotterdam, Utrecht, Den Haag, Haarlem, Delft, Leiden, Maastricht, Amersfoort) run more than one zone at the same time — typically a regular low-emission zone plus a separate zero-emission zone, each with its own access rule. You'll get one record per zone.

### Related Actors

- **[NL Emission Zones Monitor (Milieuzones & Zero-Emission Zones)](https://apify.com/codeclouds/nl-emissiezones-monitor)** — for scanning all Dutch environmental zones nationwide (this actor instead checks one specific vehicle's access per zone).

***

*Zoekwoorden: kenteken check, RDW voertuiggegevens, tellerstandcheck, kilometerstand fraude, terugroepactie, milieuzone check auto, bijtelling berekenen, occasion check.*

### Keywords

netherlands, rdw, kenteken, license-plate, vehicle-history, odometer-fraud, recall, milieuzone, emission-zone, bijtelling, company-car-tax, open-data

### Changelog

#### 0.4.0

- Bugfix: municipalities that run more than one zone at once (10 of ~27 in the feed, e.g. Amsterdam, Rotterdam, Utrecht, Den Haag) previously only had their first zone checked — the other zone(s) were silently skipped. All matching zones are now reported.
- New free fields: `wamVerzekerd`, `exportIndicator`, `tenaamstellenMogelijk` (whether the vehicle can currently be re-registered to a new owner — a common dealbreaker signal, often correlated with an export flag). Sourced from data already fetched, no extra charge.
- `tenaamstellenMogelijk: false` now always raises the `samenvatting` risk level to "hoog", same as a suspicious odometer reading.

#### 0.3.0

- Bugfix: a regular (non-plug-in) or plug-in hybrid that still lists a combustion fuel is no longer misclassified as zero-emission — only vehicles that run purely on electricity/hydrogen qualify for the bijtelling discount and zero-emission-zone access.
- New free field: `apkVerlopen` (whether the APK expiry date has already passed).
- New free field: `samenvatting` — a risk-level summary (laag/middel/hoog/onbekend) derived from data already fetched, no extra charge.
- Performance/fairness: recall lookups for vehicles sharing the same make within one run are now cached instead of re-fetched per vehicle.

#### 0.2.0

- Bugfix: a zero-emission vehicle (electric/hydrogen) now always passes an environmental-zone Euro-class check, regardless of the homologation-era emission value RDW still records for it.
- Robustness: the Euro-class used for zone checks is now taken from the first fuel-row that actually has one, instead of always row 0.

#### 0.1.0

- Initial release: RDW basisgegevens, tellerstand-fraude-classificatie, APK-historie, terugroepacties (merk+type-match), milieuzone-toegang, bijtellingscalculator.

# Actor input Schema

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

Dutch license plates, with or without dashes (e.g. "12-ABC-3" or "12ABC3"). At least 1 required.

## `includeApkHistorie` (type: `boolean`):

Include the last periodic (APK) inspections and any officially recorded defects (with plain-language descriptions).

## `includeTerugroepacties` (type: `boolean`):

Look up open manufacturer recalls (RDW terugroepregister) for this make/model when RDW's own indicator flags an open recall. New charged event terugroepactie-resultaat ($0.015 per vehicle), only when at least 1 recall is found. Matching is by make+model (RDW does not link recalls to individual VINs), so treat results as indicative, not a guaranteed per-vehicle confirmation.

## `milieuzoneGemeenten` (type: `array`):

Municipality names (e.g. "Amsterdam", "Rotterdam") to check this specific vehicle's access against (via the official NDW emission-zones feed). Leave empty to skip. New charged event milieuzone-resultaat ($0.008 per municipality checked). Ad-hoc/single-run use: this only checks the municipalities you list, it does not scan the whole country.

## `berekenBijtelling` (type: `boolean`):

Calculate the Dutch company-car tax addition (bijtelling privégebruik) for this vehicle, based on catalog price, fuel type and first-registration year. New charged event bijtelling-berekening ($0.01), only when catalog price and registration date are both available.

## Actor input object example

```json
{
  "kentekens": [
    "69-ZZR-3"
  ],
  "includeApkHistorie": true,
  "includeTerugroepacties": true,
  "milieuzoneGemeenten": [],
  "berekenBijtelling": false
}
```

# 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": [
        "69-ZZR-3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/nl-voertuig-risicodossier").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": ["69-ZZR-3"] }

# Run the Actor and wait for it to finish
run = client.actor("codeclouds/nl-voertuig-risicodossier").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": [
    "69-ZZR-3"
  ]
}' |
apify call codeclouds/nl-voertuig-risicodossier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=codeclouds/nl-voertuig-risicodossier",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/EB8vN70duGigMuHxc/builds/shZb1DROoZQTdkEDS/openapi.json
