NHTSA Vehicle Safety API - Recalls, Complaints & Crash Ratings
Pricing
from $3.00 / 1,000 recall records
NHTSA Vehicle Safety API - Recalls, Complaints & Crash Ratings
Look up NHTSA vehicle recalls, owner complaints, and 5-Star crash-test safety ratings by make/model/year via official NHTSA and vPIC APIs. No API key required.
Pricing
from $3.00 / 1,000 recall records
Rating
0.0
(0)
Developer
Moose & Raven
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
12 days ago
Last modified
Categories
Share
NHTSA Vehicle Safety API - Recalls, Complaints & Crash Ratings (JSON)
Who this is for: used-car marketplaces and dealer inventory tools vetting a listing, fleet managers checking a roster for open recalls, insurers and underwriters pricing risk, and consumer-facing pre-purchase tools - anyone who needs a vehicle's full recall, complaint, and crash-safety history before they list, buy, insure, or service it, without hand-checking three separate NHTSA web pages per vehicle.
Worked example: send {"vehicles":[{"make":"Honda","model":"Civic","modelYear":2018}]} as
the vehicles input and this actor returns, in one dataset: every open recall (e.g. NHTSA
campaign 20V314000 - fuel pump may fail while driving), a sample of owner complaint records
(with crash/fire/numberOfInjuries flags called out), and the car's official safety-rating
(overallRating: "5", overallFrontCrashRating: "4"). Before: three manual lookups against three
separate NHTSA tools per vehicle. After: one actor call, one consistent schema, on a schedule if
you want it re-checked automatically. See the real, live-fetched sample JSON in section 4 below.
Look up NHTSA vehicle recalls, owner complaints, and 5-Star crash-test safety ratings by make/model/year - backed entirely by the official NHTSA and vPIC APIs, no API key or account required, no scraping. Optional incremental monitor mode tracks new recalls and complaints across scheduled runs.
1. What makes this different
Bundles three separate NHTSA data sources nobody else bundles: recalls, owner complaints (ODI), and 5-Star crash-test safety ratings, by vehicle, in one actor with one consistent schema. Auto dealers, fleet managers, insurers, and used-car marketplaces typically care about all three signals together, not just recalls in isolation.
Zero account friction - both NHTSA's recall/complaint/rating APIs and the vPIC vehicle catalog work with no API key or account at all.
Cheaper than auto.dev's Open Recalls API, with no monthly minimum. auto.dev's own pricing page
lists recall data as a Scale-tier-only feature at "$599 / month + data fees," billed at "$0.06 /
Open Recalls API call" (auto.dev/pricing) - it pulls the same underlying NHTSA recall database
this actor does, just keyed by VIN instead of make/model/year. This actor's recall-record is
$0.003/record (see Pricing below) with zero monthly commitment. Note the different lookup key: if
you need VIN-specific recall lookups at scale, auto.dev's product fits that shape directly; this
actor is built for make/model/year queries plus the complaint and crash-rating data auto.dev's
recall product doesn't include.
2. How it works
- Supply
vehiclesas an array of{ make, model, modelYear }objects. - Every vehicle is independently confirmed to exist against NHTSA's own official vehicle
catalog (vPIC's
GetModelsForMakeYear) before checking recalls/complaints/ratings. This matters because NHTSA's recall/complaint/rating APIs themselves return an identical "Results returned successfully, Count: 0" response for both a typo'd make/model AND a real vehicle with a genuinely clean record (confirmed live) - the existence check resolves that ambiguity up front. - Toggle
includeRecalls,includeComplaints,includeRatingsindependently. - Optional incremental monitor mode: remembers which recalls/complaints have already been delivered per vehicle (by NHTSA's own stable IDs, in a persistent named key-value store) and only reports genuinely NEW ones on later runs. Safety ratings are re-delivered every run regardless of monitor mode - they rarely change once published and there's no natural "new rating" event to detect.
- A failed fetch is never silently treated as "nothing new." Each stage's failure (existence
check, recalls, complaints, or ratings) pushes an explicit
fetch-failed(orrate-limited) status record - one vehicle's or one stage's problem doesn't hide results from the rest. maxComplaintsPerVehicle(default 500) is this actor's OWN cap, not NHTSA's - the real API returns every complaint in one response with no pagination (confirmed live even for a 3,600+-complaint vehicle). If a vehicle's real total exceeds the cap, an explicitcomplaints-truncatedrecord surfaces the true total.monitor-runis billed whenever the run wasn't silently/ambiguously incomplete - a disclosedcomplaints-truncatedresult still bills normally (a known, surfaced cap, not a blind spot); only a genuine fetch failure or rate-limit hit skips billing.
3. Input
| Field | Type | Notes |
|---|---|---|
vehicles | array (required) | { make, model, modelYear } objects - every entry independently confirmed against vPIC before use |
includeRecalls | boolean | Default true |
includeComplaints | boolean | Default true |
includeRatings | boolean | Default true |
monitorMode | boolean | Persistent incremental "new since last run" tracking for recalls/complaints |
maxComplaintsPerVehicle | integer | This actor's own cap (NHTSA has no pagination), default 500 |
See the Input tab for the full form with inline descriptions.
4. Output fields
Each dataset item has a recordType of "recall", "complaint", "safety-rating",
"vehicle-not-found", "fetch-failed", "rate-limited", or "complaints-truncated".
recall
| Field | Type | Notes |
|---|---|---|
vehicle | string | "{modelYear} {make} {model}", e.g. "2018 Honda Civic" |
recordId | string | null | NHTSA's own NHTSACampaignNumber |
manufacturer, component, summary, consequence, remedy | string | null | NHTSA's own free-text fields, unedited |
reportReceivedDate | string | null | DD/MM/YYYY, exactly as NHTSA returns it |
parkIt, parkOutside | boolean | null | NHTSA's own "do not drive" / "park outside due to fire risk" flags - rare, but load-bearing when present |
fetchedAt | string (ISO datetime) | When this actor fetched the record |
sourceApi | string | Always "api.nhtsa.gov/recalls" |
complaint
| Field | Type | Notes |
|---|---|---|
vehicle | string | Same shape as above |
recordId | string | null | NHTSA's own odiNumber |
manufacturer | string | null | |
crash, fire | boolean | null | |
numberOfInjuries, numberOfDeaths | number | null | |
dateOfIncident, dateComplaintFiled | string | null | MM/DD/YYYY |
components | string | null | Comma-separated NHTSA component tags, e.g. "STEERING,ELECTRICAL SYSTEM" |
summary | string | null | The owner's own free-text complaint narrative, unedited |
fetchedAt, sourceApi | Same shape as above; sourceApi is "api.nhtsa.gov/complaints" |
safety-rating
| Field | Type | Notes |
|---|---|---|
vehicle | string | Same shape as above |
vehicleId | number | null | NHTSA's internal rating-database ID for this specific configuration |
vehicleDescription | string | null | The exact tested configuration, e.g. "2018 Honda Civic 2 DR FWD" - a make/model/year can have multiple rated body styles/drivetrains, each its own record |
overallRating, overallFrontCrashRating, overallSideCrashRating, rolloverRating | string | null | NHTSA's 1-5 star scale, as strings (NHTSA's own API type) |
rolloverPossibility | number | null | A probability (0-1), not a star rating |
electronicStabilityControl, forwardCollisionWarning, laneDepartureWarning | string | null | "Standard" / "Optional" / "Not Available" (NHTSA's own vocabulary) |
officialRecallsCount, officialComplaintsCount, officialInvestigationCount | number | null | NHTSA's own counts from the ratings dataset, not this actor's recall/complaint records - a useful cross-check, but can legitimately differ slightly by fetch timing; not auto-reconciled |
fetchedAt, sourceApi | sourceApi is "api.nhtsa.gov/SafetyRatings" |
Status records (vehicle-not-found, fetch-failed, rate-limited, complaints-truncated)
each carry vehicle and message (plus stage for fetch-failed/rate-limited, totalMatches/
delivered for complaints-truncated) - read the message, it explains exactly what happened and
what it means for that vehicle's completeness this run.
Real sample output
Live-fetched for a 2018 Honda Civic (input:
{"vehicles":[{"make":"Honda","model":"Civic", "modelYear":2018}],"maxComplaintsPerVehicle":5}{"recordType": "recall","vehicle": "2018 Honda Civic","recordId": "20V314000","manufacturer": "Honda (American Honda Motor Co.)","component": "FUEL SYSTEM, GASOLINE:DELIVERY:FUEL PUMP","summary": "Honda (American Honda Motor Co.) is recalling certain 2018-2019 Acura NSX, 2019 Acura RDX, RLX and RLX Sport Hybrid, 2018-2019 Honda Accord, Civic Hatchback, Civic Type R and HR-V, 2019-2020 Insight and 2019 Fit vehicles. The low-pressure fuel pump inside the fuel tank may fail.","consequence": "If the fuel pump fails, the engine can stall while driving, increasing the risk of a crash.","remedy": "Honda will notify owners and dealers will replace the fuel pump assembly, free of charge. The recall began July 22, 2020. Owners may contact Honda customer service at 1-888-234-2138.","reportReceivedDate": "28/05/2020","parkIt": false,"parkOutside": false,"fetchedAt": "2026-07-18T00:54:21.635Z","sourceApi": "api.nhtsa.gov/recalls"}
{"recordType": "complaint","vehicle": "2018 Honda Civic","recordId": "11678465","manufacturer": "Honda (American Honda Motor Co.)","crash": false,"fire": false,"numberOfInjuries": 0,"numberOfDeaths": 0,"dateOfIncident": "07/28/2025","dateComplaintFiled": "08/05/2025","components": "STEERING,ELECTRICAL SYSTEM","summary": "The electric power steering (EPS) system failed/malfunctioned this past week. When going over 35 mph my steering wheel would become \"knotchy/jerky\" and lock up and be difficult to turn. As a result, I took it to Honda to which they stated my whole rack and pinion needed total replacement. No warning signs, messages, icons, or lights came on in my car.","fetchedAt": "2026-07-18T00:54:22.302Z","sourceApi": "api.nhtsa.gov/complaints"}
{"recordType": "safety-rating","vehicle": "2018 Honda Civic","vehicleId": 12638,"vehicleDescription": "2018 Honda Civic 2 DR FWD","overallRating": "5","overallFrontCrashRating": "4","overallSideCrashRating": "5","rolloverRating": "5","rolloverPossibility": 0.093,"electronicStabilityControl": "Standard","forwardCollisionWarning": "Optional","laneDepartureWarning": "Optional","officialRecallsCount": 4,"officialComplaintsCount": 601,"officialInvestigationCount": 0,"fetchedAt": "2026-07-18T00:54:22.827Z","sourceApi": "api.nhtsa.gov/SafetyRatings"}
Note this one vehicle already surfaced a complaints-truncated record too (601 official
complaints on file per the rating dataset, capped to 5 delivered by this run's own
maxComplaintsPerVehicle: 5) - the honest, expected shape when a cap binds, not a bug.
5. Use cases
- Used-car marketplaces & dealer inventory tools - surface recall/complaint/safety-rating data on a listing page without three separate integrations against three separate NHTSA endpoints.
- Fleet management - bulk-check an entire fleet's make/model/year list for open recalls on a schedule, catching a new campaign the day it's filed rather than at next service.
- Insurance & underwriting - factor a vehicle's real crash-test ratings and complaint volume (crash/fire/injury/death flags) into risk pricing.
- Auto-industry research & journalism - pull a manufacturer's or model's full recall and complaint history, with NHTSA's own component tagging, for trend analysis.
- Consumer-facing pre-purchase tools - check a specific used vehicle's recall/complaint/ rating record before buying (subject to the ToS note below on redistribution).
6. Setting up recall/complaint alerts (Apify Schedules + your own notification channel)
This actor produces structured data; wiring that into an email/Slack/Teams alert is done with Apify's own platform features, not actor-specific code:
- Create an Apify Schedule pointing at this actor, with
monitorMode: trueand yourvehicleslist set. Daily or weekly is typical for fleet/inventory monitoring. - Attach a Webhook to the schedule/actor for the
ACTOR.RUN.SUCCEEDEDevent. Apify's webhook payload includes the run's dataset ID, so your webhook target can fetch the new items. - Route the webhook to Slack/Teams via their native "incoming webhook" URL, or to email via
a lightweight relay (e.g. a Zapier/Make webhook-to-email step) - since
monitorModeonly delivers genuinely new recalls/complaints, every triggered notification represents real new information, not a repeat. - Because the dataset always distinguishes
recall/complaintrecords fromvehicle-not-found/fetch-failed/rate-limited/complaints-truncatedstatus records, your alert logic can (and should) treat the latter as "monitoring degraded this run" rather than silently trusting an empty result.
7. Understanding the safety-rating fields
overallRating/overallFrontCrashRating/overallSideCrashRating/rolloverRatingare NHTSA's own 1-5 star scale (5 = best), each independently tested - a vehicle can score differently across the four.rolloverPossibilityis a probability (e.g.0.093= 9.3% estimated rollover risk in a single-vehicle crash), not a star count - don't confuse it withrolloverRating.- A make/model/year can have multiple
safety-ratingrecords - NHTSA tests by specific body style/drivetrain configuration (e.g."2 DR FWD"vs."4 DR AWD"), not one rating per model-year. UsevehicleDescriptionto tell them apart. - Not every vehicle has a rating on file - NHTSA doesn't crash-test every trim/configuration
ever sold. A confirmed-real vehicle with zero
safety-ratingrecords is a normal, legitimate result, not an error.
8. Pricing
Pay per event (current live pricing - confirmed via the Apify API at time of writing):
recall-record- $0.003 per recall deliveredcomplaint-record- $0.003 per complaint deliveredsafety-rating-record- $0.006 per safety-rating deliveredmonitor-run- $0.05 per scheduled monitor-mode run, in addition to per-record charges
monitor-run is billed whenever the run wasn't silently/ambiguously incomplete - a disclosed
complaints-truncated result still bills normally (a known, surfaced cap, not a blind spot); only
a genuine fetch failure or rate-limit hit skips billing.
See the actor's Pricing tab for the authoritative, current numbers.
9. Use from Claude, Cursor, and other AI agents (MCP)
This actor can be called as a tool by any MCP-compatible AI client (Claude Desktop, Cursor, VS Code, etc.) via Apify's hosted MCP server, without any actor-specific integration code:
- Point your MCP client at
https://mcp.apify.com, authenticated with your Apify API token (as a bearer header or via OAuth - see Apify's MCP docs for client-specific config). - Expose this actor specifically with the
toolsquery parameter:https://mcp.apify.com?tools=mooseandraven/nhtsa-vehicle-safety-monitor - Your agent can then call it directly - e.g. "check the 2018 Honda Civic for open recalls and
its crash-test rating" maps naturally onto
vehicles,includeRecalls,includeRatings. The actor's own input schema (this page's Input tab) is what the MCP tool schema is built from, so any filter documented here is available to the agent.
10. FAQ
How fresh is the data? This actor queries NHTSA's live APIs at run time - results are as current as NHTSA's own systems, not cached or delayed further by this actor.
Do I need an NHTSA or vPIC API key? No - both are keyless, no account required, confirmed live.
Why did I get a vehicle-not-found record instead of recalls/complaints/ratings? The
make/model/modelYear combination didn't resolve against vPIC's own vehicle catalog - either a
typo, or a genuinely nonexistent combination (e.g. a model that didn't exist in that year). This
actor checks existence FIRST specifically so a typo isn't silently indistinguishable from a real
vehicle's clean record (see How it works above).
What's the pricing/subscription model? Pay-per-event, not a flat subscription - you're charged per record actually delivered plus a per-monitor-run fee, so cost scales with how much genuinely new data the actor finds. See Pricing above.
Why do I sometimes get a complaints-truncated record instead of just complaints? This actor
deliberately surfaces its own limits instead of hiding them - see Output fields and How it works
above. maxComplaintsPerVehicle is THIS actor's own cap (NHTSA itself has no pagination); a
capped pull is never silently reported as complete.
11. What it does NOT do / Limitations
- Not every vehicle has all three data types. A confirmed-real vehicle with zero recalls, zero complaints, or no safety rating on file is a normal, legitimate result - not every trim/configuration was crash-tested by NHTSA, and a clean safety/complaint record is a real, good outcome, not an error. No status record is emitted just to say "nothing here" once existence has already been confirmed.
- Safety ratings cover crash-tested configurations only - a make/model/year can have multiple
rated body styles/drivetrains (each its own
safety-ratingrecord) or none at all. - Recall/complaint text is NHTSA's own free-text fields, not independently verified or summarized by this actor.
- No fuzzy make/model matching -
vehiclesentries are matched against vPIC's own catalog names; a materially different phrasing of a make/model will not resolve. officialRecallsCount/officialComplaintsCounton asafety-ratingrecord come from NHTSA's own ratings dataset, not a live re-count of this actor's ownrecall/complaintoutput - the two can differ slightly by fetch timing, not reconciled automatically.
Local development
npm installnpm test # recorded-fixture unit tests, no network needednpx apify-cli run # local end-to-end run - works immediately, no key/account needed
Support
Built and maintained by Moose & Raven. Questions or issues: support@mooseandraven.com.