Accessing AutoSoftToday Recall Data via API
Last updated: August 25, 2026
Accessing Recall Data Programmatically
AutoSoftToday exposes its aggregated software recall statistics as a machine-readable JSON endpoint. The data is pre-built at deploy time, served as a static file, and is suitable for dashboards, research tools, or any application that needs up-to-date automotive software recall totals without scraping the site.
The response now includes optional full-history summary fields for high-impact recalls, including the largest software recall in the dataset and a navigable URL to that recall’s AutoSoftToday detail page when a content-collection slug is available.
Endpoint
GET https://autosofttoday.com/api/recalls.json
The endpoint is publicly accessible — no API key or authentication is required.
Response Format
{
"schema": "1",
"asOf": "2026-08-20",
"totals": {
"years": 61,
"recalls": 1546,
"vehicles": 113636862
},
"byYear": [
{ "year": 2022, "recalls": 173, "vehicles": 12000000 },
{ "year": 2023, "recalls": 185, "vehicles": 14000000 },
{ "year": 2024, "recalls": 170, "vehicles": 9200000 },
{ "year": 2025, "recalls": 200, "vehicles": 8000000 },
{ "year": 2026, "recalls": 97, "vehicles": 13563307, "partial": true }
],
"topByImpact": {
"threshold": 500000,
"count": 48,
"totalVehicles": 58526027,
"averageVehicles": 1219292
},
"largest": {
"nhtsaId": "18V332000",
"year": 2018,
"manufacturer": "Chrysler (FCA US, LLC)",
"component": "ELECTRICAL SYSTEM",
"vehicles": 4815661,
"url": "https://autosofttoday.com/recalls/2018-18v332000-cruise-control-cannot-be-cancelled"
}
}
Fields
| Field | Type | Description |
|---|---|---|
schema | string | Contract version. Currently "1". Increment signals a breaking change. |
asOf | string (YYYY-MM-DD) | Date of the most recently updated recall record in the dataset. |
totals.years | number | Total number of distinct years in the dataset (all-time). |
totals.recalls | number | All-time count of software recalls. |
totals.vehicles | number | All-time count of affected vehicles. |
byYear[].year | number | Calendar year. |
byYear[].recalls | number | Software recalls reported in that year. |
byYear[].vehicles | number | Vehicles affected in that year. |
byYear[].partial | boolean (optional) | Present and true only on the current calendar year, indicating the year is still in progress. |
topByImpact.threshold | number | Fixed threshold used to define a high-impact recall. Currently 500000. |
topByImpact.count | number | Number of software recalls at or above the threshold across the full historical dataset. |
topByImpact.totalVehicles | number | Combined affected vehicles across those high-impact recalls. |
topByImpact.averageVehicles | number | Average affected vehicles per high-impact recall, rounded to the nearest integer. |
largest.nhtsaId | string | NHTSA campaign ID for the single largest software recall in the dataset. |
largest.year | number | Report-received year for that recall. |
largest.manufacturer | string | Normalized manufacturer name for the largest recall. |
largest.component | string | Component or subject text associated with the largest recall. |
largest.vehicles | number | Affected vehicle count for the largest recall. |
largest.url | string (optional) | Absolute URL to the AutoSoftToday recall detail page when a matching content slug exists. |
byYear is sorted in ascending year order. topByImpact and largest are optional additive fields, so consumers should tolerate them being absent on older builds.
CORS and Caching
The response is served with:
Access-Control-Allow-Origin: *— suitable for in-browser fetch from any origin.Cache-Control: public, max-age=3600— responses are cached for up to one hour by browsers and CDNs.
Because the file is regenerated on each site deploy, the maximum data age in practice is driven by our deployment cadence rather than the cache TTL.
Example: Fetch in the Browser
const response = await fetch('https://autosofttoday.com/api/recalls.json');
const data = await response.json();
console.log(`As of ${data.asOf}:`);
console.log(` ${data.totals.recalls} recalls across ${data.totals.years} years`);
console.log(` ${(data.totals.vehicles / 1_000_000).toFixed(1)}M vehicles affected`);
const currentYear = data.byYear.find(r => r.partial);
if (currentYear) {
console.log(` ${currentYear.year} (in progress): ${currentYear.recalls} recalls so far`);
}
if (data.largest?.url) {
console.log(`Largest recall page: ${data.largest.url}`);
}
Example: Fetch with curl
curl -s https://autosofttoday.com/api/recalls.json | python3 -m json.tool
Common Usage Patterns
- Use
byYearwhen you need the existing yearly totals series. - Use
topByImpactwhen you want a single full-history concentration summary for recalls affecting500000+vehicles. - Use
largest.urlto deep-link users directly into the recall detail page on AutoSoftToday instead of sending them to a separate lookup flow.
Data Sources and Methodology
The underlying data comes from the NHTSA recall database. Recalls are classified as software-related when the description or corrective action references software, firmware, or an over-the-air update. For full details see our Data Sources & Methodology page.
Versioning Policy
The schema field allows consumers to detect breaking changes. We will increment schema if any of the following occur:
- A field is removed or renamed.
- A field’s type changes in an incompatible way.
- The sort order of
byYearchanges.
Additive changes (new optional fields) will not increment schema.
Questions or Issues
If you encounter unexpected data or would like to report an error, contact us at data@autosofttoday.com.
