# Product Recall Monitor - CPSC, FDA & NHTSA (`dabomb1177/recall-monitor-cpsc-fda-nhtsa`) Actor

Monitor US product, food, drug, device & vehicle recalls from CPSC, openFDA and NHTSA in one run. Filter by brand, UPC and date; deduped, normalized output.

- **URL**: https://apify.com/dabomb1177/recall-monitor-cpsc-fda-nhtsa.md
- **Developed by:** [Mazen Khalil](https://apify.com/dabomb1177) (community)
- **Categories:** Business, E-commerce
- **Stats:** 2 total users, 1 monthly users, 40.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Product Recall Monitor — CPSC, FDA & NHTSA

**Monitor US product, food, drug, medical device and vehicle recalls from three government agencies in a single run.** This actor queries the **CPSC** (Consumer Product Safety Commission), **openFDA** (food, drug and device enforcement), and **NHTSA** (vehicle safety) recall APIs, normalizes every notice into **one clean schema**, removes duplicates, and lets you filter by **brand/company name**, **UPC**, and a **"since" date** so you only see what's new. All data comes from **public, official government APIs** — no logins, no scraping, no proxies.

Stop babysitting three separate government feeds. Point this actor at the brands in your catalog or portfolio and get a single, deduped recall list you can schedule, export, or wire into Slack, a sheet, or your own system.

### Why use the Product Recall Monitor?

- **One feed instead of three.** CPSC, FDA and NHTSA each publish recalls in different formats. This actor merges them into a single normalized table.
- **Brand & UPC matching.** Fuzzy company-name matching handles `Inc.`, `LLC`, punctuation and minor spelling differences, so "Fisher Price" matches "Fisher-Price, Inc." Filter by UPC to catch a specific SKU.
- **"Since last run" delta mode.** Set `sinceDate` to your last check and get only new recalls — perfect for a scheduled compliance monitor.
- **Deduplicated.** Notices that overlap across agencies or repeat within a feed collapse into one record, with the other agencies listed under `alsoReportedBy`.
- **Built for compliance & risk teams.** Retailers, marketplace sellers, product-liability firms and insurance underwriters can watch their catalog or portfolio without manual API work.

Run it on the **Apify platform** to get scheduling, a REST API, webhooks, and integrations (Slack, Zapier, Make, Google Sheets) for free.

### How to use the recall monitor

1. Click **Try for free** / **Start**.
2. In the **Input** tab, add the **brands or companies** you want to watch (e.g. `Peloton`, `Fisher-Price`). Leave it empty to get *every* recall in the window.
3. Pick which **agencies** to query. For **NHTSA**, add one or more **vehicles** (`make` + `modelYear`, and optionally `model`).
4. Set **Since date** to how far back you want to look (or use **Lookback days**).
5. Click **Save & Run**. When it finishes, open the **Output** tab or export the dataset as **JSON, CSV, Excel or HTML**.

To turn it into a monitor, open the **Schedule** tab, run it daily/weekly, and set `sinceDate` to only surface new recalls.

### Input

| Field | Type | Description |
|---|---|---|
| `agencies` | array | Which sources to query: `CPSC`, `FDA`, `NHTSA`. Default: all three. |
| `brands` | array | Brand/company names to fuzzy-match (CPSC & FDA). Empty = no brand filter. |
| `upcs` | array | UPC/EAN codes to match against product codes (CPSC & FDA). |
| `vehicles` | array | NHTSA vehicles, e.g. `{"make":"Honda","modelYear":2020}` or with a `model`. |
| `fdaCategories` | array | openFDA datasets: `food`, `drug`, `device`. |
| `sinceDate` | string | Only recalls on/after this date (`YYYY-MM-DD`). The delta filter. |
| `untilDate` | string | Only recalls on/before this date. |
| `lookbackDays` | integer | Used when `sinceDate` is empty. Default `90`. |
| `matchThresholdPercent` | integer | Fuzzy-match strictness `0–100`. Default `82`. |
| `dedupe` | boolean | Collapse duplicate notices. Default `true`. |
| `maxItems` | integer | Max records returned, newest first. Default `200`. |

See the **Input** tab for the full, documented form.

### Output

Every recall becomes a flat, consistent record. Example (trimmed):

```json
{
  "source": "CPSC",
  "sourceCategory": "consumer-product",
  "recallId": "CPSC-24172",
  "recallNumber": "24172",
  "title": "Good Earth Lighting Recalls Rechargeable Lights Due to Fire and Burn Hazards",
  "description": "The recalled rechargeable lights can overheat, posing fire and burn hazards.",
  "hazard": "Fire; Burn",
  "remedy": "Consumers should immediately stop using the recalled lights.",
  "classification": null,
  "status": null,
  "recallDate": "2024-06-06",
  "company": "Good Earth Lighting Inc., of Mount Prospect, Illinois",
  "companies": ["Good Earth Lighting Inc., of Mount Prospect, Illinois"],
  "brandMatched": "Good Earth Lighting",
  "productNames": ["Good Earth Rechargeable Integrated Lights"],
  "upcs": [],
  "distribution": "Hardware and home improvement stores nationwide, and online",
  "url": "https://www.cpsc.gov/Recalls/2024/...",
  "alsoReportedBy": [],
  "fetchedAt": "2026-07-25T00:00:00.000Z"
}
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

#### Data fields

| Field | Meaning |
|---|---|
| `source` | `CPSC`, `FDA` or `NHTSA` |
| `sourceCategory` | `consumer-product`, `food`, `drug`, `device` or `vehicle` |
| `recallId` / `recallNumber` | Agency-canonical identifiers |
| `title` / `description` | Human-readable summary of the recall |
| `hazard` / `remedy` | What's wrong and what to do |
| `classification` | FDA class (I/II/III) or NHTSA component |
| `status` | e.g. FDA `Ongoing`/`Terminated`, or NHTSA `DO NOT DRIVE` |
| `recallDate` | ISO date the recall was reported |
| `company` / `companies` | Firm(s) responsible |
| `brandMatched` | Which of your brand queries matched |
| `productNames` / `upcs` | Affected products and codes |
| `alsoReportedBy` | Other agencies that reported the same notice |
| `url` | Link to the official recall notice |

### How much does it cost to monitor recalls?

The actor calls lightweight JSON APIs, so runs are fast and cheap — a typical brand-filtered monitor over a recent window costs only a few Apify compute-unit cents. Cost scales with how many records you scan (wide date windows and many FDA categories cost more). Use `sinceDate`, `maxItems`, and `maxFdaScanPerCategory` to keep runs tight.

### Tips & advanced options

- **Delta monitoring:** schedule daily and set `sinceDate` to yesterday to only get new recalls.
- **Rare brands over long windows:** raise `maxFdaScanPerCategory` so the scan reaches older records.
- **Vehicles without a model:** omit `model` to auto-check every model with recalls for that make/year (capped by `maxNhtsaModelsPerQuery`).
- **Looser/stricter matching:** lower `matchThresholdPercent` to catch more name variants, raise it to reduce false positives.

### FAQ, disclaimers & support

**Is this legal?** Yes. CPSC, openFDA and NHTSA publish these recalls as open government data. This actor only reads official public APIs — no authentication, no scraping behind logins, no personal data.

**How fresh is the data?** As fresh as the agencies publish it. openFDA updates enforcement reports on a rolling basis; CPSC and NHTSA update as notices are issued.

**Why is NHTSA empty?** NHTSA is keyed by vehicle. You must add `vehicles` (make + modelYear) for it to return anything.

**Rate limits?** openFDA allows generous anonymous access; add an `fdaApiKey` for higher limits on very large runs.

**Accuracy disclaimer:** Recall data is provided by third-party government sources and may be incomplete or delayed. Always confirm against the official agency notice (linked in `url`) before acting.

Found a bug or need another source (e.g. USDA/FSIS, Health Canada)? Open an issue on the **Issues** tab — feedback is welcome, and custom versions are available.

#### Related actors

- [Web Scraper](https://apify.com/apify/web-scraper) — general-purpose scraping when you need a custom source.
- [Google Sheets Import/Export](https://apify.com/lukaskrivka/google-sheets) — push recall results straight into a spreadsheet.
- [Send Slack Message](https://apify.com/katerinahronik/slack-message) — get recall alerts in Slack.

#### Useful links

- [openFDA enforcement API](https://open.fda.gov/apis/) · [CPSC Recalls API](https://www.cpsc.gov/Recalls/CPSC-Recalls-Application-Program-Interface-API) · [NHTSA Recalls API](https://www.nhtsa.gov/nhtsa-datasets-and-apis)

### Changelog

#### 0.1

- Initial release: CPSC + openFDA (food/drug/device) + NHTSA in one run, normalized schema, cross-source dedup, fuzzy brand matching, UPC filter, and `sinceDate` delta mode.

# Actor input Schema

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

Which government recall sources to pull from. Allowed values: CPSC (consumer products), FDA (food/drug/device via openFDA), NHTSA (vehicles). NHTSA also requires the Vehicles field below.

## `brands` (type: `array`):

Filter recalls to these brands or companies using fuzzy matching (handles 'Inc.', 'LLC', punctuation and minor spelling differences). Matches against company, product and title fields. Leave empty to return every recall in the date window. Applies to CPSC and FDA.

## `upcs` (type: `array`):

Filter to recalls whose product codes contain any of these UPC/EAN numbers (11–14 digits). Applies to CPSC and FDA. Leave empty to skip UPC filtering.

## `vehicles` (type: `array`):

NHTSA is keyed by vehicle. Provide objects like {"make":"Honda","modelYear":2020} or {"make":"Honda","model":"Accord","modelYear":2020}. If "model" is omitted, every model with recalls for that make/year is checked. Ignored unless NHTSA is in Agencies.

## `fdaCategories` (type: `array`):

Which openFDA enforcement datasets to query. Allowed values: food, drug, device.

## `sinceDate` (type: `string`):

Only return recalls reported on or after this date (YYYY-MM-DD). Set this to the timestamp of your last run to get just the new recalls. Overrides 'Lookback days'.

## `untilDate` (type: `string`):

Only return recalls reported on or before this date (YYYY-MM-DD). Leave empty for 'up to now'.

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

If no 'Since date' is set, look back this many days from today.

## `dedupe` (type: `boolean`):

Collapse duplicate notices (same recall id, shared UPC, or same company+date) into one record, noting the other agencies in 'alsoReportedBy'.

## `matchThresholdPercent` (type: `integer`):

How similar a brand name must be to count as a match (0–100). Higher = stricter. 82 is a good default.

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

Maximum number of recall records to return (newest first).

## `maxFdaScanPerCategory` (type: `integer`):

Safety cap on how many openFDA enforcement reports are scanned per category before brand filtering. Raise for rare brands over long windows.

## `maxNhtsaModelsPerQuery` (type: `integer`):

When a vehicle entry omits 'model', cap how many models (that have recalls) are checked for that make/year.

## `fdaApiKey` (type: `string`):

Optional openFDA API key for higher rate limits. Not required for typical runs.

## `includeRawRecord` (type: `boolean`):

Attach each source agency's original unmodified record under a 'raw' field.

## Actor input object example

```json
{
  "agencies": [
    "CPSC",
    "FDA",
    "NHTSA"
  ],
  "brands": [
    "Peloton",
    "Fisher-Price"
  ],
  "upcs": [],
  "vehicles": [
    {
      "make": "Honda",
      "model": "Accord",
      "modelYear": 2020
    }
  ],
  "fdaCategories": [
    "food",
    "drug",
    "device"
  ],
  "lookbackDays": 90,
  "dedupe": true,
  "matchThresholdPercent": 82,
  "maxItems": 200,
  "maxFdaScanPerCategory": 1000,
  "maxNhtsaModelsPerQuery": 20,
  "includeRawRecord": false
}
```

# 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 = {
    "agencies": [
        "CPSC",
        "FDA",
        "NHTSA"
    ],
    "brands": [
        "Peloton",
        "Fisher-Price"
    ],
    "vehicles": [
        {
            "make": "Honda",
            "model": "Accord",
            "modelYear": 2020
        }
    ],
    "fdaCategories": [
        "food",
        "drug",
        "device"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dabomb1177/recall-monitor-cpsc-fda-nhtsa").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 = {
    "agencies": [
        "CPSC",
        "FDA",
        "NHTSA",
    ],
    "brands": [
        "Peloton",
        "Fisher-Price",
    ],
    "vehicles": [{
            "make": "Honda",
            "model": "Accord",
            "modelYear": 2020,
        }],
    "fdaCategories": [
        "food",
        "drug",
        "device",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("dabomb1177/recall-monitor-cpsc-fda-nhtsa").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "agencies": [
    "CPSC",
    "FDA",
    "NHTSA"
  ],
  "brands": [
    "Peloton",
    "Fisher-Price"
  ],
  "vehicles": [
    {
      "make": "Honda",
      "model": "Accord",
      "modelYear": 2020
    }
  ],
  "fdaCategories": [
    "food",
    "drug",
    "device"
  ]
}' |
apify call dabomb1177/recall-monitor-cpsc-fda-nhtsa --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dabomb1177/recall-monitor-cpsc-fda-nhtsa",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/z70wA0ynwkQiPY7Ml/builds/BHQc3VTl474IWoHct/openapi.json
