Docs menu

Docs / Decode a VIN

Decode a VIN

Last updated 2026-11-13

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

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

Response

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