Docs menu

Docs / Check many VINs

Check many VINs

Last updated 2026-11-13

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

NameInRequiredDescription
vinsbodyyesThe 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.

Response

200 OK
{
  "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.