# US Product Recalls Monitor – CPSC, FDA & NHTSA Alerts (`gazidev/product-recalls-monitor`) Actor

All US product recalls in one feed: CPSC consumer products, FDA food/drug/medical device enforcement reports and NHTSA vehicle recalls from official government APIs. Filter by date, keyword, firm, class, state. Scheduled alerts. $1 per 1,000 recalls.

- **URL**: https://apify.com/gazidev/product-recalls-monitor.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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

## US Product Recalls Monitor – CPSC, FDA & NHTSA Recall Alerts

Get **every US product recall in one feed**: consumer products (**CPSC**), food, drugs and medical devices (**FDA** enforcement reports), vehicles, tires, car seats and equipment (**NHTSA**). The Actor reads the official government APIs, normalizes every record to **one schema** and lets you filter by date, keyword, firm, FDA class and state. Turn on **Only new recalls** and schedule it for a daily **recall alert** feed.

No API key, no login, no browser. **$1 per 1,000 recalls.**

### Who uses it

- **Retailers, marketplaces and Amazon/eBay sellers** – check listings and inventory against new recalls (keywords, brands, UPCs).
- **Brands and manufacturers** – monitor competitors' and suppliers' recalls in your category.
- **Compliance, QA and regulatory teams** – daily Class I/II recall alerts for your products, ingredients or states.
- **Journalists and researchers** – recall trends by agency, hazard, firm and month.
- **Consumer, food-safety and car apps** – a clean recall feed without integrating four different APIs.
- **AI agents** – one tool call answers "were there any recalls of X recently?"

### Sources

| Source | Agency | Covers | Date used |
|---|---|---|---|
| `cpsc` | Consumer Product Safety Commission | toys, appliances, furniture, e-bikes, kids' products… | recall date |
| `fda-food` | FDA | food, beverages, supplements, cosmetics | Enforcement Report date |
| `fda-drug` | FDA | prescription and OTC drugs | Enforcement Report date |
| `fda-device` | FDA | medical devices | Enforcement Report date |
| `nhtsa` | NHTSA | vehicles, tires, child seats, equipment | report received date |

### Input examples

All recalls from the last 7 days (all agencies):

```json
{ "withinDays": 7 }
```

Daily alert: Class I food recalls mentioning allergens or listeria, sold in California:

```json
{
  "agencies": ["fda-food", "cpsc"],
  "withinDays": 3,
  "keywords": ["listeria", "undeclared", "salmonella", "e. coli"],
  "classifications": ["Class I"],
  "states": ["CA"],
  "onlyNew": true
}
```

Vehicle recalls for one manufacturer this year:

```json
{ "agencies": ["nhtsa"], "after": "2026-01-01", "firm": "Ford" }
```

Children's product recalls (CPSC):

```json
{ "agencies": ["cpsc"], "withinDays": 90, "keywords": ["child", "infant", "toy", "crib", "stroller"] }
```

### Output

Every recall has the same core fields (`agency`, `recallId`, `recallDate`, `title`, `product`, `description`, `hazard`, `classification`, `firm`, `distribution`, `states`, `quantity`, `remedy`, `status`, `url`, `images`, `sourceIds`) plus agency-specific extras. Empty fields are omitted.

```json
{
  "agency": "CPSC",
  "category": "Consumer products",
  "recallId": "27024",
  "recallDate": "2026-10-15",
  "title": "3M Company Recalls Scotch™ Thermal Laminators Due to Risk of Serious Injury or Death from Fire Hazard",
  "product": "Scotch™ Thermal Laminators",
  "hazard": "The recalled thermal laminators can overheat, posing a fire hazard.",
  "firm": "3M Company, of St. Paul, Minnesota",
  "retailers": ["Sold Online At:\nAmazon.com from June 2024 through September 2026 for between $44 and $56."],
  "quantity": "About 53,634",
  "remedy": "Consumers should stop using and unplug the recalled thermal laminators immediately and contact 3M Company to receive a full refund…",
  "url": "https://cpsc.gov/Recalls/2027/3M-Company-Recalls-ScotchTM-Thermal-Laminators-…",
  "images": ["https://www.cpsc.gov/s3fs-public/3M1.png"]
}
```

```json
{
  "agency": "FDA",
  "category": "Drugs",
  "recallId": "D-0860-2026",
  "recallDate": "2026-09-30",
  "title": "Sterling Pharmaceutical Services LLC: TRP The Relief Products* Gentle Eyes Lubricant Eye Drops…",
  "hazard": "Lack of Assurance of Sterility",
  "classification": "Class II",
  "firm": "Sterling Pharmaceutical Services LLC",
  "distribution": "USA Nationwide",
  "nationwide": true,
  "quantity": "14538 bottles",
  "codeInfo": "Lot # 3279, Exp 6/30/2027; Lot # 3292, Exp 5/31/2027.",
  "status": "Ongoing",
  "url": "https://www.accessdata.fda.gov/scripts/ires/index.cfm?Event=99712"
}
```

```json
{
  "agency": "NHTSA",
  "recallId": "26V680000",
  "recallDate": "2026-10-16",
  "title": "Seating Power Cord May Have Inadequate Circuit Protection",
  "product": "ELECTRICAL SYSTEM",
  "firm": "Alliance RV, LLC",
  "hazard": "In the event of a short circuit, inadequate protection increases the risk of a fire.",
  "quantity": 3686,
  "remedy": "Dealers will replace the power cord, free of charge…",
  "url": "https://www.nhtsa.gov/recalls?nhtsaId=26V680000"
}
```

The run summary (records per source, unavailable sources, whether the max charge was reached) is saved to the `OUTPUT` record of the key-value store.

### Pricing

Pay per event: **$0.001 per recall saved** ($1 per 1,000) plus a tiny start fee. Use **Max recalls** or a maximum cost per run to cap spend; the Actor stops gracefully at your limit.

| Actor | Sources | Price per record |
|---|---|---|
| **This Actor** | CPSC + FDA food/drug/device + NHTSA | **$0.001** |
| zenolvepro/cpsc-recalls | CPSC | $0.005 |
| carranza-tech/fda-recall-monitor | FDA | $0.003 |
| scrapepilot/fda-nhtsa-recall-monitor | FDA + NHTSA | $0.008 |

(Store prices as of October 2026.)

### Use with AI agents / Apify MCP

Add the Actor to Claude, ChatGPT, Cursor or any MCP client through the [Apify MCP server](https://mcp.apify.com) and ask things like *"Any Class I recalls of peanut products in the last two weeks?"* or *"Has Graco had any car seat recalls this year?"*. Small, typed input and a flat, normalized output make it a cheap, reliable agent tool.

### FAQ

**How fresh is the data?** CPSC and NHTSA publish recalls as they are announced. FDA enforcement reports are published weekly (openFDA updates weekly), so FDA recalls appear with the weekly report date — often a few weeks after the firm's press release.

**Why does the FDA have many records per event?** FDA lists each recalled product separately (`recallId` like `F-1234-2026`); `sourceIds.event_id` groups them into one recall event.

**Do CPSC and NHTSA have classes or states?** No. Those recalls are nationwide and unclassified, so the *Classification* and *States* filters only narrow FDA records.

**Do I need an openFDA key?** No. Keyless openFDA access allows 1,000 requests per day per IP, and a run uses only a few. If you run it very often, add your free key in *openFDA API key*.

**What if one agency's API is down?** The other sources are still saved; the failed source is logged and listed in `OUTPUT.sourceErrors`.

**How do scheduled alerts work?** Enable *Only new recalls* and schedule the Actor (e.g. daily). Each run saves – and charges for – only recalls not returned before under the same *State key*. Connect a webhook, Slack, email or Zapier integration to get notified.

### Data sources and terms

Data comes from official, public US government APIs: CPSC Recalls API (saferproducts.gov), openFDA (api.fda.gov, CC0 / [openFDA terms](https://open.fda.gov/terms/)) and NHTSA Recalls Data on the US DOT data portal (datahub.transportation.gov, public domain). Government works are public domain. This Actor is not affiliated with or endorsed by any of these agencies. openFDA notes: do not rely on openFDA to make decisions regarding medical care. Always confirm with the official recall notice (`url`).

# Actor input Schema

## `agencies` (type: `array`):

Empty = all five sources (CPSC, FDA food, FDA drugs, FDA devices, NHTSA).

## `withinDays` (type: `integer`):

Ignored when *After* is set. FDA dates are the weekly Enforcement Report date; NHTSA the report received date; CPSC the recall announcement date.

## `after` (type: `string`):

YYYY-MM-DD, inclusive.

## `before` (type: `string`):

YYYY-MM-DD, inclusive. Default today.

## `keywords` (type: `array`):

Keep recalls whose title, product, description, hazard or firm contains ANY of these (case-insensitive), e.g. `listeria`, `peanut`, `stroller`, `airbag`, `lithium battery`.

## `firm` (type: `string`):

E.g. `Ford`, `Tyson`, `Walmart`, `Medtronic`.

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

Applies to FDA recalls only; CPSC and NHTSA recalls have no class and are not affected.

## `states` (type: `array`):

Two-letter codes or names, e.g. `CA`, `Texas`. Keeps FDA recalls distributed in these states or nationwide. CPSC/NHTSA recalls are nationwide and not affected.

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

Newest first. 0 = no limit. You pay per recall saved.

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

Skip recalls returned by earlier runs with the same *State key*. Schedule daily for a recall alert feed.

## `stateKey` (type: `string`):

Separate 'already seen' lists for different monitors.

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

Free key from open.fda.gov raises the openFDA limit from 1,000 to 120,000 requests/day. Usually not needed.

## Actor input object example

```json
{
  "withinDays": 14,
  "maxResults": 10,
  "onlyNew": false,
  "stateKey": "default"
}
```

# Actor output Schema

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

No description

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

No description

## `summary` (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 = {
    "withinDays": 14,
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/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 = {
    "withinDays": 14,
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/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 '{
  "withinDays": 14,
  "maxResults": 10
}' |
apify call gazidev/product-recalls-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gazidev/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/NgOyaHROmCitzGYqq/builds/mjVRUcARGmJo5NgTB/openapi.json
