# Product Recall Aggregator — FDA, NHTSA & CPSC (`foo121/recall-aggregator`) Actor

Unified US product-recall feed across FDA (food, drug, device), NHTSA (vehicles) and CPSC (consumer products), normalized to one schema. For compliance, insurance, legal and retail monitoring. Pay per result.

- **URL**: https://apify.com/foo121/recall-aggregator.md
- **Developed by:** [ziv shay](https://apify.com/foo121) (community)
- **Categories:** Business
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 result items

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 Recall Aggregator — FDA, NHTSA & CPSC

**Product recall data from all three official US agencies in one normalized feed — an FDA recall scraper, NHTSA vehicle recalls, and CPSC consumer-product recalls merged into a single recall API feed.**

Built for compliance, insurance, legal, and retail/QA monitoring teams who need to watch every US product recall without stitching together three different government feeds. Each agency publishes its own official data in its own shape — this actor pulls FDA (openFDA food/drug/device), NHTSA (vehicles), and CPSC (consumer products), then normalizes and dedupes them into one schema. No API key required; it's the official public recall data, just unified.

If you monitor recalls today you're probably querying openFDA, NHTSA, and CPSC separately and reconciling fields by hand. This does CPSC NHTSA recalls plus FDA in a single run, ready to drop into a dataset or alert pipeline.

### What you get

| Field | Description |
| --- | --- |
| `agency` | Source agency: `FDA`, `NHTSA`, or `CPSC` |
| `category` | Recall category: `food`, `drug`, `device`, `vehicle`, or `product` |
| `title` | Recall title / product description |
| `brand` | Brand or manufacturer name |
| `hazard` | The hazard or reason for the recall |
| `date` | Recall date (ISO 8601) |
| `url` | Link to the official recall notice |
| `remedy` | Recommended remedy / corrective action |

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `categories` | array | `["all"]` | Which categories to pull. Use `"all"` or a subset of `food`, `drug`, `device`, `vehicle`, `product` |
| `daysBack` | integer | `90` | Only return recalls issued within the last N days |
| `maxItems` | integer | `500` | Maximum number of recalls to return |

#### Example input

```json
{
  "categories": ["food", "drug", "vehicle"],
  "daysBack": 30,
  "maxItems": 200
}
```

### Example run output

```json
{
  "agency": "FDA",
  "category": "food",
  "title": "Listeria Risk in Pre-Cut Cantaloupe Trays",
  "brand": "FreshFields Produce",
  "hazard": "Potential Listeria monocytogenes contamination",
  "date": "2026-06-12",
  "url": "https://www.fda.gov/safety/recalls-market-withdrawals-safety-alerts/freshfields-cantaloupe",
  "remedy": "Do not consume. Return to place of purchase for a full refund."
}
```

### Use cases

- **Compliance teams** monitoring whether any recalled product touches their supply chain across food, drug, device, and consumer goods.
- **Insurance underwriters and claims teams** tracking vehicle and product recalls tied to liability exposure.
- **Legal / litigation researchers** building recall timelines for product-liability matters.
- **Retail and QA monitoring teams** pulling a single daily feed of all US recalls instead of three separate agency checks.

### Why this vs single-agency feeds

The wedge is the **unified schema**. Most tools and feeds give you one agency at a time, in different shapes — openFDA looks nothing like the NHTSA recalls API, which looks nothing like CPSC. This actor merges FDA + NHTSA + CPSC into one normalized, deduped dataset so you monitor all US recalls in a single run. It's the official public recall data — the value is that it's consolidated, not exclusive.

### Pricing

Pay per result — you're billed only for the recall records returned, no subscription.

### Keywords

product recall data, FDA recall scraper, recall API feed, CPSC NHTSA recalls, FDA NHTSA CPSC recalls, openFDA recall scraper, vehicle recall data, consumer product recall feed, food recall API, drug recall data

# Actor input Schema

## `categories` (type: `array`):

Which recall categories to fetch. Use "all" for everything. Subset of: food, drug, device, vehicle, product.

## `daysBack` (type: `integer`):

Only include recalls reported within this many days of today.

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

Maximum number of normalized recall records to output.

## Actor input object example

```json
{
  "categories": [
    "all"
  ],
  "daysBack": 90,
  "maxItems": 500
}
```

# 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("foo121/recall-aggregator").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("foo121/recall-aggregator").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 foo121/recall-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,foo121/recall-aggregator"
        }
    }
}
```

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/4758pdQoaIr5hXIp9/builds/jhPVKdMi6L8F5YTp6/openapi.json
