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
| Agency | Covers | Machine-readable source | Agency records start |
|---|---|---|---|
| CPSC | Consumer products | SaferProducts.gov recall API | 1973 |
| FDA | Food, drugs and medical devices (enforcement reports) | openFDA food, drug and device enforcement endpoints | June 2012 |
| USDA FSIS | Meat, poultry and egg products | FSIS recall API | Coming soon: the FSIS API refuses server requests for now, and we have asked FSIS for access |
| NHTSA | Vehicles, equipment, tires and child seats | Recalls Data on datahub.transportation.gov, affected vehicles from api.nhtsa.gov/recalls/campaignNumber, live lookups from api.nhtsa.gov/recalls/recallsByVehicle, VIN decoding from vPIC | 1966 |
"Agency records start" is the earliest record each agency's machine-readable source returned when checked on 2026-10-05.
Update cadence
- The pipeline runs once a day (09:17 UTC) and asks each source for records from its last successful run onward, with a 14-day overlap: by publish or change date for CPSC and FSIS, by report date for FDA and NHTSA.
- A record whose content has not changed is left alone. A changed record is rewritten, its identifiers are re-extracted and its
as_ofmoves to the time of the run. - Agencies publish on their own schedules.
expected_cadence_daysin/v1/healthis how often we expect new records from each source: 7 days for CPSC and NHTSA, 14 for each FDA feed, 21 for FSIS. - An FDA recall appears when FDA publishes it in an enforcement report, which can be weeks after the firm starts the recall. For example,
fda-H-1339-2026started on 2026-08-22 and was in the report dated 2026-09-23.
Dates and links per agency
| Agency | recall_date | report_date | url |
|---|---|---|---|
| CPSC | Recall date | Last publish date | The recall page on cpsc.gov |
| FDA | Recall initiation date | Enforcement report date | The openFDA record for that recall number (enforcement reports have no stable page per recall) |
| USDA FSIS | Recall date | Last modified date | The recall page on fsis.usda.gov |
| NHTSA | Report received date | Report received date | The 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
| Kind | Normalized value | Where it comes from |
|---|---|---|
gtin | GTIN-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_cd | GTIN-14 with its check digit corrected | A printed barcode whose check digit does not validate (kept next to the printed gtin) |
ndc, ndc9 | 11-digit package code; 9-digit labeler and product code | openFDA package and product NDC fields; text after NDC |
model | Uppercase letters and digits | CPSC product model fields; text after model, item, style, part, REF, catalog, SKU or article; NHTSA seat and equipment models |
lot | Uppercase letters and digits | Text after lot |
establishment | USDA establishment number without the EST prefix | FSIS establishment field; text after EST. or establishment number |
mmy, mm | MAKE|MODEL|YEAR, MAKE|MODEL | NHTSA affected vehicles per campaign |
campaign, mfr_campaign | NHTSA and manufacturer campaign numbers | NHTSA campaign records |
tire_size | Tire 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.
| Level | When |
|---|---|
| exact | A GTIN (from your UPC, EAN or GTIN) or an 11-digit NDC package code appears in the recall's identifiers. |
| strong | A 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. |
| possible | A 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
}
]
}
| Field | Meaning |
|---|---|
status | ok, stale, or coming_soon for a source announced but not loaded yet (today USDA FSIS). |
records | Records held for this source. |
last_success, last_attempt | Last successful fetch, last attempt. |
last_error, consecutive_failures | Why the last attempt failed, and how many failed in a row. |
newest_record | The newest recall_date held for this source. |
upstream_updated | The source's own last-updated date, where it publishes one (openFDA). |
expected_cadence_days | How often we expect new records from this source. |
Known gaps
- USDA FSIS records are not loaded yet. The FSIS API refuses server requests for now. We have asked FSIS for access; the daily pipeline keeps trying and loads FSIS by itself once it is allowed.
- USDA FSIS records have no barcodes and few identifiers. Meat, poultry and egg recalls name products and sometimes establishment numbers and lot codes, so matches against them rely on brand and name and are often
possible. Some FSIS records carry no identifier at all (for examplefsis-025-2026). - NHTSA campaigns are per make, model and year. Whether a specific VIN is affected, and whether it has been repaired, is confirmed at nhtsa.gov/recalls.
- Identifiers in free text are found by pattern. A code is found when it follows a keyword (UPC, NDC, model, lot and so on). Tables flattened into text are read when a header names a model or item column next to a UPC column (for example
cpsc-24116). Codes printed only in images and unusual layouts can still be missed. - FDA timing. FDA recalls arrive with FDA's enforcement reports, after the recall is classified, not on the day the firm announces it.
- Later edits to older records. FDA and NHTSA records are fetched by report date, so besides the daily window each run also re-reads one older year, cycling through the history. A change the agency makes to an older record (for example an FDA status moving to terminated) is picked up within about 3 weeks for FDA and 2 months for NHTSA. Tell us if you see a record that differs from the agency's current version.
- Scope. Only the four agencies above. Recalls announced only by other federal agencies, by states or outside the US are not included.
- No match is not a clearance. A recall is matched only when the identifiers or names you send appear in the government record.
Found an error in how we normalized or matched a record? See disputes and corrections.