Submit up to 10,000 VINs in one request for bulk recall checking. Unlike the single-VIN Recalls API, 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.csvWebhook 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
| 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 |
See the Errors guide for general error handling guidance.
Check thousands of vehicles for safety recalls in a single batch by submitting VINs and polling for results.