Data and sources

recallsapi.com republishes US government recall records with links back to each agency and the date we last saw each record change. This page says where the data comes from, how it is processed and where it falls short.

Sources

AgencyCoversMachine-readable sourceAgency records start
CPSCConsumer productsSaferProducts.gov recall API1973
FDAFood, drugs and medical devices (enforcement reports)openFDA food, drug and device enforcement endpointsJune 2012
USDA FSISMeat, poultry and egg productsFSIS recall APIComing soon: the FSIS API refuses server requests for now, and we have asked FSIS for access
NHTSAVehicles, equipment, tires and child seatsRecalls Data on datahub.transportation.gov, affected vehicles from api.nhtsa.gov/recalls/campaignNumber, live lookups from api.nhtsa.gov/recalls/recallsByVehicle, VIN decoding from vPIC1966

"Agency records start" is the earliest record each agency's machine-readable source returned when checked on 2026-10-05.

Update cadence

Dates and links per agency

Agencyrecall_datereport_dateurl
CPSCRecall dateLast publish dateThe recall page on cpsc.gov
FDARecall initiation dateEnforcement report dateThe openFDA record for that recall number (enforcement reports have no stable page per recall)
USDA FSISRecall dateLast modified dateThe recall page on fsis.usda.gov
NHTSAReport received dateReport received dateThe campaign on nhtsa.gov

source_url always points at the machine-readable record we read. as_of is when recallsapi.com last saw the record change, not the agency's own date.

Identifiers and how they are normalized

KindNormalized valueWhere it comes from
gtinGTIN-14 (UPC, EAN, GTIN, UDI device identifiers)CPSC UPC lists; openFDA UPC fields; text after UPC, EAN, GTIN, UDI or barcode, and GS1 (01) codes
gtin_cdGTIN-14 with its check digit correctedA printed barcode whose check digit does not validate (kept next to the printed gtin)
ndc, ndc911-digit package code; 9-digit labeler and product codeopenFDA package and product NDC fields; text after NDC
modelUppercase letters and digitsCPSC product model fields; text after model, item, style, part, REF, catalog, SKU or article; NHTSA seat and equipment models
lotUppercase letters and digitsText after lot
establishmentUSDA establishment number without the EST prefixFSIS establishment field; text after EST. or establishment number
mmy, mmMAKE|MODEL|YEAR, MAKE|MODELNHTSA affected vehicles per campaign
campaign, mfr_campaignNHTSA and manufacturer campaign numbersNHTSA campaign records
tire_sizeTire size or line as printed, uppercase letters and digits (LT23585R16E)NHTSA tire campaigns. Sizes are shared by every tire maker, so they are never matched as a product model.

When a printed barcode has a check digit that does not validate, both the printed (gtin) and the corrected (gtin_cd) GTIN are kept, because agency text sometimes carries typos. A product that matches only the corrected one is a strong match, with the reason saying the barcode was corrected. Every identifier keeps the raw text it came from (see /v1/recalls/{id}).

Confidence levels

Matching a product to a recall gives one of three levels. The same rules apply to /v1/check, catalog monitoring and the MCP tools.

LevelWhen
exactA GTIN (from your UPC, EAN or GTIN) or an 11-digit NDC package code appears in the recall's identifiers.
strongA 9-digit NDC product code (labeler and product) or an FSIS establishment number; a model number when your brand also appears in the recall, or when the model is distinctive (letters and digits, at least 5 characters); a lot code when your brand also appears in the recall.
possibleA short (under 5 characters) or all-digit model, or a lot code, without the brand; or no identifier hit, but your brand appears in the recall and either no name was given or at least half of your product name words appear too; or, with no brand given, at least 3 name words that cover at least 75% of your product name.

A match is information to review against the agency notice, not a safety, legal or compliance determination.

Freshness: /v1/health

GET https://api.recallsapi.com/v1/health needs no key. It answers 200 when every source is fresh and 503 when any source is stale: no successful fetch in 36 hours, or 3 failed runs in a row. A source marked coming_soon (announced, not loaded yet) does not count.

Response from a test run on sample data (2 of 6 sources shown; ok is false because FSIS was stale in that run)

{
  "ok": false,
  "checked_at": "2026-10-05T23:19:34.384Z",
  "sources": [
    {
      "source": "cpsc",
      "status": "ok",
      "records": 3,
      "last_success": "2026-10-05T23:19:34.333Z",
      "last_attempt": "2026-10-05T23:19:34.333Z",
      "last_error": null,
      "consecutive_failures": 0,
      "newest_record": "2026-10-01",
      "upstream_updated": null,
      "expected_cadence_days": 7
    },
    {
      "source": "fda_food",
      "status": "ok",
      "records": 4,
      "last_success": "2026-10-05T23:19:34.364Z",
      "last_attempt": "2026-10-05T23:19:34.364Z",
      "last_error": null,
      "consecutive_failures": 0,
      "newest_record": "2026-08-22",
      "upstream_updated": "2026-09-23",
      "expected_cadence_days": 14
    }
  ]
}
FieldMeaning
statusok, stale, or coming_soon for a source announced but not loaded yet (today USDA FSIS).
recordsRecords held for this source.
last_success, last_attemptLast successful fetch, last attempt.
last_error, consecutive_failuresWhy the last attempt failed, and how many failed in a row.
newest_recordThe newest recall_date held for this source.
upstream_updatedThe source's own last-updated date, where it publishes one (openFDA).
expected_cadence_daysHow often we expect new records from this source.

Known gaps

Found an error in how we normalized or matched a record? See disputes and corrections.