# VIN Decoder + Recalls, Complaints & Safety Ratings (NHTSA Bulk) (`knobby_woodworker_aig/nhtsa-vin-decoder-recalls`) Actor

Bulk-decode VINs (50 per call) with official NHTSA vPIC data, then add open recall campaigns, complaint counts (crash/fire/injury), top problem components and NCAP star ratings. Check-digit validation, dedupe, clear error status. No API key.

- **URL**: https://apify.com/knobby_woodworker_aig/nhtsa-vin-decoder-recalls.md
- **Developed by:** [Reval](https://apify.com/knobby_woodworker_aig) (community)
- **Categories:** Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 decoded vins

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## VIN Decoder + Recalls, Complaints & NCAP Safety Ratings (NHTSA, bulk)

Paste a list of VINs and get **one clean row per VIN**: the full official NHTSA vPIC decode **plus** recall campaigns, owner-complaint statistics and NCAP 5-Star safety ratings for that vehicle. Other Store tools make you run a decoder, then a separate recall lookup, then a ratings lookup. This Actor does all three in one run.

| Every row includes | Source |
|---|---|
| Year, make, model, trim, series, body, doors, drive type, fuel, **EV / hybrid level**, engine (cyl, litres, HP, code), transmission, GVWR class, plant city/state/country, airbags, ABS/ESC/ADAS features | NHTSA vPIC batch decoder |
| **Check-digit validation** computed locally, **decodeStatus** (`clean` / `decoded_with_warnings` / `failed`), NHTSA error codes in plain English, suggested VIN | ISO 3779 + vPIC |
| WMI and world region of manufacture | VIN positions 1–3 |
| **Recall campaigns**: count, campaign numbers, latest recall date, **"park it" / "park outside" warnings**, over-the-air remedy flag, and optionally full summary, consequence and remedy text with a link | NHTSA Recalls API |
| **Complaint stats**: total owner complaints, how many involved a **crash** or **fire**, injuries, deaths, and the **top 5 problem components** | NHTSA Complaints API (counts only, no complainant data) |
| **NCAP ratings**: overall, frontal, side, rollover stars, rollover risk %, ESC/FCW/LDW standard or optional, open investigation count | NHTSA 5-Star Safety Ratings API |

### What it fixes compared with other VIN tools

- **No start fee and no per-call surprises.** You pay per VIN returned, nothing else.
- **Batch by default.** VINs go to NHTSA 50 at a time, and each unique year/make/model is only looked up once. 10,000 VINs from a fleet with 200 models costs 200 enrichment lookups, so runs stay fast.
- **Messy input is fine.** Paste a spreadsheet column with commas, spaces and lowercase. Duplicates are removed.
- **Bad VINs don't break the run.** Invalid or partial VINs still get a row with a clear `decodeStatus`, the failing check digit and NHTSA's suggestion, so you can fix your data.
- **Honest about recalls.** NHTSA's public API lists recall campaigns by model year, make and model. Whether one specific VIN has already been repaired is only available from the manufacturer or the nhtsa.gov VIN lookup, so every row links straight to that page (`nhtsaRecallLookupUrl`).
- **Official, ToS-clean data.** US government public-domain APIs. No scraping, no proxies, no API key.

### Pricing: $1.50 per 1,000 VINs, all enrichment included

| | This Actor | Typical VIN decoders on the Store |
|---|---|---|
| Price per 1,000 VINs | **$1.50** | $1.50–$3.00 (+ start fees on some) |
| Full vPIC decode | ✅ | ✅ |
| Recalls with park-it / OTA flags | ✅ | separate Actor |
| Complaint crash/fire/injury stats | ✅ | ❌ |
| NCAP star ratings | ✅ | rarely |
| Check-digit + clear error status | ✅ | partial |

Cap your spend with **Max VINs** or the run's maximum charge.

### Typical uses

- **Used-car dealers and marketplaces:** enrich inventory feeds with specs, open recalls and safety stars.
- **Fleet managers:** see which vehicles are affected by "park it" recalls or high complaint rates.
- **Insurers and lenders:** validate VINs on applications and flag high-complaint models.
- **Auctions and exporters:** clean bad VINs before listing.

### Input

| Field | Example | Notes |
|---|---|---|
| `vins` | `["1HGCM82633A004352"]` | List of VINs |
| `vinText` | paste a column | Any separator |
| `includeRecalls` | `true` | Recall campaigns |
| `includeRecallDetails` | `true` | Full recall text. Set to false for a compact table |
| `includeComplaints` | `true` | Complaint aggregates |
| `includeSafetyRatings` | `true` | NCAP stars |
| `maxVins` | `10000` | Safety cap |

### Output

Dataset views: **Vehicle overview**, **Recalls, complaints & ratings** and **VIN validation**, plus an all-fields CSV and a `RUN_SUMMARY` record. Example row (shortened):

```json
{"vin":"1HGCM82633A004352","decodeStatus":"clean","checkDigitValid":true,"modelYear":2003,"make":"HONDA","model":"Accord","trim":"EX-V6","engineCylinders":6,"engineHp":240,"plantCountry":"UNITED STATES (USA)","recallCount":24,"recallParkItCount":0,"complaintsCount":2013,"complaintsWithCrash":158,"topComplaintComponents":[{"component":"POWER TRAIN","count":926}],"ncapVehicleDescription":"2003 Honda Accord 2-DR. w/SAB","nhtsaRecallLookupUrl":"https://www.nhtsa.gov/recalls?vin=1HGCM82633A004352"}
```

Data: U.S. National Highway Traffic Safety Administration (public domain). Not affiliated with NHTSA. Built by Nonentity LLC.

# Actor input Schema

## `vins` (type: `array`):

17-character VINs. Duplicates and lowercase are cleaned automatically. Partial VINs are decoded as far as NHTSA allows.

## `vinText` (type: `string`):

Paste VINs separated by new lines, commas, spaces or semicolons (e.g. straight from a spreadsheet column).

## `includeRecalls` (type: `boolean`):

NHTSA recall campaigns for the decoded model year / make / model, incl. 'park it' and 'park outside' warnings and over-the-air remedies.

## `includeRecallDetails` (type: `boolean`):

Include summary, consequence and remedy text for each recall. Turn off for a compact one-row-per-VIN table.

## `includeComplaints` (type: `boolean`):

Count of owner complaints filed with NHTSA, how many involved a crash or fire, injuries, deaths, and the top 5 complained-about components. Aggregates only — no complainant data.

## `includeSafetyRatings` (type: `boolean`):

NHTSA 5-Star overall, frontal, side and rollover ratings, rollover risk % and investigation count (best-matching variant).

## `maxVins` (type: `integer`):

Safety cap on unique VINs processed per run.

## Actor input object example

```json
{
  "vins": [
    "1HGCM82633A004352",
    "5YJ3E1EA2KF317000",
    "1FTFW1ET9DFC10312"
  ],
  "includeRecalls": true,
  "includeRecallDetails": true,
  "includeComplaints": true,
  "includeSafetyRatings": true,
  "maxVins": 10000
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `safety` (type: `string`):

No description

## `validation` (type: `string`):

No description

## `all` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "vins": [
        "1HGCM82633A004352",
        "5YJ3E1EA2KF317000",
        "1FTFW1ET9DFC10312"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("knobby_woodworker_aig/nhtsa-vin-decoder-recalls").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "vins": [
        "1HGCM82633A004352",
        "5YJ3E1EA2KF317000",
        "1FTFW1ET9DFC10312",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("knobby_woodworker_aig/nhtsa-vin-decoder-recalls").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "vins": [
    "1HGCM82633A004352",
    "5YJ3E1EA2KF317000",
    "1FTFW1ET9DFC10312"
  ]
}' |
apify call knobby_woodworker_aig/nhtsa-vin-decoder-recalls --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,knobby_woodworker_aig/nhtsa-vin-decoder-recalls"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2Oe6dIr50OAEQt0tl/builds/A1u04X4HN2rqBXeGr/openapi.json
