# Product Recalls API: CPSC, NHTSA & FDA Recall Monitor (`lathewright/product-recalls-monitor`) Actor

Returns US product recalls from official sources in one feed: consumer products (CPSC), vehicles (NHTSA) and food, drug and device enforcement reports (openFDA), by keyword and date, with hazard, remedy, units affected and links. No key. For e-commerce and compliance teams.

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

## Pricing

$2.00 / 1,000 recall founds

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 Recalls API: CPSC, NHTSA & FDA Recall Monitor

Monitor US recalls from the CPSC, NHTSA and openFDA in one normalized feed, for e-commerce sellers, retailers, compliance teams and AI agents. It costs $0.002 per recall, so 500 recalls cost $1.

One feed for US product recalls: **consumer products** from the Consumer Product Safety Commission, **vehicles** from NHTSA (by year/make/model or campaign number) and **food, drug and medical-device enforcement reports** from openFDA. Filter by keyword, date and FDA class; every row is normalized with hazard, remedy, units affected, firm, images and the official notice link. Official keyless government APIs.

Built and maintained by **Lathewright**. Lathewright is operated by AI systems under human ownership. A person reviews and approves everything we publish, send and sell. **$0.002 per recall.**

### Who uses it

- **E-commerce sellers and marketplaces**: catch recalls for product categories you sell (`keywords: ["battery", "crib", "bed rail"]`) and pull listings before a customer or regulator does.
- **Compliance and QA teams**: Class I FDA recalls and CPSC hazards delivered daily into Slack or a tracker.
- **Dealers, fleets, insurers**: every open NHTSA campaign for a list of vehicles.
- **AI agents**: "Is there a recall for the 2020 Honda Civic?" or "Which food recalls this month mention Salmonella?" in one tool call.

### Example tasks

Paste any of these into the Input tab, or send the same JSON through the API. Prices are the per-result prices listed under Pricing.

#### 1. Consumer product recalls mentioning battery fires

```json
{
  "sources": ["cpsc"],
  "keywords": ["battery", "fire"],
  "dateFrom": "2026-09-01",
  "maxResultsPerSource": 50
}
```

What comes back: One row per recall with `source`, `recallDate`, `title`, `firm`, `hazard`, `remedy`, `unitsAffected` and `url`. Up to 50 rows, at most $0.10.

#### 2. Class I food recalls mentioning Listeria

```json
{
  "sources": ["fda"],
  "keywords": ["listeria"],
  "fdaProductTypes": ["food"],
  "fdaClassifications": ["Class I"],
  "maxResultsPerSource": 25
}
```

What comes back: FDA enforcement reports with `classification`, `firm` and `distribution`.

#### 3. Open recalls for two vehicles

```json
{
  "sources": ["nhtsa"],
  "vehicles": ["2019 Toyota RAV4", "2020 Honda Civic"]
}
```

What comes back: NHTSA recall campaigns for each year, make and model.

### Input

| Field | Type | Notes |
|---|---|---|
| `sources` | array | `cpsc`, `fda`, `nhtsa` |
| `keywords` | array | Any-match on title, product, hazard, firm (empty = all) |
| `dateFrom`, `dateTo` | YYYY-MM-DD | CPSC recall date / FDA report date window (default: last 30 days) |
| `fdaProductTypes` | array | `food`, `drug`, `device` (default all) |
| `fdaClassifications` | array | `Class I`, `Class II`, `Class III` |
| `fdaApiKey` | secret | Optional free openFDA key (raises the per-IP quota) |
| `vehicles` | array | `YEAR MAKE MODEL`, e.g. `2020 Honda Civic` |
| `campaignNumbers` | array | NHTSA campaign IDs, e.g. `21V215000` |
| `maxResultsPerSource` | integer | Cap per source |

```json
{
  "sources": ["cpsc", "fda", "nhtsa"],
  "keywords": ["battery", "fire"],
  "dateFrom": "2026-10-01",
  "fdaClassifications": ["Class I"],
  "vehicles": ["2020 Honda Civic", "2022 Ford F-150"],
  "maxResultsPerSource": 100
}
```

### Output

```json
{
  "source": "cpsc",
  "recallId": "27024",
  "title": "3M Company Recalls Scotch Thermal Laminators Due to Risk of Serious Injury or Death from Fire Hazard",
  "productType": "Business and Office Machines",
  "products": [{ "name": "Scotch Thermal Laminators", "model": "", "type": "Business and Office Machines", "units": "About 53,634" }],
  "firm": "3M Company, of St. Paul, Minnesota",
  "hazard": "The recalled thermal laminators can overheat, posing fire and burn hazards.",
  "injuries": "The firm has received 63 reports of the laminators smoking, melting and overheating...",
  "remedy": "Refund",
  "unitsAffected": "About 53,634",
  "distribution": "Sold online at Amazon.com from June 2024 through September 2026 for between $44 and $56.",
  "recallDate": "2026-10-15",
  "url": "https://cpsc.gov/Recalls/2027/3M-Company-Recalls-ScotchTM-Thermal-Laminators-Due-to-Risk-of-Serious-Injury-or-Death-from-Fire-Hazard",
  "images": ["https://www.cpsc.gov/s3fs-public/3M1.png"],
  "consumerContact": "3M Company toll-free at 800-772-4337..."
}
```

FDA rows carry `classification` (Class I/II/III), `status`, `distribution`, `recallInitiationDate` and `eventId`; NHTSA rows carry the campaign number as `recallId`, the affected `component` in `classification`, `status` flags such as "PARK OUTSIDE (fire risk)" and `unitsAffected`.

### Pricing

| Event | Price |
|---|---|
| Recall found (`recall`) | $0.002 |

Plus Apify's start fee ($0.00005). Recalls filtered out by your keywords are never charged. 100 recalls = $0.20.

### How to use it

- **Console**: fill in the form, Start, export CSV/JSON.
- **API**: `POST https://api.apify.com/v2/acts/lathewright~product-recalls-monitor/run-sync-get-dataset-items?token=<token>`
- **n8n / Make / Zapier**: Apify node → daily schedule with `dateFrom` = yesterday → alert on new rows (dedupe on `source` + `recallId`).

### Use from an AI agent (MCP)

Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client with `https://mcp.apify.com/?tools=lathewright/product-recalls-monitor`. The Actor description is the tool description, and the input fields above are the tool parameters. Example prompts: "Any Class I food recalls in the last 7 days mentioning Listeria?", "List open recalls for a 2019 Toyota RAV4".

### Data sources and fair use

CPSC Recall REST API (saferproducts.gov), NHTSA Recalls API (api.nhtsa.gov) and openFDA enforcement endpoints (api.fda.gov). All are official, public-domain US government services; openFDA allows 1,000 requests per day per IP without a key (an optional key raises it). The Actor stays at about three requests per second and includes attribution in every row. No personal data is collected; consumer-contact fields are company hotlines.

### FAQ

**Why does an FDA recall show no product images or remedy?** openFDA enforcement reports do not include them; use the `url` for the FDA notice.

**Are Canadian or EU recalls included?** Not yet. Health Canada and the EU Safety Gate are on the roadmap; tell us if you need them.

# Actor input Schema

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

`cpsc` consumer products, `nhtsa` vehicles (needs `vehicles` or `campaignNumbers`), `fda` food/drug/device enforcement reports.

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

Keep recalls whose title, product, hazard or reason contains any of these (case-insensitive). Empty = all recalls in the window.

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

Recall or report date on or after this date. Default: 30 days ago.

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

Default: today.

## `fdaProductTypes` (type: `array`):

Any of `food`, `drug`, `device`. Default: all three.

## `fdaClassifications` (type: `array`):

`Class I` (serious), `Class II`, `Class III`. Empty = all.

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

Free key from open.fda.gov. Without a key openFDA allows 1,000 requests per day per IP, which is plenty for daily monitoring; add a key for heavy use.

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

One per line as `YEAR MAKE MODEL`, e.g. `2020 Honda Civic`, `2022 Ford F-150`. Returns all recall campaigns for each vehicle.

## `campaignNumbers` (type: `array`):

Look up specific campaigns, e.g. `21V215000`.

## `maxResultsPerSource` (type: `integer`):

Cap per source (CPSC, each NHTSA vehicle list, each FDA product type counts toward its source). Each recall is one billable event.

## `compactOutput` (type: `boolean`):

Return only the key fields (smaller, cheaper for AI agents to read).

## Actor input object example

```json
{
  "keywords": [
    "battery",
    "fire"
  ],
  "maxResultsPerSource": 100,
  "compactOutput": false
}
```

# Actor output Schema

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

One row per recall.

# 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 = {
    "keywords": [
        "battery",
        "fire"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lathewright/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 = { "keywords": [
        "battery",
        "fire",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lathewright/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 '{
  "keywords": [
    "battery",
    "fire"
  ]
}' |
apify call lathewright/product-recalls-monitor --silent --output-dataset

```

## MCP server setup

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