Lead generation
Bulk VIN Decoder & Recall Checker
Bulk-decode US VINs via NHTSA's free vPIC REST API into make, model, year, trim, engine and plant data, enriched with recall and crash-safety ratings. Local ISO-3779 check-digit validation catches a typo'd VIN before you get billed for NHTSA's own uncorrected decode.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
NHTSA's free vPIC service decodes any 17-character string you throw at it, valid or not, and hands back roughly 150 mostly-empty-string fields with no warning that the VIN itself was garbage. This Actor validates the ISO-3779 check digit locally first, for free, before any network call or billed event, then batch-decodes the survivors and normalizes NHTSA's noisy payload into a clean flat row — optionally joined with recall and crash-safety-rating data for the same make/model/year.
What we handle for you
- 🔍 Local check-digit validation, free — every VIN is validated against ISO-3779 before any network call, so a typo never costs you a billed row.
- 🧹 NHTSA's noisy payload, cleaned — every empty-string field NHTSA returns becomes a proper
null, not a string you have to filter yourself. - 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts,Retry-Afterhonoured. - 🫠 One bad batch never fails the run — a failed decode chunk or enrichment lookup is logged and skipped; the rest of your VINs still ship.
- 🧊 Clean, typed dataset rows — Pydantic-validated, stable fields, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for VINs that actually decode. Invalid or no-match VINs are free.
Use cases
- Bulk-normalize a dealer inventory feed's raw VINs into make/model/year/trim before listing.
- Screen an incoming used-car lead list against NHTSA recall data before appraisal.
- Back a fleet manager's maintenance system with structured engine/plant/spec data.
- Feed an insurer's underwriting model with decoded vehicle attributes plus crash-safety ratings.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
vins | array | yes | 17-character US Vehicle Identification Numbers to decode, 1-500 per run. Each one is validated locally (ISO-3779 check digit) before any NHTSA call — invalid VINs never touch the network and are never billed. |
include_recalls | boolean | no | Join NHTSA recall records for each decoded VIN's make/model/model-year. One lookup per unique combination, cached and reused across matching VINs — never per VIN. |
include_safety_ratings | boolean | no | Join NHTSA crash-safety ratings (overall, front, side, rollover) for each decoded VIN's make/model/model-year. Off by default — it's a two-step lookup per unique combination and slows the run. |
{
"vins": [
"1HGCM82633A004352",
"3VWD07AJ5EM388202",
"1G1ZT53826F109149"
],
"include_recalls": true,
"include_safety_ratings": false,
"proxyConfiguration": {
"useApifyProxy": false
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
vinis_validvalidation_errornhtsa_error_codenhtsa_error_textmakemodelmodel_yeartrimbody_classdrive_typeengine_cylindersengine_displacement_lengine_hpfuel_type_primarytransmission_style
{
"vin": "1HGCM82633A004352",
"is_valid": true,
"validation_error": null,
"nhtsa_error_code": "0",
"nhtsa_error_text": "VIN decoded clean. Check Digit (9th position) is correct",
"make": "HONDA",
"model": "Accord",
"model_year": "2003",
"trim": "EX",
"body_class": "Sedan/Saloon",
"drive_type": "FWD",
"series": null,
"engine_cylinders": "6",
"engine_displacement_l": "3.0",
"engine_hp": "240",
"fuel_type_primary": "Gasoline",
"transmission_style": "Automatic",
"plant_country": "UNITED STATES (USA)",
"plant_city": "MARYSVILLE",
"gvwr_class": null,
"doors": "4",
"airbag_front": "1st Row (Driver and Passenger)",
"airbag_side": null,
"recall_count": 3,
"recalls": [
{
"nhtsa_campaign_number": "04V123000",
"component": "AIR BAGS",
"summary": "..."
}
],
"safety_overall_rating": null,
"safety_frontcrash_rating": null,
"safety_sidecrash_rating": null,
"safety_rollover_rating": null,
"decoded_at": "2026-09-03T00:00:00Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| result-row | $0.0025 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Up to 500 VINs per run — chunked into batches of 50 per NHTSA's documented per-call ceiling.
- Non-US-market VINs vPIC can't resolve are returned best-effort, often mostly null — NHTSA covers the US market.
- Safety-rating enrichment resolves the first matching NHTSA VehicleId when a make/model/year has multiple trims or body styles — it isn't a per-VIN exact trim match.
- Recall and safety data reflect NHTSA's own records at request time; this Actor doesn't backfill or correct upstream gaps.
FAQ
Do I need an API key?
Why do some VINs come back with mostly null fields?
Do I get charged for an invalid VIN?
What's the difference between decode-only and enrichment?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors