US Product Recalls API: CPSC, FDA, NHTSA and USDA in One Schema
Pricing
$5.00 / 1,000 recall records
US Product Recalls API: CPSC, FDA, NHTSA and USDA in One Schema
Product recall API that returns FDA recall, CPSC recall, NHTSA recall and USDA recall records from the four official US sources in one clean JSON schema, filterable by date, keyword, UPC, firm and class.
Pricing
$5.00 / 1,000 recall records
Rating
0.0
(0)
Developer
Landon Brewington
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
One call, four official US recall authorities, one clean JSON schema. This Actor is a product recall API that pulls CPSC recalls (consumer products), FDA enforcement reports (food, drug and medical device recalls from openFDA), NHTSA vehicle recalls and USDA FSIS meat, poultry and egg recalls, normalizes every record into the same fields, and lets you filter by date, keyword, UPC, firm and FDA class. Built for recall monitoring by people and by AI agents.
What it does
- Queries the official government feeds directly: saferproducts.gov (CPSC), api.fda.gov (openFDA enforcement), api.nhtsa.gov (NHTSA) and fsis.usda.gov (USDA FSIS). No scraping of HTML, no login, no third-party data.
- Returns one record per recall with the same 20 fields no matter which agency published it:
id,source,recallNumber,title,productDescription,firm,hazard,classification,remedy,status,recallDate,reportDate,distribution,statesAffected,upcs,units,injuries,imageUrls,url, plusrawwith the untouched agency record. - Date window (
since,untilorsinceDays), keyword search, UPC lookup, firm or brand filter, FDA Class I / II / III filter, and NHTSA lookup by vehicle make, model and year. - Newest first, deduplicated, capped at
maxItems. A run with no input returns the last 7 days from every source, at most 100 records. - A failing or blocked source never fails the run: it is reported in the run summary (
SUMMARYrecord in the key-value store) and the other sources still return data.
Who it is for
- E-commerce and marketplace compliance teams that must pull recalled listings fast.
- Retail and supply-chain QA that check incoming goods against recall lists by UPC or supplier.
- Product liability, insurance and consumer-safety analysts who track recalls by hazard or class.
- Food safety and healthcare teams monitoring FDA and USDA Class I recalls.
- AI agents that need structured recall data as a tool call (see the MCP section).
Quick start
- Open the Actor in Apify Console and press Start. The default input returns the last 7 days from all sources.
- For a daily monitor, schedule the Actor with
{"sinceDays": 1}. - To check one product, pass
{"upc": "094922980045"}or{"query": "infant formula", "sinceDays": 365}. - For a vehicle, pass
{"sources": ["nhtsa"], "vehicleMake": "Ford", "vehicleModel": "F-150", "vehicleYear": "2024"}. - Read results from the default dataset (JSON, CSV or Excel) or the API:
https://api.apify.com/v2/datasets/<datasetId>/items.
Input example
{"sources": ["cpsc", "fda_food", "fda_drug", "fda_device", "nhtsa", "usda_fsis"],"sinceDays": 30,"query": "listeria","fdaClassification": "I","maxItems": 200}
All fields are optional.
| Field | Type | Default | Meaning |
|---|---|---|---|
sources | array of strings | all six | Any of cpsc, fda_food, fda_drug, fda_device, nhtsa, usda_fsis |
sinceDays | integer 1 to 365 | 7 | Look-back window when since is empty |
since | ISO date | empty | Inclusive start date, overrides sinceDays |
until | ISO date | today | Inclusive end date |
query | string | empty | Case-insensitive keyword over title, product, firm and hazard |
upc | string | empty | UPC / GTIN digits that must appear in the record |
firm | string | empty | Company name fragment |
fdaClassification | any, I, II, III | any | Applies to the three FDA sources |
vehicleMake, vehicleModel, vehicleYear | strings | empty | All three are required for NHTSA results |
maxItems | integer 1 to 5000 | 100 | Cap on records across all sources |
useProxyForUsda | boolean | false | Retry USDA through Apify residential proxy if the feed refuses the request |
Output example
A real record from a run (the raw object is shortened here):
{"id": "usda_fsis:026-2026","source": "usda_fsis","recallNumber": "026-2026","title": "Kayem Foods Inc. Recalls Meat and Poultry Products Due to Possible Temperature Abuse","productDescription": "Full product list available in PDF format - Various RTE meat and poultry products bearing EST. M/P 7839, EST. P 20935A and EST. M 9520 inside the USDA mark of inspection.","firm": "Kayem Foods Inc.","hazard": "Processing Defect","classification": "I","remedy": "Consumers should not consume the product and should throw it away or return it to the place of purchase.","status": "Active","recallDate": "2026-10-17","reportDate": "2026-10-17","distribution": "Nationwide","statesAffected": ["Nationwide"],"upcs": [],"units": 1584361,"injuries": "There have been no confirmed reports of illness due to consumption of these products.","imageUrls": [],"url": "https://www.fsis.usda.gov/recalls-alerts/kayem-foods-inc--recalls-meat-and-poultry-products-due-possible-temperature-abuse","raw": {"field_recall_number": "026-2026","field_recall_type": "Active Recall","field_risk_level": "High - Class I","field_states": ["Nationwide"],"field_establishment": ["Kayem Foods Inc."],"field_recall_reason": ["Processing Defect"],"field_last_modified_date": "2026-10-17"}}
Field notes:
idis<source>:<recallNumber>and is stable across runs, so you can deduplicate against your own store.classificationis"I","II"or"III"for FDA and USDA records andnullfor CPSC and NHTSA, which do not classify.recallDateis the agency's announcement or initiation date;reportDateis when the agency published or last updated the record. FDA records are selected byreportDate, the others byrecallDate.statesAffectedis parsed from free text.["Nationwide"]means the agency said nationwide. An empty array means the agency did not say.upcsholds codes the agency printed in the notice. Many recalls list none; searchproductDescriptionandrawfor lot codes.rawis the full agency record, so nothing is lost by normalization.
Pricing in plain words
This Actor uses pay-per-event pricing: $0.005 per recall record written to the dataset (the result-item event), plus Apify's standard tiny Actor start fee. There is no subscription. A default run (up to 100 records) costs at most 50 cents. Ten records cost 5 cents. You set the maximum you are willing to spend on each run; when the limit is reached the Actor stops writing records and still finishes successfully. Platform compute is included in the price.
Limits and freshness per source
| Source | Coverage | Freshness | Limits |
|---|---|---|---|
cpsc | All CPSC consumer product recalls, with product photos, retailers, units, hazards and remedies | Same day as the CPSC press release | Date filter is on the recall date. CPSC lists UPCs only for some recalls. |
fda_food, fda_drug, fda_device | FDA enforcement reports (recalls classified by FDA) | openFDA updates weekly, usually on Wednesdays; reportDate is the weekly enforcement report date, so a recall can appear 1 to 6 weeks after the firm started it | Without a key openFDA allows 1,000 requests per day per IP; one run uses 1 request per 1,000 records per source. Set the OPENFDA_API_KEY environment variable on the Actor for 120,000 per day. |
nhtsa | NHTSA vehicle safety recalls for one make, model and model year | Live NHTSA API | The public API has no "recalls since date" search, so this source returns results only when vehicleMake, vehicleModel and vehicleYear are all set, and the date window does not apply to it. |
usda_fsis | USDA FSIS meat, poultry and egg product recalls and public health alerts since 2014 | Live feed; the full feed (about 1.7 MB) is downloaded once per run in under a second and cached in the run's key-value store | The feed sits behind a bot filter that sometimes refuses data-center requests. If that happens the run reports a warning for this source; turn on useProxyForUsda to retry through Apify residential proxy (billed to your account, about 2 MB per fetch). |
Other limits: records are capped at maxItems (max 5,000) after sorting newest first, so with a wide window and a low cap the newest source wins. Each run is independent; for a change feed, run daily with sinceDays: 1 or 2 and deduplicate on id.
Use it from an AI agent (Apify MCP server)
Connect your agent to https://mcp.apify.com (see the Apify MCP docs for Claude, Cursor, VS Code and others). Then:
- Search for the tool:
search-actorswith the query "product recalls". - Read the schema:
fetch-actor-detailsfor this Actor returns the input fields above and the dataset schema. - Call it:
call-actorwith input{"sinceDays": 3}for a three-day recall digest, or{"upc": "094922980045", "sinceDays": 365}to check one product, or{"sources": ["nhtsa"], "vehicleMake": "Toyota", "vehicleModel": "Camry", "vehicleYear": "2023"}for a vehicle. - Read results with
get-dataset-items. Every record has the same fields, so one parser handles all four agencies.
The Actor runs with limited permissions and charges only pay-per-event events, so it works with Apify's agentic payments.
Data sources and attribution
- CPSC: U.S. Consumer Product Safety Commission Recall API, https://www.saferproducts.gov and https://www.cpsc.gov/Recalls. Public domain.
- FDA: openFDA enforcement endpoints for food, drug and device, https://open.fda.gov. openFDA data is provided as is; see https://open.fda.gov/terms/ and https://open.fda.gov/license/. Do not rely on it alone for medical decisions.
- NHTSA: National Highway Traffic Safety Administration Recalls API, https://www.nhtsa.gov/recalls. Public domain.
- USDA FSIS: Food Safety and Inspection Service Recall API, https://www.fsis.usda.gov/science-data/developer-resources/recall-api. Public domain.
This Actor is not affiliated with any of these agencies. Always confirm details on the official notice linked in url before acting on a recall.
FAQ
Why does a default run return only a handful of records? The default window is the last 7 days. CPSC and USDA publish continuously, but openFDA publishes enforcement reports weekly, so a 7-day window can contain zero FDA rows. Use sinceDays: 30 for a fuller picture.
Can I look up one product? Yes. Pass upc for a barcode match or query for a keyword match against title, product description, firm and hazard. Combine with sinceDays: 365 to search a year.
Why is NHTSA empty unless I give a vehicle? NHTSA's public API has no date search, so vehicle recalls are returned only when vehicleMake, vehicleModel and vehicleYear are all set.
Is the data official? Every record comes straight from the agency's own API (saferproducts.gov, api.fda.gov, api.nhtsa.gov, fsis.usda.gov) and the untouched source record is kept in raw.
What does it cost? $0.005 per recall record plus Apify's tiny start fee. A default run never costs more than 50 cents. Failed sources are reported, not charged.
How do I monitor recalls daily? Schedule the Actor in Apify Console with {"sinceDays": 1} and connect a webhook or the Apify integration for Slack, email or Google Sheets.
Support
Open an issue on the Actor's Issues tab in Apify Console. Include the run id and the input you used.