# Product Recalls Scraper — CPSC + FDA Food, Drug & Device Feed (`parallelstudio/us-product-recalls-unified`) Actor

US product recall feed: CPSC recalls back to 1973, openFDA food, drug & device recalls since 2012, opt-in NHTSA vehicle recalls, one schema. Filter by date & keyword. onlyNew mode: scheduled runs return only new recalls, no repeat charges.

- **URL**: https://apify.com/parallelstudio/us-product-recalls-unified.md
- **Developed by:** [Parallel Studio](https://apify.com/parallelstudio) (community)
- **Categories:** E-commerce, News
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 recalls

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Product Recall Scraper — CPSC + FDA Recalls in One Feed

Get every new **U.S. product recall from the CPSC and the FDA (food, drugs and medical devices) in one normalized dataset**. Instead of checking cpsc.gov, the FDA enforcement reports and four different formats, you get one row per recall with the same fields: firm, product, hazard or reason, remedy, Class I/II/III, status, distribution, images and a source link. Filter by date window and keyword (brand, firm, product or contaminant), then schedule it and send new recalls to Slack, email, Google Sheets or a webhook.

### What you can answer with it

- **Seller catalog check:** Is anything I sell on Amazon, Shopify or Walmart, or anything from my suppliers, part of a CPSC or FDA recall?
- **Compliance monitoring:** Which consumer products, foods, drugs or devices were recalled this week, and where were they sold or distributed?
- **Class I alerts:** Which new FDA recalls are Class I, the most serious kind, where use can cause serious harm or death?
- **Keyword by firm or product:** Every recall in the last year that mentions *Salmonella*, *Listeria*, *battery*, a retailer or a specific brand.

### Output

source, recallId, recallDate, reportDate (FDA), title, description, firm (manufacturer, importer or distributor), retailers (CPSC: where it was sold and for how much), products (CPSC product names, FDA lot and code info), units, hazard (CPSC hazard, FDA reason for recall), remedy (CPSC remedy, FDA voluntary or mandated), classification (FDA Class I/II/III), status (FDA Ongoing/Completed/Terminated), distribution (FDA distribution pattern, CPSC country of manufacture), firmLocation (FDA), images (CPSC) and url.

NHTSA rows (opt-in) use the same fields, one row per recall campaign: `products` lists every affected "YEAR MAKE MODEL", `units` is the potential number of units affected, `hazard` is the consequence, `remedy` the corrective action and `classification` the recall type (Vehicle, Equipment, Tire or Child Restraint). They also carry components, manufacturerComponents (the maker's own part name, description and part number, so a keyword like `airbag` also matches part names), makes, modelYears, manufacturerCampaignNumber, ownerNotificationDate, initiatedBy (MFR, ODI or OVSC), doNotDrive, parkOutside and fmvss.

### Data quality & coverage (measured 2026-10-13 from the CPSC and openFDA APIs)

- **History:** CPSC recalls go back to **1973**. openFDA enforcement reports go back to **June 2012**, with 29,485 food, 18,010 drug and 40,249 device recall records as of today.
- **Volume:** a 90-day run (Jul 15 to Oct 13, 2026) returned **1,356 recalls**: 159 CPSC, 259 FDA food, 208 FDA drug and 730 FDA device. That is 45 to 167 new recalls a week. Over the last 365 days openFDA has 1,366 food, 878 drug and 3,314 device recalls.
- **Seriousness:** **257** of the FDA recalls in that 90-day window are Class I (168 food, 17 drug, 72 device).
- **Field completeness, CPSC** (all 159 recalls in the 90-day run): title, description, retailers, products, units, hazard, remedy, images and url are **100% filled**, and country of manufacture 98.7%. 98.1% name a manufacturer, importer or distributor as the firm; the rest fall back to the seller. Every recall has photos, 3.5 per recall on average. China was the country of manufacture for 124 of the 159.
- **Field completeness, FDA** (all 1,197 FDA recalls in the 90-day run): firm, product description, lot/code info, reason for recall, classification, status, distribution and firm location are **100% filled**. Units are filled on 100% of food, 95.7% of drug and 97.5% of device recalls. FDA records have no images.
- **Freshness:** CPSC posts its recalls on **Thursdays** (all 159 in the window, latest Oct 8, 2026). FDA publishes its enforcement report **weekly on Wednesdays** (latest Oct 7, 2026). An FDA recall typically appears weeks after the firm starts it: the median gap was 27 days for drugs, 34 for food and 44 for devices.
- **NHTSA (opt-in, measured 2026-10-17 from the NHTSA flat file last updated 2026-10-16):** the last 30 days returned **62 recall campaigns** (58 vehicle, 4 equipment) and the last 365 days **933** (840 vehicle, 77 equipment, 11 tire, 5 child restraint). The newest Part 573 report received date in the file was Oct 9, 2026.
- **Source of truth:** CPSC rows link to the official cpsc.gov recall notice. FDA rows carry the official FDA recall number (for example H-1407-2026), which you can look up in FDA's Enforcement Report database.

### Input

| Field | What it does |
|---|---|
| `sources` | Which feeds to include: `cpsc` (consumer products), `fda-food` (food and dietary supplements), `fda-drug` (drugs) and `fda-device` (medical devices), plus the opt-in `nhtsa` (vehicle, equipment, tire and child-seat recalls from NHTSA, since 2010). Default: the four CPSC and FDA feeds; add `nhtsa` to include vehicle recalls. |
| `daysBack` | How many days back to look. CPSC is matched on recall date, FDA on report (publication) date and NHTSA on the date NHTSA received the manufacturer's Part 573 report. Use 7 or more so a weekly FDA report and CPSC batch are always included. |
| `keyword` | Optional, case-insensitive. Matches any field: brand, firm, product, lot, retailer or reason, e.g. `salmonella`, `Amazon`, `battery`. |
| `maxItemsPerSource` | Maximum recalls returned per source, newest first. It also caps your cost: 4 sources × 100 = at most 400 recalls ($1.20). |
| `onlyNew` | Optional, default `false`. When `true`, recalls already delivered by earlier runs with the same `sources` and `keyword` are skipped and not charged again. `daysBack` and `maxItemsPerSource` can change between runs. Status updates to an already-delivered recall are not re-sent. |

### Example input

```json
{
  "sources": ["cpsc", "fda-food", "fda-drug", "fda-device"],
  "daysBack": 30,
  "keyword": "",
  "maxItemsPerSource": 100
}
```

#### Add vehicle recalls

```json
{
  "sources": ["cpsc", "fda-food", "fda-drug", "fda-device", "nhtsa"],
  "daysBack": 30,
  "maxItemsPerSource": 100
}
```

### Example output (real records from the 2026-10-13 run)

CPSC consumer product recall:

```json
{
  "source": "CPSC",
  "recallId": "27017",
  "recallDate": "2026-10-08",
  "title": "Decathlon America Recalls Van Rysel GRVL AF Bicycles Due to Risk of Serious Injury or Death from Crash Hazard",
  "description": "This recall involves adult multi-terrain gravel bicycles Van Rysel GRVL AF Sword Brown CN FR (model number 8911304), Van Rysel GRVL AF Apex Beige CN FR (model number 8911305), Van Rysel GRVL AF Sword Pink CN FR (model number 8911308), and Van Rysel GRVL AF GRX Black (model number 8929130). The recal…",
  "firm": "Decathlon America LLC, of San Francisco, California; Recreational Equipment, Inc. (REI), of Sumner, Washington",
  "retailers": "REI Co-op stores nationwide and online at REI.com from March 2025 through August 2026 for between $1,400 and $2,300.",
  "products": "Van Rysel GRVL AF Bicycles",
  "units": "About 1,150",
  "hazard": "The recalled bicycles' front lock nut can loosen during use, causing the front wheel to dislodge or loosen over time, posing a crash hazard.",
  "remedy": "Consumers should stop using the recalled bicycles immediately and take them to the nearest Recreational Equipment (REI Co-op) location for a free inspection and repair service of the front fork assembly. Anyone unable to visit an REI Co-op location can contact Decathlon Customer Service directly for assistance. Recalled models can be identified by the Van Rysel Product ID on the top right of the product label under the frame, beginning with the number 5.",
  "classification": null,
  "status": null,
  "distribution": "China",
  "images": [
    "https://www.cpsc.gov/s3fs-public/Decathlon1.png",
    "https://www.cpsc.gov/s3fs-public/Decathlon2.png",
    "https://www.cpsc.gov/s3fs-public/Decathlon3.png",
    "https://www.cpsc.gov/s3fs-public/Decathlon4.png",
    "https://www.cpsc.gov/s3fs-public/Decathlon5.png"
  ],
  "url": "https://www.cpsc.gov/Recalls/2027/Decathlon-America-Recalls-Van-Rysel-GRVL-AF-Bicycles-Due-to-Risk-of-Serious-Injury-or-Death-from-Crash-Hazard"
}
```

FDA food recall (Class I, sold through Amazon):

```json
{
  "source": "FDA food",
  "recallId": "H-1407-2026",
  "recallDate": "2026-09-11",
  "reportDate": "2026-10-07",
  "title": "Todd's Seeds Salad Sprouting Mixture - Broccoli, Mustard, Alfalfa and Cabbage, packaged in heat-sealed resealable bags in the following sizes: 1/4 lb., 1/2 lb., and 1 lb.",
  "description": "Todd's Seeds Salad Sprouting Mixture - Broccoli, Mustard, Alfalfa and Cabbage, packaged in heat-sealed resealable bags in the following sizes: 1/4 lb., 1/2 lb., and 1 lb.",
  "firm": "TODD'S SEEDS LLC",
  "products": "Lot No: TS-633-2 Use By: 12/31/2029",
  "units": "37,481 retail units (TOTAL)",
  "hazard": "Products contain alfalfa seed recalled by the supplier and may be contaminated with E. coli and/or Salmonella (downstream recall)",
  "remedy": "Voluntary: Firm initiated",
  "classification": "Class I",
  "status": "Ongoing",
  "distribution": "Nationwide; through Amazon or direct to consumer",
  "firmLocation": "Cookeville, TN, United States",
  "images": [],
  "url": "https://www.accessdata.fda.gov/scripts/ires/index.cfm"
}
```

NHTSA vehicle recall (real record from the 2026-10-17 run, owners told to park outside):

```json
{
  "source": "NHTSA",
  "recallId": "26V664000",
  "recallDate": "2026-10-08",
  "title": "Hyundai Motor America recalls GENESIS G80, HYUNDAI GENESIS: SEATS:FRONT ASSEMBLY:POWER ADJUST",
  "description": "Hyundai Motor America (Genesis) is recalling certain 2015-2016 Hyundai Genesis, and 2017-2020 Genesis G80 vehicles. The front power seat motors may overheat due to a stuck power seat control switch, which can result in a fire while parked or driving.",
  "firm": "Hyundai Motor America",
  "retailers": null,
  "products": "2015 HYUNDAI GENESIS; 2016 HYUNDAI GENESIS; 2017 GENESIS G80; 2018 GENESIS G80; 2019 GENESIS G80; 2020 GENESIS G80",
  "units": "94622",
  "hazard": "A fire increases the risk of injury.",
  "remedy": "Owners are advised to park their vehicles outdoors and away from other vehicles or structures until the repair has been performed. The remedy is currently under development. Owner notification letters are expected to be mailed December 7, 2026. Owners of Hyundai vehicles may contact Hyundai customer service at 1-855-371-9460. Genesis owners may contact Genesis customer service at 844-340-9741. Hyundai recall number for this recall is 308 and Genesis' recall number is 035G. Vehicle Identification Numbers (VINs) involved in this recall became searchable on NHTSA.gov beginning October 13, 2026.",
  "classification": "Vehicle",
  "status": null,
  "distribution": null,
  "images": [],
  "url": "https://www.nhtsa.gov/recalls?nhtsaId=26V664000",
  "components": [
    "SEATS:FRONT ASSEMBLY:POWER ADJUST"
  ],
  "manufacturerComponents": [
    "SWITCH ASSY POWER SEAT- AST(RH) - DH POWER SEAT - part 88991-B1000",
    "SWITCH ASSY POWER SEAT- DRV(LH) - DH POWER SEAT - part 88990-B1030"
  ],
  "makes": [
    "GENESIS",
    "HYUNDAI"
  ],
  "modelYears": [
    2015,
    2016,
    2017,
    2018,
    2019,
    2020
  ],
  "manufacturerCampaignNumber": "308/035G",
  "ownerNotificationDate": null,
  "initiatedBy": "MFR",
  "doNotDrive": false,
  "parkOutside": true,
  "fmvss": null
}
```

### Pricing

Pay per event: **$0.003 per recall** returned. Real examples from today's measurements:

- One week of all four sources (`daysBack: 7`) was 45 to 167 recalls over the last 13 weeks, so **$0.14 to $0.50 a week**.
- The last 30 days of CPSC recalls only (45) cost $0.14. The last 30 days of all four sources (462 recalls) cost $1.39.
- A full 90-day backfill of all four sources (1,356 recalls) costs $4.07.
- A one-year `salmonella` keyword search returned 269 recalls, which costs $0.81.

### FAQ

**What is the difference between CPSC and FDA recalls?** The CPSC (Consumer Product Safety Commission) covers consumer products such as toys, furniture, bikes, appliances, clothing and batteries. The FDA covers food, dietary supplements, drugs and medical devices. This actor merges both into one schema, so one scheduled run covers most recalls a retailer or marketplace seller can be hit by. Vehicle, equipment, tire and child-seat recalls from NHTSA are available as an opt-in source: add `nhtsa` to `sources`. Meat and poultry (USDA) are not included.

**What do Class I, II and III mean?** These are FDA classes. Class I: the product can cause serious health problems or death. Class II: it may cause temporary or medically reversible problems. Class III: unlikely to cause harm, but it violates FDA rules. A few brand-new FDA records say "Not Yet Classified". CPSC does not classify recalls, so `classification` is empty on CPSC rows. Filter `classification` = `Class I` in your sheet or integration for urgent alerts.

**Why do FDA recalls show up weeks after they start?** FDA publishes a recall in its weekly enforcement report only after reviewing and classifying it. In today's sample the median gap between the firm starting the recall (`recallDate`) and FDA publishing it (`reportDate`) was 27 days for drugs, 34 for food and 44 for devices. The actor filters FDA by `reportDate`, so every newly published recall is picked up even when it started months ago.

**Which FDA recalls are Class I, and how fast do CPSC recalls show up?** Measured from 13 nightly runs (Oct 13 to 25, 2026; all four default sources, `daysBack: 30`, newest 50 per source; 300 unique recalls): Class I was mostly food. 38 of the 71 food recalls were Class I, against 4 of 73 drug and 3 of 100 device recalls, so a Class I alert on `fda-food` is where most urgent hits come from. All 11 new CPSC recalls in that period first appeared in the run the morning after their recall date, so a run on Friday morning catches the Thursday CPSC batch.

**Can I schedule it daily?** Yes. Create an Apify schedule and connect a Slack, email, Google Sheets or webhook integration. Because CPSC posts on Thursdays and FDA on Wednesdays, the cheapest setup is a weekly run on Friday with `daysBack: 7`. If you prefer a daily run, use `daysBack: 7` with `onlyNew: true`, so each recall is delivered and charged only once.

**How do I get only new recalls on a schedule?** Set `onlyNew` to `true` and schedule the run. The actor remembers the recalls it delivered (per combination of `sources` and `keyword`, in a key-value store named `us-product-recalls-state`) and skips them next time, so you pay only for recalls you have not received. Status updates to a recall that was already delivered are not re-sent. Changing `sources` or `keyword` starts a fresh history.

**How does the keyword filter work?** It is a case-insensitive text match across every field of the normalized record, so a brand, firm name, retailer ("Amazon", "Walmart"), lot code, ingredient or hazard word all work. For FDA sources the actor pages through the whole date window, so a long window with a keyword still finds older matches.

**Are the fields really the same across sources?** Yes. Every row has the same keys. Where a source has no equivalent the value is empty: CPSC has no classification, status or firm location, and FDA has no retailer list or images. NHTSA has no retailers, status, distribution or images, and adds vehicle-specific fields such as makes, modelYears and doNotDrive. For FDA rows, `products` holds the lot and code info and `remedy` says whether the recall is voluntary or FDA-mandated.

**Can I use it for Amazon or Shopify catalog checks?** Yes. Run it with your brand, supplier or product type as the keyword, or export a 90-day window and match `firm`, `title` and `products` against your catalog.

### Sources

Official public U.S. government APIs: the [CPSC Recalls API](https://www.cpsc.gov/Recalls/CPSC-Recalls-Application-Program-Interface-API-Information?utm_source=apify\&utm_medium=listing\&utm_campaign=us-product-recalls-unified) and [openFDA food, drug and device enforcement reports](https://open.fda.gov/apis/?utm_source=apify\&utm_medium=listing\&utm_campaign=us-product-recalls-unified). FDA recall numbers can be checked in the [FDA Enforcement Report database](https://www.accessdata.fda.gov/scripts/ires/index.cfm?utm_source=apify\&utm_medium=listing\&utm_campaign=us-product-recalls-unified). The opt-in `nhtsa` source reads NHTSA's official [recall flat file](https://static.nhtsa.gov/odi/ffdd/rcl/FLAT_RCL_POST_2010.zip) (recalls since 2010, refreshed daily; [field layout](https://static.nhtsa.gov/odi/ffdd/rcl/RCL.txt)), and each row links to the recall on nhtsa.gov. Data is provided as-is. Always check the official notice before making safety or legal decisions.

### Related actors

Other public-data Actors from parallelstudio:

- [Minneapolis building permits since 2016: contractor, valuation, address, ward, neighborhood](https://apify.com/parallelstudio/twin-cities-building-permits) ($0.004/permit)
- [Federal contract awards from USAspending.gov by state, NAICS, agency or company, plus recompete leads](https://apify.com/parallelstudio/usaspending-contract-awards) ($0.004/award)
- [Bulk Shopify app and theme detector for store URLs](https://apify.com/parallelstudio/shopify-store-tech-detector) ($0.01/store)

# Actor input Schema

## `sources` (type: `array`):

Which recall feeds to include. Allowed values: "cpsc" (Consumer Product Safety Commission: toys, furniture, bikes, appliances, batteries, clothing), "fda-food" (FDA food and dietary supplement recalls), "fda-drug" (FDA drug recalls), "fda-device" (FDA medical device recalls) and the opt-in "nhtsa" (NHTSA vehicle, equipment, tire and child-seat recalls, one row per recall campaign, matched on the Part 573 report received date; this feed has history since 2010 and the file is refreshed daily). The default is the four CPSC/FDA feeds; add "nhtsa" to include vehicle recalls.

## `daysBack` (type: `integer`):

How many days back to look. CPSC is matched on recall date and FDA on report (publication) date. CPSC posts recalls on Thursdays and FDA publishes its enforcement report weekly on Wednesdays, often weeks after the recall started, so use 7 or more. CPSC history reaches back to 1973, FDA to June 2012.

## `keyword` (type: `string`):

Optional. Case-insensitive text matched against every field of each recall: brand, firm, product name, lot code, retailer or reason, e.g. "salmonella", "Amazon", "lithium battery". Leave empty to get all recalls in the window.

## `maxItemsPerSource` (type: `integer`):

Maximum recalls returned for each source, newest first. Also caps your cost: you pay $0.003 per recall, so 4 sources x 100 = at most 400 recalls ($1.20). A typical week has 45 to 167 recalls across all four sources.

## `onlyNew` (type: `boolean`):

For scheduled runs: skip recalls delivered by earlier runs with the same sources and keyword, so you are not charged for them again. You can change Days back or Max recalls per source between runs. Status updates to a recall that was already delivered are not re-sent. Leave off to get every matching recall each run.

## Actor input object example

```json
{
  "sources": [
    "cpsc",
    "fda-food",
    "fda-drug",
    "fda-device"
  ],
  "daysBack": 30,
  "keyword": "",
  "maxItemsPerSource": 100,
  "onlyNew": false
}
```

# Actor output Schema

## `results` (type: `string`):

All records from the default dataset (JSON/CSV/Excel via the dataset API).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "cpsc",
        "fda-food",
        "fda-drug",
        "fda-device"
    ],
    "daysBack": 30,
    "keyword": "",
    "maxItemsPerSource": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("parallelstudio/us-product-recalls-unified").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "cpsc",
        "fda-food",
        "fda-drug",
        "fda-device",
    ],
    "daysBack": 30,
    "keyword": "",
    "maxItemsPerSource": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("parallelstudio/us-product-recalls-unified").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "cpsc",
    "fda-food",
    "fda-drug",
    "fda-device"
  ],
  "daysBack": 30,
  "keyword": "",
  "maxItemsPerSource": 100
}' |
apify call parallelstudio/us-product-recalls-unified --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parallelstudio/us-product-recalls-unified"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/L4XlwRfeTtg5cLFqS/builds/cAQt5lYxqHr8bRz9W/openapi.json
