Docs / Decode a VIN
Decode a VIN
Decode a VIN to the vehicle and its model's recalls.
POST/v1/vin · API key required
Decodes a 17-character VIN with NHTSA vPIC and points to the model's recalls. The VIN is sent in the request body (never in a URL), is used in memory only, and is never stored, logged or echoed.
This identifies the model. It does not say whether that exact vehicle has an open recall: check the VIN with NHTSA (nhtsa.gov/recalls) or the carmaker.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
vin | body | yes | A 17-character VIN (letters and digits, no I, O or Q). Example: 1HGCM82633A004352 |
Request
curl -X POST https://recalldb.app/v1/vin \
-H "Authorization: Bearer $RECALLDB_KEY" \
-H "Content-Type: application/json" \
-d '{"vin": "1HGCM82633A004352"}'const res = await fetch('https://recalldb.app/v1/vin', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.RECALLDB_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"vin": "1HGCM82633A004352"}),
})
const { data, source } = await res.json()
console.log(data, source.official_url)import os, requests
r = requests.post("https://recalldb.app/v1/vin", headers={"Authorization": f"Bearer {os.environ['RECALLDB_KEY']}"}, json={"vin": "1HGCM82633A004352"})
r.raise_for_status()
body = r.json()
print(body["data"], body["source"]["official_url"])Try it
Runs a real request with no signup (20 a day per network, read-only). VINs you try are used only for this call and never stored.
Get your own key Free: 1,000 requests a month.
Response
{
"data": {
"status": "ok",
"vehicle": {
"year": 2019,
"make": "Honda",
"model": "Civic"
},
"model_recalls_page": "https://checkrecalls.org/cars/honda/civic/2019",
"note": "This decodes the vehicle and finds its model's recalls. It does not say whether this exact vehicle has an open recall."
},
"source": {
"agency": "NHTSA",
"official_id": null,
"official_url": "https://vpic.nhtsa.dot.gov/",
"last_updated": "2026-11-13"
},
"attribution": {
"text": "Data from RecallDB",
"url": "https://recalldb.app"
}
}Every response includes source (agency, official ID, official URL, last updated) and attribution. Attribution rules.
Notes
- status is one of ok, none-found, not-decoded, not-covered, unavailable. none-found never means a vehicle has no recalls.
Errors: error codes. Limits: rate limits.