Ask “what got recalled this month?” and there is no one place to look. The United States splits product-safety recalls across four agencies by what the product is: a car, a crib, a cantaloupe, and a chicken breast are pulled from the market by four different regulators, each with its own feed, schema, and hazard vocabulary. The result is a real blind spot — a firm can be recalling products under two agencies at once and no single database shows it. This is how to weave the four feeds into one web.
Who recalls what
- NHTSA — vehicles and vehicle equipment (and, via recall completion, how many actually got fixed).
- CPSC — consumer products: toys, appliances, furniture, electronics, anything around the home.
- FDA — food, drugs, cosmetics, and medical devices, via the openFDA enforcement endpoints.
- USDA-FSIS — meat, poultry, and processed-egg products, which sit outside the FDA's food jurisdiction.
The join: firm name and date, nothing else
There is no cross-agency product code or firm identifier. The only practical join is the recalling firm's name plus the recall date — which means, once again, that entity resolution does the heavy lifting. A parent company recalling a drug through the FDA and a humidifier through the CPSC appears under two unlinked names unless you resolve them. Get that right and a firm's full recall history across product lines comes into view; skip it and each agency's feed stays its own island.
# Four agencies, four recall feeds, no shared key. Join on firm name + date.
import requests
# 1. NHTSA — vehicles & vehicle equipment (recalls API).
nhtsa = requests.get(
"https://api.nhtsa.gov/recalls/recallsByVehicle",
params={"make": "honda", "model": "accord", "modelYear": "2024"}, timeout=30)
# 2. CPSC — consumer products (toys, appliances, furniture). Recalls REST API.
cpsc = requests.get("https://www.saferproducts.gov/RestWebServices/Recall",
params={"format": "json", "RecallDateStart": "2026-01-01"}, timeout=30)
# 3. FDA — food, drugs, devices, cosmetics (openFDA enforcement endpoints).
fda = requests.get("https://api.fda.gov/food/enforcement.json",
params={"search": "report_date:[20260101 TO 20261231]", "limit": 5}, timeout=30)
# 4. USDA-FSIS — meat, poultry, egg products (recall API / dataset).
# Join across all four on normalized FIRM NAME + recall DATE; there is no
# cross-agency product or firm identifier, so name resolution does the work.The classification mismatch
Even “how serious is it?” does not translate cleanly. The FDA grades recalls Class I/II/III by health risk; the CPSC describes a hazard and a remedy without that tiering; NHTSA frames severity around safety defects and crash risk; FSIS uses its own health-hazard classes. A cross-agency severity comparison has to map these onto a common scale deliberately, and document the mapping — there is no shared field to lean on.
What the unified view reveals
Assembled, the web answers questions no single feed can: a manufacturer's total recall footprint across every product line it sells; whether recall volume in a category is rising once you account for all four regulators; and — pairing NHTSA completion data with the recall notices — the gap between a recall being announced and the product actually being fixed. Every feed is public and free; the web is just a matter of resolving names and reconciling four schemas.
Related writing: Not All Lists Are Sanctions — a field guide to the five US restriction regimes, another case of one question fragmenting across agencies.
Related writing: The Vehicle Safety Pipeline — the deeper, NHTSA-focused view of defects, investigations, recalls, and completion for one of the four agencies here.
See also: The Food Safety System — how the FDA/FSIS split plays out on the food side of the recall web.