Skip to content

About

Accessing AutoSoftToday Recall Data via API

How to access automotive software recall statistics programmatically through the /api/recalls.json endpoint

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 byYear when you need the existing yearly totals series.
  • Use topByImpact when you want a single full-history concentration summary for recalls affecting 500000+ vehicles.
  • Use largest.url to 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 byYear changes.

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.

Envorso