CarsXECarsXE

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.

EndpointRequestYou sendUse it when
Recalls by VINGET /v1/recallsvinYou need the open recalls and remedy status for one vehicle
Recalls by YMMGET /v1/recalls-ymmyear, make, modelYou have no VIN, or need every campaign for a model line
Recall CampaignGET /v1/recalls-campaignsmake, codeA repair order, owner letter, or condition report lists a manufacturer campaign code
Recalls BatchPOST /v1/recalls-batch/submitUp to 10,000 VINsYou 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

B2C

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

ParameterRequiredDescription
vinYesThe 17-character vehicle identification number
keyYesYour CarsXE API key

Example

Check for recalls

Code
curl -G https://api.carsxe.com/v1/recalls \
  -d key=YOUR_API_KEY \
  -d vin=1C4JJXR64PW696340

Response

Top-level shape

{
"success": true,// always true on 200
"timestamp": "2026-06-19T00:00:00.000Z",// ISO 8601 response time
}

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

    true if at least one open recall was found for the VIN, false otherwise. Check this field before iterating recalls.

  • Name
    recall_count
    Type
    number
    Description

    Total number of recalls in the recalls array. 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. null if 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

    true if a fix is currently available at dealerships. null means 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

    true if repair parts are in stock at dealerships. null if unknown.

  • Name
    labor_hours_min
    Type
    number | null
    Description

    Minimum estimated labor hours for the repair. null if not provided.

  • Name
    labor_hours_max
    Type
    number | null
    Description

    Maximum estimated labor hours for the repair. null if not provided.

  • Name
    stop_sale
    Type
    boolean | null
    Description

    true if dealers are prohibited from selling affected vehicles until the recall is remedied. null if the data source did not specify.

  • Name
    dont_drive
    Type
    boolean | null
    Description

    true if owners are advised not to drive the vehicle until repaired. null if 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). null when 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

ParameterRequiredDescription
yearYesThe 4-digit model year (e.g. 2019)
makeYesThe vehicle manufacturer name (e.g. Toyota). Case-insensitive.
modelYesThe vehicle model name (e.g. Camry). Case-insensitive.
keyYesYour CarsXE API key

Example

Check recalls by YMM

Code
curl -G https://api.carsxe.com/v1/recalls-ymm \
  -d key=YOUR_API_KEY \
  -d year=2026 \
  -d make=toyota \
  -d model=corolla

Response

Top-level shape

{
"success": true,// always true on 200
"timestamp": "2026-06-29T12:00:45.786Z",// ISO 8601 response time
}

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

    true if at least one recall was found for this year, make, and model, false otherwise. Check this field before iterating recalls.

  • Name
    recall_count
    Type
    number
    Description

    Total number of recalls in the recalls array. 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/YYYY format. 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. null if 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

    true if NHTSA advises parking the vehicle until the remedy is completed.

  • Name
    park_outside
    Type
    boolean
    Description

    true if NHTSA advises parking the vehicle outside and away from structures until the remedy is completed.

  • Name
    over_the_air_update
    Type
    boolean
    Description

    true if 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

ParameterRequiredDescription
makeYesThe vehicle manufacturer name (e.g. volkswagen, land rover). Case and extra whitespace are ignored. Up to 120 characters.
codeYesThe manufacturer's campaign code (e.g. 37M2). Up to 64 characters. See How codes are matched.
keyYesYour 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

Code
curl -G https://api.carsxe.com/v1/recalls-campaigns \
  -d key=YOUR_API_KEY \
  -d make=volkswagen \
  -d code=37M2

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:

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

{
"success": true,// always true on 200
"timestamp": "2026-09-25T12:29:09.352Z"// ISO 8601 response time
}

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 true on a 200. A miss returns 404 instead.

  • 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

  1. Submit — POST VINs (JSON array, inline CSV, or HTTPS URL to a CSV). You receive a batchId immediately (202 Accepted).
  2. Poll — Call the status endpoint with batchId until completed, partial, or failed (or wait for your customer webhook).
  3. Retrieve — GET results 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.

ParameterRequiredDescription
vinsNo*JSON array of 17-character VIN strings
csvNo*Inline CSV text (one VIN per line, or a single vin column)
csvUrlNo*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
webhookUrlNoHTTPS URL for a customer webhook when the batch finishes
keyYesYour 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

Code
curl -X POST "https://api.carsxe.com/v1/recalls-batch/submit?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vins": [
      "1HGBH41JXMN109186",
      "5YJSA1E26HF000001",
      "1C4JJXR64PW696340"
    ],
    "webhookUrl": "https://your-server.com/webhook"
  }'

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:

Step 2: Check status

Poll until the batch reaches a terminal state. Recommended interval: every 30–60 seconds while uploading or processing.

StatusDescription
pendingReserved for future use; batches from this API typically start as uploading or completed
uploadingBatch accepted; CarsXE is preparing it for processing
processingRecall check in progress
completedAll VINs processed; results are ready
partialResults available, but fewer VIN rows than totalVins (treat as complete for retrieval)
failedProcessing failed; see errorMessage

Check batch status

Code
curl -G "https://api.carsxe.com/v1/recalls-batch/status" \
  -d key=YOUR_API_KEY \
  -d batchId=brb_mnablbn7_wvbaqv

Status response fields

Step 3: Retrieve results

Once status is completed or partial, fetch full recall rows as JSON or download CSV.

Get results (JSON)

Code
curl -G "https://api.carsxe.com/v1/recalls-batch/results" \
  -d key=YOUR_API_KEY \
  -d batchId=brb_mnablbn7_wvbaqv

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:

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.csv

Agentic 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

Code
import { CarsXE } from "carsxe-api";

const carsxe = new CarsXE("YOUR_API_KEY");

const submitResponse = await carsxe.submitBulkRecallBatch({
  vins: [
    "1HGBH41JXMN109186",
    "5YJSA1E26HF000001",
    "1C4JJXR64PW696340",
  ],
});
const batchId = submitResponse.data?.batchId;
if (!batchId) throw new Error("No batchId");
console.log(`Batch submitted: ${batchId}`);

let status;
do {
  await new Promise((r) => setTimeout(r, 30_000));
  status = await carsxe.getBulkRecallBatchStatus(batchId);
  console.log(`Status: ${status.data?.status}`);
} while (
  status.data?.status === "processing" ||
  status.data?.status === "uploading"
);

if (status.data?.status === "completed" || status.data?.status === "partial") {
  const results = await carsxe.getBulkRecallBatchResults(batchId);
  console.log(`Processed: ${results.data?.job.processedVins} VINs`);
  console.log(`Safety recall hits: ${results.data?.job.hitCount}`);

  for (const result of results.data?.results ?? []) {
    if (result.hasRecalls) {
      console.log(`${result.vin}: ${result.recallCount} recall row(s)`);
    }
  }
}

Errors

See the Errors guide for general error handling guidance.

Recalls by VIN:

StatusWhen it happens
400Missing VIN, or VIN is not exactly 17 characters
401Missing or invalid API key
404No recall data found for this VIN
429Usage limit exceeded
500Internal server error

Recalls by YMM:

StatusWhen it happens
400Missing or invalid year, make, or model
401Missing or invalid API key
404Feature not enabled on your plan
429Usage limit exceeded
500Internal server error

Recall Campaign:

StatusWhen it happens
400make or code is missing, empty, or too long (Missing or invalid make or campaign code)
401Missing or invalid API key
404No campaign for this make and code (No campaign found for this make and campaign code). Not billed
429Usage limit exceeded
500Internal server error

Recalls Batch:

StatusWhen it happens
400Missing VINs, too many VINs (>10,000), invalid VIN, invalid/disallowed/oversized csvUrl, or invalid webhookUrl
401Missing or invalid API key, or inactive account
404Batch not found or you don't have access
405Submit called with a method other than POST
409Batch still processing (results/download only)
429Usage limit exceeded
500Internal storage or batch handoff error — retry later
502Server could not fetch the CSV from csvUrl