Docs / Check many VINs
Check many VINs
Decode many VINs and list the recalls filed for each one's make, model and year.
POST/v1/vins/batch · API key required
Send up to 5 VINs per call on a free key (each VIN counts as one request); up to 100 per call is planned for Pro. Each VIN is checked (17 characters, no I, O or Q, and the North American check digit), decoded with NHTSA vPIC, and matched to the NHTSA recalls filed for its make, model and model year, with the remedy as NHTSA wrote it.
This lists recalls filed for the model year. It does not say whether one exact vehicle still has an open recall: no official free API offers that, so check each VIN at nhtsa.gov/recalls or with a dealer. VINs are used in memory only and are never logged or stored.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
vins | body | yes | The VINs, 17 characters each. Example: 1HGCM82633A004352 |
Request
curl -X POST https://recalldb.app/v1/vins/batch \
-H "Authorization: Bearer $RECALLDB_KEY" \
-H "Content-Type: application/json" \
-d '{"vins": ["1HGCM82633A004352", "5YJ3E1EA7KF317000"]}'const res = await fetch('https://recalldb.app/v1/vins/batch', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.RECALLDB_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"vins": ["1HGCM82633A004352", "5YJ3E1EA7KF317000"]}),
})
const { data, source } = await res.json()
console.log(data, source.official_url)import os, requests
r = requests.post("https://recalldb.app/v1/vins/batch", headers={"Authorization": f"Bearer {os.environ['RECALLDB_KEY']}"}, json={"vins": ["1HGCM82633A004352", "5YJ3E1EA7KF317000"]})
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, up to 2 VINs). VINs you try are used only for this call and never stored.
Get your own key Free: 1,000 requests a month.
Response
{
"data": [
{
"vin": "1HGCM82633A004352",
"status": "ok",
"message": "Recalls filed for this make, model and year. To confirm whether this vehicle's recall has been repaired, check nhtsa.gov/recalls or a dealer.",
"vehicle": {
"year": 2003,
"make": "Honda",
"model": "Accord"
},
"model_year_recall_count": 1,
"recalls": [
{
"id": "03V123000",
"date": "2003-04-01",
"component": "AIR BAGS",
"summary": "The air bag may not deploy.",
"remedy": "Dealers will replace the inflator, free of charge.",
"severity": "standard",
"page_url": "https://checkrecalls.org/recall/03v123000",
"official_url": "https://www.nhtsa.gov/recalls?nhtsaId=03V123000"
}
],
"check_this_vin": "https://www.nhtsa.gov/recalls"
},
{
"vin": "5YJ3E1EA7KF317001",
"status": "check_digit_mismatch",
"message": "The 9th character (the check digit) does not match the rest of the VIN, so it was probably mistyped.",
"vehicle": null,
"model_year_recall_count": null,
"recalls": [],
"check_this_vin": "https://www.nhtsa.gov/recalls"
}
],
"meta": {
"vins": 2,
"counted_requests": 2
},
"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, invalid, check_digit_mismatch, not_decoded, not_covered, unavailable. None of them means a vehicle has no recall.
- More VINs than your plan allows per call answers 400 batch_too_large; a call that would pass the monthly quota answers 429 quota_exceeded before anything is counted.
Errors: error codes. Limits: rate limits.