Why this exists
Every figure below is public and free. The problem is not availability but fragmentation: the answer to an ordinary question is spread across eleven datasets and two code tables, and the most interesting conclusions are in none of them.
One example we ran into while building. The base register says no more about an open recall than Yes. To learn which recall, what can break and how dangerous that is, you have to go from plate to reference code, to the recall description, to the hazard list. On one test vehicle that produced two recalls: one closed from 2018 and one open from 2024 about an airbag inflator that can explode in a crash. Take the first row and you report the wrong one.
The same goes for failed inspection items. One failure says little — it gets repaired. The same failure in three consecutive years says something is structurally wrong. That conclusion is nowhere; it only appears once you group the registrations per inspection round.
Who it is for
Dealers and buyers
Quick check before purchase: is a recall open, does the odometer add up, what has been failing over the past years.
Leasing and rental
Checks on intake and handover, across a whole fleet, without manual lookups.
Insurers and assessors
Recalls and defect history as context for a claim file.
Builders of AI agents
One MCP tool an agent calls by itself the moment a Dutch licence plate appears in the conversation.
What you get back
One JSON response, roughly 10 kB, with these blocks:
| Block | Contents |
|---|---|
identity | Make, model name, vehicle type, date of first registration, age, date of current keeper |
technical | Body, doors, seats, weight, cylinders, displacement, axles, colour |
fuel | Fuel, EURO emission class, CO₂ emissions, consumption, electric range |
inspection | MOT expiry date, days remaining, status, and earlier expiry dates |
defects | Failed items per inspection with readable descriptions, plus the items that recurred across inspection rounds |
odometer | The official verdict on the mileage, with the accompanying explanation |
recalls | All recalls, open and closed, with defect, consequence, possible hazard, repair and scale |
status_flags | Insured, exported, taxi history, awaiting inspection |
value | List price at introduction. Not a current value and not a valuation |
signals | The observations, sorted by severity, each with a recommendation and its basis |
provenance | Per source consulted: which dataset, when retrieved, with what status |
The signals are the point
Facts you can get anywhere. The layer that makes this usable for an agent is signals: observations that never establish a defect, but do say what deserves attention and why.
- open_recall — a recall is open, with what can break and how dangerous it is
- recurring_defect — the same item failed in several inspection rounds
- odometer_illogical — the register judges the mileage to be inconsistent
- odometer_no_judgement — there is no verdict, which is not the same as approval
- imported_vehicle — the history from before import is not in the Dutch register
- emission_zone_restricted — diesel below EURO 5, so possibly barred from low-emission zones
- apk_expired, not_insured, exported, taxi_history, source_unavailable and a few others
What it does not do
Theft status is not included, and that is not an omission
Whether a vehicle is registered as stolen or missing is deliberately not released as open data. Every response says so explicitly, including when the rest of the report is clean — otherwise a complete-looking report without a theft entry reads as "not stolen", which is the most dangerous conclusion anyone could draw from this data.
Beyond that: no valuation, no technical inspection, no buying advice. No accident history, no number of previous owners, no current mileage — those are not in the open registers.
How to use it
As an MCP server, in Claude, Cursor or another agent
Claude (web or desktop, works on every plan including free):
go to Customize → Connectors → + → Add custom connector and paste
https://vehicle-context.tradebrite.nl/mcp. Claude cannot install this for you; that is deliberately your action, because a connector may act on your behalf.
ChatGPT: custom connectors sit behind Developer Mode and are only available on Pro, Team, Enterprise and Edu — on a Plus plan it is not possible. Use the plain HTTPS API below instead.
Claude Code:
claude mcp add --transport http vehicle-context https://vehicle-context.tradebrite.nl/mcp
Or by hand in your MCP configuration:
{
"mcpServers": {
"vehicle-context": {
"type": "http",
"url": "https://vehicle-context.tradebrite.nl/mcp"
}
}
}
After that you can simply ask: "What do you know about plate 73-BGS-7, is that a sensible buy?" The agent calls the tool itself.
As an HTTPS API
curl "https://vehicle-context.tradebrite.nl/v1/vehicle/context?plate=73-BGS-7"
| Parameter | Meaning |
|---|---|
plate | Licence plate, with or without dashes. 73-BGS-7, 73BGS7 and 73 bgs 7 all work. |
depth | compact (default) or full. Full gives the complete inspection history and the source URLs. |
refresh | 1 bypasses the one-hour cache. |
Also: GET / returns a self-description and GET /health the status.
Sources, licence and limits on use
The source data comes from the public Dutch vehicle register and the recall register, eleven datasets in total, all published under Creative Commons Zero. No API key is needed and there are no costs.
The publisher gives no guarantee of availability or currency and may withdraw datasets without notice, so neither do we. If a source does not answer, the report says so in as many words instead of leaving the field empty.
Rate limit
10 requests per 10 seconds and 60 per minute, per IP address. Exceeding it returns HTTP 429 with a Retry-After header. That limit mainly protects the publisher's platform: one request here causes up to eleven there. Need more on a structural basis? Send us a mail.
Liability
This service is offered free of charge and without warranty. Decisions about buying, selling or maintenance remain the responsibility of the user. Before any actual transaction, always check the vehicle itself and the official registers.
Privacy
A licence plate can be personal data under the GDPR once it can be linked to a person. The source data contains no names or addresses — the publisher releases only data that is not privacy-sensitive.
We log no plates and no IP addresses. That is a deliberate choice: a log file with plates and timestamps would create exactly the link that is absent from the source data. What we do keep, to improve the service: make, year of construction, vehicle type, which signals were issued, and how long the request took. None of that identifies anyone.
There are no accounts, no cookies and no trackers on this service. The IP address is used briefly as a key for the rate limiter, and nothing is stored alongside it but a counter. Questions: info@tradebrite.nl.
Source code
The code is open on GitHub, under the MIT licence: github.com/rleefers/dutch-vehicle-context. You can run it on your own Cloudflare account; no keys are needed for the open sources. The repository also holds the regression test we use to check that the joins are correct.
This service is also listed in the official MCP registry as
nl.tradebrite/dutch-vehicle-context.
Questions, or something broken?
This service is built and maintained by Tradebrite BV. Something wrong in a report, a figure missing, or do you need more volume? Let us know — error reports about specific plates are the most useful.