# Bulk VIN Recall Check & VIN Decoder (NHTSA) (`forged_mussel/vin-recall-check`) Actor

Bulk VIN recall check: paste up to 500 VINs and get one row per VIN with NHTSA safety recalls on file (Park It flags), complaint counts and year/make/model/trim/engine VIN decode. For used-car dealers and fleets. No key. $0.003/VIN.

- **URL**: https://apify.com/forged_mussel/vin-recall-check.md
- **Developed by:** [Dan Ferden](https://apify.com/forged_mussel) (community)
- **Categories:** AI, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 vin results

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

## Bulk VIN Recall Check & VIN Decoder (NHTSA recalls and complaints)

**Check VINs for open safety recalls in bulk.** Paste up to **500 VINs** and get **one row per VIN**: year, make, model, trim and engine specs from the NHTSA vPIC VIN decoder, the NHTSA vehicle safety recalls on file for that vehicle's year/make/model (with **Park It / Park Outside** "do not drive" flags), and NHTSA owner complaint counts (crashes, fires, injuries). Data comes from official free US government APIs. You don't need an API key, a login or scraping.

### Built for

- **Used-car dealers:** run a whole auction run list or your lot through a VIN recall check before you buy, list or deliver. "Do Not Drive" flags show up first.
- **Fleet managers:** run your full fleet monthly and get one spreadsheet showing which units have recalls on file.
- Also useful for wholesalers, rental and rideshare fleets, repair shops, warranty and insurance companies, and car buyers checking a used car.

### What you can do

- **Bulk VIN recall lookup:** up to 500 VINs per run, dashes and spaces OK, duplicates removed.
- **Free VIN decode:** model year, make, model, trim, body, drive, engine, fuel/EV type, transmission, GVWR and plant.
- **Recall and complaint screening:** recall count, Park It / Park Outside flags, OTA-fix flags and complaint totals per VIN.
- **Scheduled fleet recall alerts:** run it on an Apify Schedule and send results to Sheets, Excel, Slack or a webhook.

### Input

`vins` (list of up to 500, any case, dashes and spaces OK, duplicates removed), `includeSpecs` (default on), `includeComplaints` (default on).

### Output (one row per VIN)

vin, status (ok / not_decoded / invalid), checkDigitValid, decodeNotes, modelYear, make, model, specs {trim, series, bodyClass, vehicleType, doors, driveType, engineCylinders, displacementL, engineHP, fuelTypePrimary, electrificationLevel, transmissionStyle, gvwr, plantCity, plantState, plantCountry, manufacturer}, recallCount, hasParkItRecall, hasParkOutsideRecall, recalls \[campaignNumber, date, component, summary, consequence, remedy, parkIt, parkOutside, overTheAirUpdate, nhtsaUrl], recallMatchType, nhtsaModelsMatched, complaintCount, complaintsCrash, complaintsFire, complaintInjuries, complaintDeaths, topComplaintComponents, recallCheckUrl, retrievedAt. Export as CSV or Excel, or use the API.

### Pricing

$0.003 per VIN plus a $0.005 run start fee. 100 VINs cost $0.305 and 500 VINs cost $1.505. Every VIN row is charged, including VINs marked invalid. Runs stop at your max-charge limit.

### Important: recalls on file, not repair status

Recalls are matched by **year/make/model**, the way NHTSA publishes them. NHTSA's free API doesn't say whether a recall has been **repaired** on a given VIN, and not every recall covers every VIN of a model. Treat each row as a list of recalls to check. Confirm a specific VIN at its `recallCheckUrl` (nhtsa.gov/recalls) or with the dealer before you rely on it. When NHTSA names the model differently from vPIC (e.g. Silverado vs SILVERADO 1500), the actor matches NHTSA's variant names and shows them in `nhtsaModelsMatched` (`recallMatchType: variant`). It never merges distinct models, such as Rogue with Rogue Sport or Prius with Prius C. Hybrid and EV variants are only merged for VINs that decode as electrified.

### FAQ

**How do I check a VIN for recalls?** Paste one or more VINs into `vins` and run. Each row lists the NHTSA recalls on file for that vehicle plus a direct nhtsa.gov check link.

**Can I check consumer product recalls too?** Yes. Use our **CPSC Recall Search** actor for US product safety recalls by product, brand or UPC: https://apify.com/forged_mussel/cpsc-recall-search

### Notes

Data belongs to US NHTSA (public domain). Not affiliated with NHTSA. This isn't legal advice.

# Actor input Schema

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

Up to 500 17-character VINs, one per line. Duplicates, spaces and dashes are removed. Invalid VINs still get a row marked 'invalid' (and are charged like any row).

## `includeSpecs` (type: `boolean`):

Add trim, body, engine, fuel, drive, transmission, GVWR and plant fields from vPIC.

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

Add NHTSA owner complaint counts (total, crash, fire, injuries, deaths, top components) for each vehicle's make/model/year.

## Actor input object example

```json
{
  "vins": [
    "1HGCM82633A004352"
  ],
  "includeSpecs": true,
  "includeComplaints": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per VIN.

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

Counts of decoded, invalid and recalled VINs.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("forged_mussel/vin-recall-check").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"] }

# Run the Actor and wait for it to finish
run = client.actor("forged_mussel/vin-recall-check").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"
  ]
}' |
apify call forged_mussel/vin-recall-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,forged_mussel/vin-recall-check"
        }
    }
}
```

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/XDdgmslXb5UhAjf4D/builds/NYUz2rWOeuy5PWfNf/openapi.json
