# US Product Recalls Monitor: FDA & CPSC Feed (`offerastudio/us-product-recalls-monitor`) Actor

FDA food, drug and medical device recalls plus CPSC consumer product recalls in one feed, newest first. Filter by date, keyword, firm, class, status or state, and get a severity rating with a plain-English explanation, recall number, reason, quantity, distribution and official link.

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

## Pricing

from $2.00 / 1,000 recall returneds

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

### What does US Product Recalls Monitor do?

**US Product Recalls Monitor** puts the official US recall databases into **one feed**: **FDA** recalls of **food, drugs and medical devices** (from openFDA's enforcement reports) and **CPSC** recalls of **consumer products** such as toys, electronics, furniture and appliances. By default it returns **every recall reported in the last 30 days, newest first**. For every recall you get:

- 🏷️ **agency and category**, **recall number** and a stable **`recallId`** you can de-duplicate on
- 🏭 the **firm** (recalling firm, manufacturer, importer or retailer)
- 📦 the **product description**, **lots, codes or model numbers** and **UPCs** when published
- ⚠️ the **reason** and **hazard**, the **FDA classification** (Class I, II, III) and the **FDA status**
- 🚦 a **severity** rating (**high, medium, low**) with a **plain-English explanation**, so you know what to check first
- 📅 **recall initiation and report dates**, **distribution pattern** (where it was sold) and **quantity**
- 🔗 a **link to the official notice** on FDA's Enforcement Report or cpsc.gov

Filter by **date range, keyword, firm, FDA class, severity, status, the firm's state or country, and the states a product was distributed to**. Schedule it daily or weekly and send new recalls to Google Sheets, Slack, email, Zapier or Make.

### Who is this recall monitor for?

- **E-commerce and marketplace teams**: check every week whether anything you sell (by keyword, brand, UPC or supplier) was recalled, and take it down fast.
- **Quality assurance and regulatory teams**: watch recalls in your product category and from your suppliers and competitors.
- **Retail buyers and distributors**: screen suppliers before listing their products and keep an eye on them afterwards.
- **Hospitals, pharmacies and clinics**: follow drug and medical device recalls, Class I first.
- **Insurers, lawyers and journalists**: track recalls by firm, hazard or state over months or years.

### How is severity decided?

| Severity | FDA recalls | CPSC recalls |
| --- | --- | --- |
| **high** | **Class I**: a reasonable probability of serious health problems or death | The title, hazard or incident reports name a life-threatening hazard: death, serious injury, choking, suffocation, strangulation, drowning, poisoning, ingestion, electrocution, entrapment, tip-over or carbon monoxide |
| **medium** | **Class II**: temporary or medically reversible health problems; serious harm is unlikely | Any other injury hazard (fire, burn, shock, fall, laceration …) |
| **low** | **Class III**: not likely to cause health problems (for example labelling) | – |
| **unknown** | Not yet classified by FDA | – |

Every row has `severityExplanation` (what it means and what to do) and `severityBasis` (what the rating was derived from, e.g. `FDA Class I` or `CPSC hazard text: "choking"`). The FDA definitions are FDA's own; the CPSC rating is our reading of CPSC's standard wording. It is a **triage aid, not an official risk assessment**.

### How to use it

1. Click **Try for free** and **Start**: with no input you get the last 30 days of recalls from all four sources (no API key needed).
2. Optional: pick **Sources**, set **Date from / to** (a date like `2026-09-01` or a relative date like `90 days`).
3. Optional: add a **Keyword** (`peanut`, `salmonella`, `lithium`, `stroller`, a UPC …), a **Firm or company** name, **FDA classification**, **Severity**, **FDA recall status**, **Firm state or country** or **Distributed in (US states)**.
4. Set **Maximum recalls** (default 500) and click **Start**. The **Recalls** tab shows one row per recall; **Triage** and **Details** have the rest.

To monitor recalls, save your input as a **task**, add a **schedule** (for example every Thursday, after FDA's weekly Enforcement Report) and de-duplicate on `recallId` in your sheet or database.

### Input example

```json
{
    "sources": ["fda-food", "cpsc"],
    "dateFrom": "90 days",
    "keyword": "peanut",
    "severities": ["high", "medium"],
    "distributedIn": ["CA", "NV"],
    "maxResults": 200
}
```

### Output example

Two real rows from a run on 1 October 2026 (shortened; FDA and CPSC data are public domain):

```json
[
    {
        "recallId": "fda:H-1339-2026",
        "source": "FDA",
        "category": "food",
        "recallNumber": "H-1339-2026",
        "firm": "Everything Sprouts, LLC",
        "productDescription": "Everything Sprouts Crunchy Protein Sprout Mix, containing Alfalfa Fenugreek, Cabbage, Mung, Adzuki, Lentils, Green Pea, Net Wt. 5.0 oz (142 g) UPC 0 87906-01018 7. everythingsprouts.com",
        "reason": "Sprouts may be contaminated with STEC E. coli and/or Salmonella.",
        "classification": "Class I",
        "severity": "high",
        "severityExplanation": "FDA Class I: there is a reasonable probability that using or being exposed to this product will cause serious health problems or death. Check right away whether you sell, stock or use it.",
        "severityBasis": "FDA Class I",
        "status": "Ongoing",
        "recallInitiationDate": "2026-08-22",
        "reportDate": "2026-09-23",
        "distributionPattern": "MN, WI",
        "quantity": "201.56 pounds",
        "codeInfo": "Lot# 222, 223, 226, 230",
        "upcs": ["087906010187"],
        "officialUrl": "https://www.accessdata.fda.gov/scripts/ires/index.cfm?Event=99737"
    },
    {
        "recallId": "cpsc:26792",
        "source": "CPSC",
        "category": "consumer-product",
        "recallNumber": "26792",
        "firm": "Shenzhen Xinkewangda Electronics Co., Ltd., d/b/a NEWDERY, of China",
        "productDescription": "NEWDERY power banks — This recall involves NEWDERY power banks with model number ZHX-PB22. …",
        "reason": "Fire and Burn Hazards; Risk of Serious Injury; Sold on Amazon",
        "hazard": "The lithium-ion battery in the power banks can explode or ignite, posing fire and burn hazards to consumers.",
        "classification": null,
        "severity": "high",
        "severityExplanation": "CPSC recall for a life-threatening hazard (serious injury). Treat like an FDA Class I recall: stop selling and check stock right away.",
        "severityBasis": "CPSC hazard text: \"serious injury\"",
        "status": null,
        "recallInitiationDate": "2026-09-24",
        "reportDate": "2026-09-24",
        "distributionPattern": "Sold Online At: Amazon.com from October 2023 to November 2024 for between $27 and $50.",
        "quantity": "About 21,380",
        "remedyOptions": ["Refund"],
        "manufacturerCountries": ["China"],
        "officialUrl": "https://cpsc.gov/Recalls/2026/NEWDERY-Power-Banks-Recalled-Due-to-Fire-and-Burn-Hazards-Risk-of-Serious-Injury-Sold-on-Amazon"
    }
]
```

Rows also include `eventId`, `firms` (every firm with its role), `productType`, `voluntaryMandated`, `classificationDate`, `terminationDate`, `firmCity/State/Country`, `remedy`, `injuries`, `consumerContact`, `imageUrls` and `dataLastUpdated`. That run returned all 437 recalls of the last 30 days with 5 API requests in about 4 seconds.

Rows with an `error` code cost nothing: `invalid-input`, `no-results` (nothing matched your filters), `rate-limited`, `invalid-api-key`, `api-error`. If one source is down, you get a free error row for it and the other sources still run.

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Recall returned | **$0.002** per recall |
| Error rows and the "no results" row | **free** |

- 100 recalls cost **$0.20**; a typical month of all FDA and CPSC recalls (about 400–500) costs **about $1**.
- The openFDA and CPSC APIs are free; no API key is needed.
- Apify also charges a tiny standard start fee per run (about $0.0000125 at the default 256 MB).
- Set **Maximum recalls**, or **Maximum cost per run** in the run options, to cap the cost.

### Data sources and terms

- **openFDA** food, drug and device **enforcement reports** (FDA Recall Enterprise System), updated weekly, covering 2004 to today. The data is **public domain (CC0)**. openFDA asks you not to rely on it for medical decisions, says it shouldn't be used to issue public alerts or to track the lifecycle of a recall, and notes that FDA doesn't update a recall's status after it has been classified. Terms: https://open.fda.gov/terms/
- **CPSC Recall Retrieval Web Services** (saferproducts.gov), the official CPSC recall database. CPSC says its web text and recall notices, including photos of recalled items, may be freely copied and distributed, credited to CPSC and without implying endorsement.
- Data provided by the U.S. Food and Drug Administration (https://open.fda.gov) and the U.S. Consumer Product Safety Commission (https://www.cpsc.gov). This Actor is **not affiliated with or endorsed by FDA or CPSC**.

### Limitations

- **FDA recalls appear when FDA classifies them**, usually weeks after the firm starts the recall, and openFDA is refreshed weekly. Urgent recalls are often announced earlier in FDA press releases, which this Actor doesn't read. CPSC recalls appear on the announcement day.
- **Dates**: FDA recalls are filtered and sorted by the Enforcement Report date (`reportDate`), CPSC recalls by the announcement date. At most 5 years per run.
- **Not covered**: USDA FSIS (meat, poultry, egg products), NHTSA (vehicles, tires, car seats), FDA biologics, veterinary and tobacco recalls, and recalls outside the US.
- **FDA status** is recorded when FDA classifies a recall and isn't always updated later. CPSC recalls have no class and no status; FDA-only filters keep them.
- **Keyword and firm filters** are "contains" matches on the published text. FDA writes UPCs inside product descriptions; the Actor extracts the ones labelled "UPC", so search by keyword too.
- **Distributed in** reads FDA's free-text distribution pattern (state codes, state names, "nationwide"). Unusual wording can be missed.
- **openFDA limits**: 240 requests per minute and 1,000 per day per IP address without a key. A typical run makes 1 to 20 requests, but Apify's IP addresses are shared; if you see `rate-limited`, add your own free openFDA key.
- Severity is a triage aid derived from the agencies' own classification and wording, not legal or medical advice.

### FAQ

#### Do I need an API key?

No. openFDA works without a key and CPSC needs none. A free openFDA key (https://open.fda.gov/apis/authentication/) only raises the daily limit; paste it into **openFDA API key** (stored encrypted).

#### How do I get only new recalls every week?

Schedule a task with **Date from** `7 days` (or `8 days` for some overlap) and de-duplicate on `recallId`. The ID never changes for the same recall.

#### Why is a recall I saw in the news missing?

It may not be classified yet (FDA), it may belong to another agency (USDA for meat and poultry, NHTSA for vehicles), or it may be outside your date range or filters.

#### Can I check my product catalogue against recalls?

Yes: run it with a long date range and match `upcs`, `firm`, `firms` and `productDescription` against your catalogue, or run one keyword per brand.

#### Is the severity official?

The FDA class is official; the high/medium/low wording and explanation are ours. For CPSC, severity is read from CPSC's own hazard wording. Always read the official notice.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.

### Feedback

Missing a source, a filter or a field? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/us-product-recalls-monitor/changelog.md

# Actor input Schema

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

Which official recall databases to read. Default: all four.

## `dateFrom` (type: `string`):

First report date (US date), e.g. 2026-09-01, or a relative date like "30 days" (30 days ago). Leave both dates empty for the last 30 days. FDA recalls are dated by the weekly Enforcement Report they appeared in, CPSC recalls by their announcement date. At most 5 years per run.

## `dateTo` (type: `string`):

Last report date (inclusive). Default: today.

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

Keep recalls whose product description, reason, hazard, title, lot codes or UPCs contain this text (not case-sensitive), e.g. peanut, salmonella, lithium, stroller.

## `firmContains` (type: `string`):

Keep recalls where the recalling firm, manufacturer, importer, distributor or retailer name contains this text (not case-sensitive), e.g. Stryker or Walmart.

## `classifications` (type: `array`):

FDA recalls only. Class I = may cause serious health problems or death; Class II = temporary or reversible health problems; Class III = unlikely to cause health problems. CPSC recalls have no class and are not affected (use Severity to filter them).

## `severities` (type: `array`):

Keep only recalls with these severity ratings (both FDA and CPSC). High = FDA Class I or a CPSC hazard that can kill or seriously injure; medium = FDA Class II or another CPSC injury hazard; low = FDA Class III.

## `statuses` (type: `array`):

FDA recalls only: Ongoing, Completed or Terminated. FDA records the status when it classifies the recall and doesn't always update it later. CPSC recalls have no status and are not affected.

## `firmLocations` (type: `array`):

Keep recalls whose firm is located in one of these places: a US state (CA or California) or a country (Canada, China). FDA: the recalling firm's address. CPSC: the country of manufacture or the location written in the firm names ("Acme Inc., of Columbus, Georgia").

## `distributedIn` (type: `array`):

FDA recalls only: keep recalls whose distribution pattern names one of these states (CA or California) or says nationwide. CPSC recalls are national and always kept.

## `maxResults` (type: `integer`):

Stop after this many recalls (newest first across all sources). Each recall returned costs $0.002.

## `openFdaApiKey` (type: `string`):

Not needed for normal use. Without a key openFDA allows 240 requests per minute and 1,000 per day per IP address; a free key (open.fda.gov/apis/authentication) raises the daily limit to 120,000. A typical run makes 1 to 10 requests. Stored encrypted.

## Actor input object example

```json
{
  "sources": [
    "fda-food",
    "fda-drug",
    "fda-device",
    "cpsc"
  ],
  "maxResults": 50
}
```

# Actor output Schema

## `recalls` (type: `string`):

No description

## `triage` (type: `string`):

No description

# 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": [
        "fda-food",
        "fda-drug",
        "fda-device",
        "cpsc"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/us-product-recalls-monitor").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": [
        "fda-food",
        "fda-drug",
        "fda-device",
        "cpsc",
    ],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/us-product-recalls-monitor").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": [
    "fda-food",
    "fda-drug",
    "fda-device",
    "cpsc"
  ],
  "maxResults": 50
}' |
apify call offerastudio/us-product-recalls-monitor --silent --output-dataset

```

## MCP server setup

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

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/2jWq6e8A6oiKB49MU/builds/Hov3xYx4M2bdjHQJX/openapi.json
