ToolMint

Catalog / ToolMint NHTSA VIN + Recalls

Coming soon Safety, hazards & recalls

ToolMint NHTSA VIN + Recalls

Decode a US VIN with NHTSA vPIC and return the NHTSA recall campaigns (and optional complaints) for that make/model/year. Not a per-VIN open/unrepaired status check. US Government data (public domain), no API key. Errors and no-match return 4xx and are not charged.

Routes and prices

RoutePriceWhat it doesParameters (* required)
GET /vin/{vin}$0.02VIN decode + recall campaigns for its make/model/yearvin*, includeComplaints, modelYear, recallLimit, complaintLimit
GET /lookup$0.02VIN decode + recalls via queryvin*, includeComplaints, modelYear, recallLimit, complaintLimit
GET /recalls$0.02Recalls by make/model/yearmake*, model*, modelYear*, limit
GET /complaints$0.02Complaints by make/model/yearmake*, model*, modelYear*, limit
GET /decode$0.02vPIC decode onlyvin*, modelYear

Free routes: /, /health, /openapi.json, /.well-known/x402.

When to use it

  • You have a VIN and want the decoded make, model, year, body class and the recall campaigns listed for that model year.
  • You have make/model/year and want recalls (/recalls) or consumer complaints (/complaints).
  • You only want the decode (/decode).

Do not use it to say a car is "recall-free" or that a repair was done.

Example

curl -i "https://toolmint-nhtsa-vin-recalls-json.toolmint.workers.dev/vin/1HGCM82633A004352"

That hostname is the planned worker name. The tool is not deployed yet.

Trimmed response (values are illustrative, not real NHTSA output):

{
  "tool": "nhtsa-vin-recalls-json",
  "version": "0.1.0",
  "fetchedAt": "2026-10-31T12:00:00.000Z",
  "vehicle": {
    "vin": "1HGCM82633A004352",
    "make": "HONDA", "model": "Accord", "modelYear": "2003",
    "bodyClass": "...", "vehicleType": "...", "driveType": null,
    "fuelTypePrimary": "...", "plantCountry": "...", "manufacturer": "...",
    "series": null, "trim": null, "errorCode": "0", "errorText": "..."
  },
  "recalls": {
    "make": "HONDA", "model": "Accord", "modelYear": "2003",
    "count": 2, "totalReported": 2,
    "recalls": [
      {
        "nhtsaCampaignNumber": "...", "manufacturer": "...", "component": "...",
        "summary": "...", "summaryTruncated": false,
        "consequence": "...", "remedy": "...", "reportReceivedDate": "...",
        "parkIt": false, "parkOutSide": false, "overTheAirUpdate": false
      }
    ],
    "source": "api.nhtsa.gov/recalls/recallsByVehicle", "cached": false
  },
  "complaints": null,
  "recallCampaignCount": 2,
  "note": "Recall campaigns NHTSA lists for this make/model/year. This is NOT a per-VIN open/unrepaired status check; confirm a specific VIN at https://www.nhtsa.gov/recalls or with the manufacturer.",
  "provenance": {
    "sources": ["vpic.nhtsa.dot.gov", "api.nhtsa.gov"],
    "fetchedAt": "2026-10-31T12:00:00.000Z",
    "license": "US Government work (NHTSA), public domain (17 U.S.C. 105). No API key.",
    "licenseUrl": "https://www.usa.gov/government-works",
    "endpoints": ["DecodeVinValues", "recallsByVehicle"]
  }
}

/recalls and /complaints return tool, version, fetchedAt, make, model, modelYear, count, totalReported, recalls (or complaints), source, cached, provenance. /decode returns tool, version, fetchedAt, vehicle, provenance.

Data source and licence

NHTSA vPIC and the NHTSA recalls and complaints APIs. US Government work, public domain; no API key. Source names, licence and fetchedAt are in every 200 response.

Freshness and caching

Results may come from a short in-memory cache: VIN decode up to 24 h, recalls and complaints up to 6 h. cached on the recalls/complaints object shows when a cached copy was used.

Limits

  • Campaigns by make/model/year only; not per-VIN open status.
  • Long text is cut (recall summary 1200 chars, consequence and remedy 800, complaint summary 800).
  • Name matching is NHTSA's: a misspelled model looks the same as "no recalls" and returns 404.
  • Complaints are consumer reports to NHTSA, not verified defects.

Errors are not charged

Payment settles only on a successful answer. These responses are never settled:

StatusMeaning (from the OpenAPI)Charged?
400Invalid input (not charged)No
404No NHTSA records (not charged)No
422VIN could not be decoded (not charged)No
502Upstream NHTSA error (not charged)No