Recalls covers four endpoints that answer the same question from different starting points. Use Recalls by VIN when you have one vehicle's VIN. Use Recalls by YMM when you only know the year, make, and model. Use Recall Campaign when a document carries a manufacturer campaign code. Use Recalls Batch when you need to check thousands of VINs in one job. All four take your API key as the key query parameter.
| Endpoint | Request | You send | Use it when |
|---|---|---|---|
| Recalls by VIN | GET /v1/recalls | vin | You need the open recalls and remedy status for one vehicle |
| Recalls by YMM | GET /v1/recalls-ymm | year, make, model | You have no VIN, or need every campaign for a model line |
| Recall Campaign | GET /v1/recalls-campaigns | make, code | A repair order, owner letter, or condition report lists a manufacturer campaign code |
| Recalls Batch | POST /v1/recalls-batch/submit | Up to 10,000 VINs | You need to scan a fleet, a lot, or an auction run list |
For complete multi-endpoint sequences, see API Workflows and Real-Life Use Cases.
Who uses this API
Service departments, dealerships, fleet operators, warranty providers, auctions, OEM portals, listing sites, and dealer software vendors call these endpoints before delivery, service, sale, or coverage decisions. They check a single VIN, look up a model line without a VIN, resolve the campaign codes printed on repair orders and owner letters, or scan thousands of VINs in one batch.
Use cases
B2B
- Dealerships — pre-delivery inspection: Flag open recalls and available remedies before a vehicle leaves the lot (Recalls by VIN).
- Service — bay alerts and repair order intake: Look up campaigns, affected components, and fix instructions when a VIN is checked in (Recalls by VIN). Resolve the campaign codes on an incoming repair order before the vehicle reaches the bay (Recall Campaign).
- Fleets — compliance and nightly scans: Submit up to 10,000 VINs and retrieve open-recall status when the batch completes (Recalls Batch). Show open campaigns for a year, make, and model when VINs are not yet assigned or captured (Recalls by YMM).
- Auctions and wholesale: Check a run list of VINs before a sale without issuing one request per vehicle (Recalls Batch). Turn the open-campaign codes on a condition report into readable recall descriptions for buyers (Recall Campaign).
- Dealer groups — lot-wide compliance: Poll or webhook a batch so every store’s inventory is checked on a schedule (Recalls Batch).
- Warranty and claims: Confirm open recalls across assigned vehicles before scheduling work or extending coverage (Recalls by VIN). Confirm a submitted campaign code exists for the make and see whether it is a safety recall or a service bulletin (Recall Campaign).
- Listings — catalog enrichment: Attach known recalls to a YMM listing before a specific VIN is entered (Recalls by YMM).
- OEM and service portals: Power a model-level recall lookup for technicians and support teams (Recalls by YMM).
- Dealer software — service history enrichment: Attach the NHTSA campaign number and description to historical service lines that only carry the manufacturer's code (Recall Campaign).
B2C
- Owner VIN recall checker: Let a vehicle owner paste a VIN and see whether any open safety recalls apply (Recalls by VIN).
- Consumer service apps: Show recall count and remedy status next to a saved vehicle (Recalls by VIN).
- Shop-by-model recall pages: Let a shopper check recalls for a year, make, and model before they have a VIN (Recalls by YMM).
- Vehicle buying research: Show campaign summaries on a comparison or buying-guide page, and let someone considering a used or new vehicle check known model-level recalls before requesting a VIN-specific check (Recalls by YMM).
- Owner letter explainers: Let a vehicle owner type the code from a recall letter and see what the campaign fixes and which models it covers (Recall Campaign).
- Used-vehicle research: Explain the campaign codes shown in a vehicle's service records on a buying-guide or listing page (Recall Campaign).
Recalls Batch has no B2C use cases. A consumer recall checker is a single-VIN lookup; use Recalls by VIN.
Recalls by VIN
Look up all open vehicle safety recalls for a vehicle by VIN. The response tells you how many recalls exist, whether a remedy is available, and the full detail of each campaign — component, risk, and fix instructions.
Parameters
| Parameter | Required | Description |
|---|---|---|
vin | Yes | The 17-character vehicle identification number |
key | Yes | Your CarsXE API key |
Example
Check for recalls
Response
Top-level shape
Click data or recalls to expand them and see sample values. For the full interactive reference, try it live in the API Reference.
data
All vehicle-level fields and the recall list are nested under data.
Vehicle identity — make, model, year decoded from the VIN
- Name
uuid- Type
- string
- Description
Unique identifier for this recall report record. Example:
"d1269d6b-54a2-4bf3-8119-1c8fdb4f0563".
- Name
vin- Type
- string
- Description
The VIN used to look up this record. Example:
"1C4JJXR64PW696340".
- Name
manufacturer- Type
- string
- Description
The legal manufacturer name as registered for recall reporting. May differ from the brand name consumers know. Example:
"FCA US LLC","TOYOTA MOTOR MFG DE BAJA CALIFORNIA S DE RL DE CV".
- Name
make- Type
- string
- Description
The vehicle brand. Example:
"JEEP","TOYOTA","FORD".
- Name
model- Type
- string
- Description
The model name. Example:
"Wrangler","Tacoma","F-150".
- Name
model_year- Type
- string
- Description
The 4-digit model year. Example:
"2023".
- Name
vehicle_type- Type
- string
- Description
Vehicle category when returned by the data source. Example:
"PASSENGER CAR","TRUCK".
Recall summary — whether recalls exist and how many
- Name
report_date- Type
- string
- Description
ISO 8601 date when this recall report was generated. Example:
"2024-09-27".
- Name
has_recalls- Type
- boolean
- Description
trueif at least one open recall was found for the VIN,falseotherwise. Check this field before iteratingrecalls.
- Name
recall_count- Type
- number
- Description
Total number of recalls in the
recallsarray. Example:1,3.
recalls[]
Each item in the recalls array represents one open recall campaign. All fields are optional — a null value means the data source did not provide that information for this campaign.
Identification — campaign ID, campaign type, and dates
- Name
nhtsa_id- Type
- string
- Description
The campaign identifier. Example:
"24V720". May be empty for voluntary service campaigns not filed as official safety campaigns.
- Name
manufacturer_id- Type
- string
- Description
The manufacturer's internal recall campaign number. Example:
"95B","25TC07-28342". To resolve a manufacturer code on its own, without a VIN, use Recall Campaign.
- Name
recall_campaign_type- Type
- string
- Description
The type of recall campaign. Example:
"NHTSA"for federally mandated campaigns,"VOLUNTARY/SERVICE"for manufacturer-initiated campaigns.
- Name
recall_name- Type
- string
- Description
A short descriptive name for the recall campaign as filed. Example:
"2020-2024 JL & 2022-2024 WL PHEV High Voltage Battery".
- Name
recall_date- Type
- string
- Description
ISO 8601 date the recall was issued. Example:
"2024-09-27".
- Name
expiration_date- Type
- string | null
- Description
ISO 8601 date the recall expires, if applicable.
nullif the recall has no set expiration.
Description — what component is affected and what the risk is
- Name
component- Type
- string
- Description
The vehicle component or system covered by the recall. Example:
"FUEL SYSTEM, GASOLINE","AIR BAGS". May be empty for some voluntary campaigns.
- Name
recall_description- Type
- string
- Description
Full description of the defect or condition being recalled. This is the official text from the recall filing.
- Name
risk_description- Type
- string
- Description
Description of the safety risk posed by the defect — what could go wrong and what the consequences are. May be empty for non-safety campaigns.
Remedy — fix availability, parts, labor, and urgency flags
- Name
remedy_available- Type
- boolean | null
- Description
trueif a fix is currently available at dealerships.nullmeans the data source has not confirmed remedy availability.
- Name
recall_remedy- Type
- string | null
- Description
Description of the repair or corrective action. Example:
"FCA US will conduct a voluntary safety recall. Remedy is a software flash followed by a HV battery replacement if needed.".
- Name
parts_available- Type
- boolean | null
- Description
trueif repair parts are in stock at dealerships.nullif unknown.
- Name
labor_hours_min- Type
- number | null
- Description
Minimum estimated labor hours for the repair.
nullif not provided.
- Name
labor_hours_max- Type
- number | null
- Description
Maximum estimated labor hours for the repair.
nullif not provided.
- Name
stop_sale- Type
- boolean | null
- Description
trueif dealers are prohibited from selling affected vehicles until the recall is remedied.nullif the data source did not specify.
- Name
dont_drive- Type
- boolean | null
- Description
trueif owners are advised not to drive the vehicle until repaired.nullif the data source did not specify.
- Name
recall_status- Type
- string
- Description
Current status of the recall campaign. Example:
"Incomplete"(remedy not yet performed),"INCOMPLETE","Complete".
- Name
not_available_reason- Type
- string | null
- Description
When a remedy is not yet available, the reason provided by the data source (for example parts not released or campaign still being prepared).
nullwhen unknown or not applicable.
Recalls by YMM
Retrieve open safety recalls for any vehicle by year, make, and model. No VIN required — ideal for checking an entire model line, powering fleet dashboards, or enriching vehicle listings when individual VINs aren't available.
Parameters
| Parameter | Required | Description |
|---|---|---|
year | Yes | The 4-digit model year (e.g. 2019) |
make | Yes | The vehicle manufacturer name (e.g. Toyota). Case-insensitive. |
model | Yes | The vehicle model name (e.g. Camry). Case-insensitive. |
key | Yes | Your CarsXE API key |
Example
Check recalls by YMM
Response
Top-level shape
Click data or recalls to expand them and see sample values. For the full interactive reference, try it live in the API Reference.
data
All YMM-level fields and the recall list are nested under data.
Vehicle identity — year, make, and model from the request
- Name
make- Type
- string
- Description
The vehicle manufacturer name, normalised to uppercase. Example:
"TOYOTA","FORD".
- Name
model- Type
- string
- Description
The vehicle model name, normalised to uppercase. Example:
"COROLLA","F-150".
- Name
model_year- Type
- string
- Description
The 4-digit model year. Example:
"2026".
Recall summary — whether recalls exist and how many
- Name
has_recalls- Type
- boolean
- Description
trueif at least one recall was found for this year, make, and model,falseotherwise. Check this field before iteratingrecalls.
- Name
recall_count- Type
- number
- Description
Total number of recalls in the
recallsarray. Example:1,3.
recalls[]
Each item in the recalls array represents one recall campaign. All fields are optional — a null value means the data source did not provide that information for this campaign.
Identification — campaign ID, manufacturer, and report date
- Name
nhtsa_campaign_number- Type
- string
- Description
The NHTSA campaign number uniquely identifying this recall. Example:
"26V110000","19V312000".
- Name
manufacturer- Type
- string
- Description
The full legal name of the manufacturer issuing the recall. Example:
"Toyota Motor Engineering & Manufacturing".
- Name
report_received_date- Type
- string
- Description
The date NHTSA received the recall report, in
MM/DD/YYYYformat. Example:"25/02/2026".
Description — what component is affected and what the risk is
- Name
component- Type
- string
- Description
The vehicle component or system affected by the recall. Example:
"EXTERIOR LIGHTING:HEADLIGHTS","ELECTRICAL SYSTEM".
- Name
summary- Type
- string
- Description
A detailed description of the defect or non-compliance that prompted the recall.
- Name
consequence- Type
- string
- Description
The safety risk to vehicle occupants or others if the defect is not corrected.
- Name
notes- Type
- string | null
- Description
Additional notes from the manufacturer or NHTSA, such as owner notification timelines.
nullif none.
Remedy — fix details and urgency flags
- Name
remedy- Type
- string
- Description
The corrective action the manufacturer will take, including whether it is free of charge.
- Name
park_it- Type
- boolean
- Description
trueif NHTSA advises parking the vehicle until the remedy is completed.
- Name
park_outside- Type
- boolean
- Description
trueif NHTSA advises parking the vehicle outside and away from structures until the remedy is completed.
- Name
over_the_air_update- Type
- boolean
- Description
trueif the remedy can be delivered via an over-the-air software update.
Recall Campaign
Manufacturers give every recall and service campaign their own code, such as Volkswagen 37M2, and that code is what shows up on repair orders, owner letters, and auction condition reports. The same recall also carries an NHTSA campaign number. This endpoint takes a make and a manufacturer code and returns the campaign behind it: the NHTSA campaign number, whether it is a safety recall or a service bulletin, the defect and remedy description, the affected component, and the models and model years it covers.
Each request is an exact match against the CarsXE campaign dictionary, which covers safety recalls and manufacturer service bulletins. It does not need a VIN.
Parameters
| Parameter | Required | Description |
|---|---|---|
make | Yes | The vehicle manufacturer name (e.g. volkswagen, land rover). Case and extra whitespace are ignored. Up to 120 characters. |
code | Yes | The manufacturer's campaign code (e.g. 37M2). Up to 64 characters. See How codes are matched. |
key | Yes | Your CarsXE API key |
A request that finds no campaign returns 404 and is not billed. A successful request is billed as one Vehicle Recalls call and counts toward the same plan quota.
Example
Look up a campaign code
How codes are matched
Matching is exact on the pair of make and code after both are normalized, so these requests all find the same campaign:
- Make is trimmed, repeated spaces are collapsed, and case is ignored.
Land Roverandland rovermatch. - Code is trimmed, upper-cased, and every letter
Ois read as the digit0.37o2,37O2, and3702match. - Volkswagen warranty codes match in any spelling.
VWP1403,VWP 14 03, andVWP-14-03all resolve toVWP-14-03.
input.code echoes the code you sent, trimmed. data.campaign_code is the code as the dictionary stores it.
A make and code that are not in the dictionary return 404. The endpoint never guesses a nearby code.
Response
Top-level shape
Click input or data to expand them and see sample values. For the full interactive reference, try it live in the API Reference.
data
Identification: the campaign, its NHTSA number, and its class
- Name
campaign_code- Type
- string
- Description
The manufacturer's campaign code as stored in the dictionary. Example:
"37M2","VWP-14-03".
- Name
nhtsa_campaign_number- Type
- string
- Description
The NHTSA campaign number, or several separated by
;when the manufacturer used one code for more than one recall. Example:"19V615000","01V015000;01V016000". Empty for a code known only from a service bulletin.
- Name
recall_class- Type
- string
- Description
"Safety / Compliance Recall"for a safety recall. For a service bulletin it is the bulletin type, such as a technical service bulletin or a customer satisfaction campaign. When a code appears in both, the safety recall wins.
Description: what the campaign fixes and what it applies to
- Name
description- Type
- string
- Description
For a safety recall, the defect and remedy text of the recall. For a bulletin, the bulletin summary.
- Name
component- Type
- string
- Description
The affected vehicle system. Example:
"ELECTRICAL SYSTEM:IGNITION:ANTI-THEFT:CONTROL MODULE". Empty for a code known only from a service bulletin.
- Name
models- Type
- string
- Description
Affected models, separated by
;. Example:"BEETLE;GOLF;GTI;JETTA".
- Name
model_years- Type
- string
- Description
Affected model years, separated by
;. Example:"2011;2012;2013".
Match details: how sure the match is and which build answered
- Name
confidence- Type
- string
- Description
"high"when the code is recorded as the campaign's own identifier."medium (prose reference)"when it was found only in the text of a bulletin summary; confirm those against the description before acting on them.
- Name
matched- Type
- boolean
- Description
Always
trueon a200. A miss returns404instead.
- Name
dictionary_version- Type
- number
- Description
The dictionary build that answered. It increases each time a new build is published.
Data freshness and coverage
CarsXE refreshes the campaign dictionary regularly and publishes each refresh as a new build. Watch dictionary_version if you cache results on your side.
The dictionary covers campaigns for vehicles sold in the United States. A code a manufacturer used only in another market will not be found.
A campaign covers a range of vehicles inside the listed models and years, not every vehicle built. To confirm whether a specific vehicle is affected and whether the remedy is still open, use the VIN recalls lookup. To see every campaign for a model line, use Recalls by YMM.
Recalls Batch
Submit up to 10,000 VINs in one request for bulk recall checking. Unlike Recalls by VIN, this endpoint is built for high-volume workflows — fleet management, dealership inventory scans, and wholesale auction processing.
Recalls Batch is asynchronous: submit your VINs, poll for status (or use a webhook), then retrieve results when the job is completed or partial. Uncached VINs are queued for full processing; turnaround is typically 30–60 minutes depending on batch size and load.
How it works
- Submit —
POSTVINs (JSON array, inline CSV, or HTTPS URL to a CSV). You receive abatchIdimmediately (202 Accepted). - Poll — Call the status endpoint with
batchIduntilcompleted,partial, orfailed(or wait for your customer webhook). - Retrieve —
GETresults as JSON, or download CSV from/v1/recalls-batch/download.
Caching: Recently checked VINs may be served from cache. If every VIN in the batch is cached, the submit response can already show status: "completed" with full processedVins — no uploading / processing phase.
Full processing path: Uncached VINs move through uploading, then processing, while CarsXE prepares and runs the batch; results are written when processing finishes.
For interactive try-it-live, see the API Reference.
Parameters
Provide at least one of vins, csv, or csvUrl. You can combine them — all VINs are merged and deduplicated. The combined total must not exceed 10,000.
| Parameter | Required | Description |
|---|---|---|
vins | No* | JSON array of 17-character VIN strings |
csv | No* | Inline CSV text (one VIN per line, or a single vin column) |
csvUrl | No* | HTTPS URL to a CSV file (max 5 MB). Supported hosts: Google Sheets, Google Cloud Storage, AWS S3, Dropbox, Azure Blob, DigitalOcean Spaces, and Box. Google Sheets and Dropbox sharing links are auto-converted to direct download |
webhookUrl | No | HTTPS URL for a customer webhook when the batch finishes |
key | Yes | Your CarsXE API key (query parameter; official SDKs may send x-api-key instead) |
* At least one of vins, csv, or csvUrl is required.
Step 1: Submit a batch
Submit a batch
Submit with a CSV URL
# Google Sheets sharing link (auto-converted to CSV export)
curl -X POST "https://api.carsxe.com/v1/recalls-batch/submit?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"csvUrl": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit"
}'Submit response fields
Successful submission returns HTTP 202 with:
- Name
success- Type
- boolean
- Description
truewhen the batch was accepted.
- Name
data.batchId- Type
- string
- Description
Unique identifier for your batch. Use this for status, results, and download.
- Name
data.status- Type
- string
- Description
uploading(batch being prepared),processing(recall check in progress), orcompletedif all VINs were satisfied from cache.
- Name
data.totalVins- Type
- number
- Description
Number of unique VINs in the batch (after deduplication).
- Name
data.processedVins- Type
- number
- Description
VINs already reflected in this response (e.g. cache hits); increases again when the batch completes.
- Name
data.hitCount- Type
- number
- Description
Count of VINs with at least one safety recall (aligned with
hasRecallson results).
- Name
data.hitRate- Type
- number
- Description
Percentage
(hitCount / processedVins) × 100when processing is done; may be0on the initial 202 until completion.
- Name
data.createdAt- Type
- string
- Description
ISO 8601 timestamp when the batch was created.
- Name
data.updatedAt- Type
- string
- Description
ISO 8601 timestamp of the last job update.
Step 2: Check status
Poll until the batch reaches a terminal state. Recommended interval: every 30–60 seconds while uploading or processing.
| Status | Description |
|---|---|
pending | Reserved for future use; batches from this API typically start as uploading or completed |
uploading | Batch accepted; CarsXE is preparing it for processing |
processing | Recall check in progress |
completed | All VINs processed; results are ready |
partial | Results available, but fewer VIN rows than totalVins (treat as complete for retrieval) |
failed | Processing failed; see errorMessage |
Check batch status
Status response fields
- Name
data.batchId- Type
- string
- Description
The batch identifier.
- Name
data.numericBatchId- Type
- number
- Description
Optional numeric correlation id assigned when results are finalized.
- Name
data.status- Type
- string
- Description
Current processing status (see table above).
- Name
data.totalVins- Type
- number
- Description
Total VINs submitted in this batch.
- Name
data.processedVins- Type
- number
- Description
Number of VINs with rows in the merged result set.
- Name
data.hitCount- Type
- number
- Description
VINs with at least one safety recall.
- Name
data.hitRate- Type
- number
- Description
Percentage of processed VINs with a safety recall hit (0–100, two decimal places).
- Name
data.completedAt- Type
- string
- Description
ISO 8601 timestamp when processing finished (omitted while in progress).
- Name
data.errorMessage- Type
- string
- Description
Error details if status is
failed.
Step 3: Retrieve results
Once status is completed or partial, fetch full recall rows as JSON or download CSV.
Get results (JSON)
Results shape
Each VIN has vin, hasRecalls (true if there is at least one safety recall), recallCount, and recalls — an array of sparse camelCase objects:
- Only non-empty string fields and booleans are included per recall.
- Dealer and batch metadata (
dealerName,dealerCode, batch name/date fields) are not exposed in JSON.
Common keys when present: recallNhtsaNumber, recallOemNumber, recallTitle, recallDescription, recallRiskDescription, recallRemedyDescription, recallType, recallState, recallStatus, recallIssueDate, severityCode, vehicleYear, vehicleMake, vehicleModel, isRemedied.
CSV download
GET /v1/recalls-batch/download with the same key and batchId. Returns text/csv with a Content-Disposition filename. SDKs also expose a download URL helper (getBulkRecallBatchDownloadUrl / get_bulk_recall_batch_download_url).
curl -G "https://api.carsxe.com/v1/recalls-batch/download" \
-d key=YOUR_API_KEY \
-d batchId=brb_mnablbn7_wvbaqv \
-o recalls_brb_mnablbn7_wvbaqv.csvAgentic payment access
x402 callers can submit a batch without a CarsXE API key by sending only the JSON vins array. The payment requirement quotes the current bulk_recall_batch starter price multiplied by the number of unique, valid VINs. Inline CSV and csvUrl submissions still require API-key authentication.
After payment, the 202 response includes data.batchToken. Store it securely and send it on every follow-up request; polling, JSON results, and CSV download are included in the original batch payment.
curl -G "https://api.carsxe.com/v1/recalls-batch/results" \
-d batchId=brb_mnablbn7_wvbaqv \
-H "X-CarsXE-Batch-Token: <batch-token>"The token is scoped to one batch, is not included in webhook payloads, and remains valid until the batch job is deleted.
Webhook notifications
If you pass webhookUrl on submit, CarsXE sends an HTTPS POST with Content-Type: application/json when the batch reaches a terminal state (completed or partial). Redirects are not followed. Respond quickly — the request times out on CarsXE’s side after about 30 seconds.
{
"event": "bulk_recall_batch_complete",
"batchId": "brb_mnablbn7_wvbaqv",
"status": "completed",
"totalVins": 100,
"processedVins": 100,
"hitCount": 25,
"hitRate": 25,
"downloadUrl": "https://api.carsxe.com/v1/recalls-batch/download?key=…&batchId=…",
"timestamp": "2026-03-24T10:16:43.000Z"
}The downloadUrl includes your API key in the query string so you can fetch the CSV without assembling the URL. Your API key is not repeated as a separate JSON field.
Complete example: submit, poll, and retrieve
Full workflow
Errors
See the Errors guide for general error handling guidance.
Recalls by VIN:
| Status | When it happens |
|---|---|
400 | Missing VIN, or VIN is not exactly 17 characters |
401 | Missing or invalid API key |
404 | No recall data found for this VIN |
429 | Usage limit exceeded |
500 | Internal server error |
Recalls by YMM:
| Status | When it happens |
|---|---|
400 | Missing or invalid year, make, or model |
401 | Missing or invalid API key |
404 | Feature not enabled on your plan |
429 | Usage limit exceeded |
500 | Internal server error |
Recall Campaign:
| Status | When it happens |
|---|---|
400 | make or code is missing, empty, or too long (Missing or invalid make or campaign code) |
401 | Missing or invalid API key |
404 | No campaign for this make and code (No campaign found for this make and campaign code). Not billed |
429 | Usage limit exceeded |
500 | Internal server error |
Recalls Batch:
| Status | When it happens |
|---|---|
400 | Missing VINs, too many VINs (>10,000), invalid VIN, invalid/disallowed/oversized csvUrl, or invalid webhookUrl |
401 | Missing or invalid API key, or inactive account |
404 | Batch not found or you don't have access |
405 | Submit called with a method other than POST |
409 | Batch still processing (results/download only) |
429 | Usage limit exceeded |
500 | Internal storage or batch handoff error — retry later |
502 | Server could not fetch the CSV from csvUrl |
Check open safety recalls by VIN or by year, make, and model, resolve manufacturer campaign codes, and scan thousands of VINs in one batch.