# 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.

- Status: Coming soon
- Price: $0.02 / call (x402 exact, USDC on Base eip155:8453, payTo 0xfbF7413bcB3a604936775C96FDbe0b0C9c9E37F5)
- Planned URL: https://toolmint-nhtsa-vin-recalls-json.toolmint.workers.dev
- OpenAPI: https://toolmint.toolmint.workers.dev/tools/nhtsa-vin-recalls-json/openapi.json

## Routes

- `GET /vin/{vin}` $0.02: VIN decode + recall campaigns for its make/model/year
- `GET /lookup` $0.02: VIN decode + recalls via query
- `GET /recalls` $0.02: Recalls by make/model/year
- `GET /complaints` $0.02: Complaints by make/model/year
- `GET /decode` $0.02: vPIC decode only

## 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

```bash
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):

```json
{
  "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.
