One call, one answer
A tiny REST API. Send a VIN or a plate, get a flat JSON check back: make, model, mileage, accidents, title. One key, one header, fast answers.
https://api.scan-vin.com/v1Start in 3 steps
Grab a key
Sign up and copy your API key from the dashboard. One key works for testing and for live. No setup, no approval queue.
Make the call
Add your key in the X-Api-Key header and POST a VIN or plate to /v1/check. That is the whole integration.
Read the JSON
You get one flat JSON object: make, model, mileage, accidents, title. No nesting, no polling. Just read the fields.
Auth
Put your key in one header: X-Api-Key: YOUR_KEY. That is it. No Bearer token, no OAuth dance. Keep the key secret and rotate it from the dashboard whenever you like.
curl https://api.scan-vin.com/v1/vin/WBA3A5G59DNP26082 \
-H "X-Api-Key: YOUR_API_KEY"The call
Three endpoints, nothing more. POST a VIN or plate to run a check, GET it back by id, or decode a VIN on its own. Everything is flat JSON.
/v1/checkRun a check
The one you will use. POST a VIN or a plate and get the full check back in a single flat response, usually in a few seconds.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| vin | string | optional | 17-character VIN. Send this or `plate`. |
| plate | string | optional | License plate. Send this or `vin`. |
| country | string | optional | Two-letter country code (e.g. `FR`, `DE`). Needed when you send a `plate`. |
Example
curl -X POST https://api.scan-vin.com/v1/check \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vin": "WBA3A5G59DNP26082"}'/v1/check/{check_id}Get a check
Fetch a check you already ran by its id. Same flat object as the POST response.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| check_id | string | required | Path parameter. The check id we gave you (`chk_...`). |
Example
curl https://api.scan-vin.com/v1/check/chk_5a1b \
-H "X-Api-Key: YOUR_API_KEY"/v1/vin/{vin}Decode a VIN
Just want the basics? This reads a VIN and returns make, model and year. Instant, no history pull.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| vin | string | required | Path parameter. The 17-character VIN to decode. |
Example
curl https://api.scan-vin.com/v1/vin/WBA3A5G59DNP26082 \
-H "X-Api-Key: YOUR_API_KEY"The response
Always the same flat shape: an `ok` flag, the `check_id`, and the car facts as top-level fields. Nothing nested for the sake of it, just read what you need.
{
"check_id": "chk_5a1b",
"vin": "WBA3A5G59DNP26082",
"ok": true,
"make": "BMW",
"model": "320d",
"year": 2019,
"mileage_km": 142350,
"accidents": 0,
"stolen": false,
"title": "clean",
"checked_at": "2026-03-12T10:04:00Z"
}When it fails
Plain HTTP codes. On an error you get a flat object with `ok: false`, a `code` and a `message` that tells you what to fix. No guessing.
| Code | Message | Description |
|---|---|---|
| 400 | Bad Request | Something is missing or wrong in your request, like no VIN and no plate. |
| 401 | Unauthorized | Your key is missing or wrong. Check the X-Api-Key header. |
| 403 | Forbidden | Your key can't use this call. Check your plan. |
| 404 | Not Found | We couldn't find that car or check. |
| 429 | Too Many Requests | You are going too fast. Slow down and retry after the X-RateLimit-Remaining count resets. |
| 500 | Server Error | Our side hiccupped. Try again, and ping us if it keeps happening. |
{
"ok": false,
"code": 401,
"error": "Unauthorized",
"message": "The X-Api-Key header is missing or invalid."
}Plug in our car data
Get a key and make your first call in minutes. The same key works when you go live, no code changes needed.