# US Product Recalls Feed (FDA, NHTSA, CPSC in one schema) (`moment-data/product-recalls-feed`) Actor

One unified feed of US product recalls from official sources: FDA food, drug and device enforcement reports, NHTSA vehicle recalls and CPSC consumer product recalls. Keyword filter and 'new since last run' mode for daily alerts.

- **URL**: https://apify.com/moment-data/product-recalls-feed.md
- **Developed by:** [Luke Miller](https://apify.com/moment-data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 recall records

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 Feed: FDA, NHTSA & CPSC Recalls in One Schema

Track **every new US product recall** from the official government sources in a single, clean dataset: **FDA food, drug and medical device recalls** (openFDA enforcement reports), **NHTSA vehicle and equipment recalls**, and **CPSC consumer product recalls**. Filter by keyword (an allergen, a brand, a retailer, a hazard) and schedule it daily in *new since last run* mode to get a recall alert feed that only bills you for recalls you have not seen.

### Who it is for

- **Compliance and quality teams**: watch for recalls in your category, of your suppliers or of competing products; FDA Class I/II/III classification included.
- **Retailers, marketplaces and distributors**: catch recalled products you may stock (CPSC "Sold At" retailers, FDA distribution states, UPCs in product descriptions).
- **Insurers, product-liability and claims teams**: hazard, units affected and remedy for each recall; NHTSA "do not drive" and "park outside" flags.
- **Journalists, newsletters and researchers**: one daily feed of food, drug, device, vehicle and consumer product recalls with links to the official notice.
- **Developers**: a normalized JSON/CSV/Excel feed via the Apify API, webhooks and integrations (Slack, Google Sheets, Zapier, Make).

### What you get

- **Five official sources, one schema**: `fda-food`, `fda-drug`, `fda-device`, `nhtsa`, `cpsc`.
- **Normalized fields**: source, agency, recallId, dateReported, productDescription, productType, firm (recalling firm / manufacturer / importer), reason, hazard, classification, status, distribution, firmState, quantity, remedy, url, plus the original record in `raw`.
- **Keyword filter** across product, firm and reason (e.g. `listeria`, `undeclared peanut`, `lithium battery`, `air bag`, `Costco`).
- **New since last run** mode with a saved history per *State key*, for daily alerts without duplicates.
- **Resilient**: if one agency's API is down, the run logs it and continues with the others (see `failedSources` in the run summary).
- **Fast and cheap**: a default run takes a few seconds at 512 MB.

### Quick start

1. Click **Start** with the default input. You get the 30 newest recalls from all five sources over the last 30 days, mixed across sources.
2. Narrow it down: pick `sources`, set a `keyword`, and raise `maxItems` for a bigger pull (up to 5,000).
3. **Daily recall alerts (schedule tip):** create an Apify **Schedule** (for example every day at 7:00) with this input:

```json
{ "mode": "sinceLastRun", "stateKey": "daily-all", "lookbackDays": 14, "maxItems": 500 }
```

Each run delivers only recalls not delivered before for that `stateKey`. Add a webhook or the Slack / Google Sheets / email integration to push them where your team works. Use a different `stateKey` per schedule (e.g. `allergens`, `my-brands`).

### Input

| Field | Default | Meaning |
|---|---|---|
| `sources` | all five | `fda-food`, `fda-drug`, `fda-device`, `nhtsa`, `cpsc` |
| `lookbackDays` | 30 | Recalls reported in the last N days (1-365). FDA publishes weekly, so use 7 or more |
| `keyword` | none | Only recalls whose product, firm or reason mentions this word or phrase |
| `maxItems` | 30 | Cap per run (also caps your spend), newest first |
| `mode` | `window` | `window` = everything in the window; `sinceLastRun` = only new recalls (**use for schedules**) |
| `stateKey` | `default` | Saved history name for `sinceLastRun` |
| `openFdaApiKey` | none | Optional free openFDA key for very large pulls |

### Output (real records, Oct 2026)

FDA food recall:

```json
{
  "source": "fda-food",
  "agency": "FDA",
  "recallId": "H-0094-2027",
  "eventId": "100041",
  "dateReported": "2026-10-21",
  "recallInitiationDate": "2026-10-02",
  "productDescription": "Stewarts Shops Vanilla Heavenly Medley 1/2 Gallon (1.89 L), UPC Codes: 0 82086 44371 1",
  "productType": "Food",
  "firm": "Stewart's Shops Corp.",
  "reason": "Foreign object: May contain pieces of metal",
  "hazard": null,
  "classification": "Class II",
  "status": "Ongoing",
  "distribution": "NY, VT, NH",
  "firmState": "NY",
  "firmCountry": "United States",
  "quantity": "10,392 units",
  "remedy": null,
  "voluntaryMandated": "Voluntary: Firm initiated",
  "url": "https://api.fda.gov/food/enforcement.json?search=recall_number:%22H-0094-2027%22",
  "raw": {
    "recall_number": "H-0094-2027",
    "event_id": "100041",
    "report_date": "20261021",
    "classification": "Class II",
    "status": "Ongoing",
    "...": "full openFDA record"
  },
  "firstSeenAt": "2026-10-30T10:58:52.811Z"
}
```

CPSC consumer product recall (`raw` shortened):

```json
{
  "source": "cpsc",
  "agency": "CPSC",
  "recallId": "27054",
  "eventId": "11038",
  "dateReported": "2026-10-29",
  "recallInitiationDate": null,
  "productDescription": "DREO Recalls DR-HSH015 Space Heaters Due to Fire and Burn Hazards - This recall involves DREO space heaters, model number DR-HSH015. The ceramic, electric heaters are black and measure about 11.5 inches wide and 13 inches tall and include a remote control. Only units manufactured from April 2025 through January 2026 are included in this recall. The manufacture date, in YYYY/MM format, and the model number are printed on a label on the heater’s underside and “DREO” on the front of the unit.",
  "productType": "Electric Space Heaters,not Otherwise Specified",
  "firm": "Hesung Innovation Corp, dba DREO, of Clifton, New Jerse",
  "reason": "The recalled space heaters can overheat and ignite, posing fire and burn hazards.",
  "hazard": "The recalled space heaters can overheat and ignite, posing fire and burn hazards.",
  "classification": null,
  "status": null,
  "distribution": "Sold At: Costco stores nationwide and online at Dreo.com, BestBuy.com, Kohls.com, Lowes.com, QVC.com, HomeDepot.com, B2BRenew.com and Costco.com from September 2025 through October 2026 for between $70 and $110.",
  "firmState": null,
  "firmCountry": "Vietnam",
  "quantity": "About 338,800 (In addition, about 36,300 were sold in Canada)",
  "remedy": "Consumers should stop using the recalled space heaters immediately and contact DREO for a free replacement space heater. Consumers will be asked to unplug the space heater, destroy it by cutting the electrical cord and follow instructions to send a photo of the destroyed heater.",
  "url": "https://cpsc.gov/Recalls/2027/DREO-Recalls-DR-HSH015-Space-Heaters-Due-to-Fire-and-Burn-Hazards",
  "raw": {
    "RecallID": 11038,
    "RecallNumber": "27054",
    "RecallDate": "2026-10-29T00:00:00",
    "Title": "DREO Recalls DR-HSH015 Space Heaters Due to Fire and Burn Hazards",
    "URL": "https://cpsc.gov/Recalls/2027/DREO-Recalls-DR-HSH015-Space-Heaters-Due-to-Fire-and-Burn-Hazards"
  },
  "firstSeenAt": "2026-10-30T10:58:52.811Z"
}
```

NHTSA records also carry `doNotDrive` and `parkOutside` flags. Full examples: `sample-output.json`. Every run also writes a summary (window, per-source counts, failed sources) to the `OUTPUT` record.

### Field notes

- `dateReported`: FDA enforcement report date, NHTSA report received date, CPSC recall date.
- `classification`: FDA Class I (most serious) / II / III; NHTSA recall type and component; CPSC has none.
- `distribution`: FDA distribution pattern (states/countries); CPSC "Sold At" retailers and dates.
- `recallId`: FDA recall number (e.g. `H-0094-2027`), NHTSA campaign ID (e.g. `26V710000`), CPSC recall number.

### Data sources, update timing and fair use

- **openFDA** food, drug and device enforcement endpoints (`api.fda.gov`), public domain / CC0 ([license](https://open.fda.gov/license/)). FDA enforcement reports are published **weekly**, so FDA items can lag the original company announcement by 1-3 weeks.
- **NHTSA** vehicle and equipment recalls from NHTSA's official *Recalls Data* open dataset on `data.transportation.gov` (U.S. DOT, public domain), updated on business days.
- **CPSC** recalls from the SaferProducts.gov **Recall REST API** (`saferproducts.gov/RestWebServices`), updated as recalls are announced.
- Polite access: a declared User-Agent, spaced requests per host, retries with backoff. No API keys required.
- Entity-level data only. Free-text consumer contact blocks and street addresses are dropped; no personal data is collected.
- Not affiliated with or endorsed by FDA, NHTSA or CPSC. Data is provided as published by the agencies; always confirm critical decisions against the official notice linked in `url`.

### Pricing

Pay per event (Apify takes care of billing; you only pay for what is delivered):

| Event | Price | Charged |
|---|---|---|
| `apify-actor-start` | $0.005 | once per run |
| `recall-record` | $0.004 | per recall delivered |

A default test run (30 recalls) costs about $0.125. A daily `sinceLastRun` alert across FDA, NHTSA and CPSC (~15 new recalls/day) costs about $0.065/day. `maxItems` and Apify's *max cost per run* cap your spend; the Actor stops delivering when your budget is reached, so you are never charged for more than you set. No separate platform-usage charges: compute is included in the event prices.

### FAQ

**Which agencies are covered?** FDA (food, drugs, devices via openFDA enforcement reports), NHTSA (vehicle and equipment recalls) and CPSC (consumer products), in one schema.

**Do I need API keys?** No. All sources are public and keyless.

**How do I get only new recalls every day?** Create a Schedule with `mode: sinceLastRun` and a unique `stateKey`; each run delivers only recalls not delivered before.

**Can I send alerts to Slack or email?** Yes, use Apify integrations (Slack, email, webhooks) on run success, or pull the dataset from Make, Zapier or n8n.

# Actor input Schema

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

Which official recall sources to include. Default: all five.

## `lookbackDays` (type: `integer`):

Recalls reported in the last N days. FDA enforcement reports are published weekly, so keep this at 7 or more.

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

Optional. Only recalls whose product, firm or reason mentions this word or phrase, e.g. 'listeria', 'peanut', 'airbag', 'Costco', 'lithium battery'.

## `maxItems` (type: `integer`):

Hard cap on delivered recalls (also caps your spend). Newest first, mixed across sources.

## `mode` (type: `string`):

window (default): everything in the lookback window, no saved state. sinceLastRun: only recalls not delivered before for this State key; use this for daily schedules and alerts.

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

Name of the saved feed for sinceLastRun mode. Use one key per schedule.

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

Optional free key from open.fda.gov for higher openFDA rate limits on very large pulls. Not needed for normal use.

## Actor input object example

```json
{
  "sources": [
    "fda-food",
    "fda-drug",
    "fda-device",
    "nhtsa",
    "cpsc"
  ],
  "lookbackDays": 30,
  "maxItems": 30,
  "mode": "window",
  "stateKey": "default"
}
```

# Actor output Schema

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

One normalized record per recall.

## `summary` (type: `string`):

Window, per-source counts, failed sources.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("moment-data/product-recalls-feed").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("moment-data/product-recalls-feed").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 '{}' |
apify call moment-data/product-recalls-feed --silent --output-dataset

```

## MCP server setup

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

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/ipiQ1wGPDNw0WIQWR/builds/SMyqleoRufJp9gME8/openapi.json
