# Product Recalls Feed — FDA, CPSC & NHTSA Recall Alerts (`signalloom/product-recalls-feed`) Actor

Get US product recalls from FDA (food, drugs, medical devices), CPSC (consumer products) and NHTSA (vehicles) in one clean schema. Filter by keyword, brand, category, date and FDA class; new-only mode for recall alerts. $0.003 per recall.

- **URL**: https://apify.com/signalloom/product-recalls-feed.md
- **Developed by:** [Signalloom](https://apify.com/signalloom) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 recall returneds

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 Feed: FDA, CPSC & NHTSA Recall Alerts

One feed for US product recalls, in **one clean schema**, straight from the official government APIs:

- **FDA** enforcement reports: **food**, **drugs** and **medical devices** (openFDA)
- **CPSC** consumer product recalls: toys, furniture, appliances, e-bikes, baby gear… (SaferProducts.gov)
- **NHTSA** vehicle recalls, by model year and make, optionally the model (api.nhtsa.gov)

Filter by **keyword**, **brand or company**, **product category**, **date** and **FDA classification**. Switch on **Only new recalls** and schedule it to get **recall alerts**: each run returns only the recalls that appeared since the last run.

**Price: $0.003 per recall returned** ($3 per 1,000). The prefilled example (all five sources, 50 recalls) finishes in under 15 seconds.

### Use this when…

- you sell or stock products and need a **recall alert** when a brand or supplier you carry is recalled
- you run **compliance, quality or safety** monitoring across food, drugs, devices, consumer products and vehicles
- you want **FDA recalls**, **CPSC recalls** and **NHTSA recalls** in one table instead of three formats
- you track **Class I** (most serious) FDA recalls, or **"park it" / "park outside"** vehicle recalls
- you check a **fleet's vehicles** (by model year and make) for new safety recalls
- you feed recall data into a spreadsheet, a dashboard, Slack or an AI agent

### For AI agents

- **Run** `signalloom/product-recalls-feed` (Apify MCP server `call-actor`, or the Apify API) with input like `{"sources": ["fda-food", "cpsc"], "keywords": ["listeria"], "postedWithinDays": 30, "maxResults": 20}`
- **Returns** one JSON row per recall in the default dataset, newest first: `agency`, `date`, `title`, `productDescription`, `brands`, `reason`, `classification`, `severity`, `remedy`, `url`.
- **Typical cost:** up to 20 recalls = **$0.06** at most ($0.003 per recall).

### How to use it

1. Pick **Sources**: FDA food, FDA drugs, FDA medical devices, CPSC, NHTSA.
2. Optional filters:
   - **Keywords**: `listeria`, `undeclared peanut`, `lithium battery`
   - **Brands or companies**: `Ford`, `Trader Joe`
   - **Product categories**: `toys`, `strollers`, `air bags`
   - **FDA classification**: Class I, II or III
3. Choose the dates: **Posted within the last N days** (default 30), or a **From / To** range.
4. For **NHTSA**, add **Vehicles** as model year plus make, and optionally a model: `2026 Ford` or `2024 Honda Accord`.
5. Click **Start**. Results come newest first.

How the filters combine: terms **within** one filter are OR, and **different** filters are AND. Each record lists the terms it matched in `matchedTerms`.

**Recipe: recall alerts.** Save a task with your brands or keywords, turn on **Only new recalls**, and schedule it daily. The first run returns the newest matches and remembers everything that matches now. After that, each run returns only recalls that are new since the run before.

### Output

One record per recall. Real examples from a run on 2026-11-11, with long text shortened:

```json
{
  "source": "cpsc",
  "agency": "CPSC",
  "recallId": "27064",
  "date": "2026-11-05",
  "title": "Vanderhall North America Recalls All Model Year 2024-2026 Brawley Electric Recreational Off-road Vehicles Due to Injury and Crash Hazards",
  "productDescription": "This recall involves all Model Year 2024-2026 Brawley GTS Electric ROVs. …",
  "productCategory": "Recreational Vehicles (Unlicensed)",
  "brands": ["Vanderhall North America"],
  "companies": ["Vanderhall North America LLC, of Provo, Utah"],
  "reason": "The seat belts in Brawley ROVs can permanently lockup in the fully retracted position. …",
  "classification": null,
  "severity": null,
  "distribution": "Sold At: Vanderhall dealers in Utah, Ohio, Michigan, Texas, Montana, North Carolina, Oklahoma and Arizona from April 2024 to June 2026 for about $50,000.",
  "quantity": "About 190",
  "remedy": "Consumers should stop using the recalled vehicles immediately and contact an authorized Vanderhall dealer to schedule a free repair. …",
  "status": null,
  "url": "https://www.cpsc.gov/Recalls/2027/Vanderhall-North-America-Recalls-All-Model-Year-2024-2026-Brawley-Electric-Recreational-Off-road-Vehicles-Due-to-Injury-and-Crash-Hazards",
  "matchedTerms": [],
  "isNew": true,
  "incidents": "Vanderhall has received 11 reports of the seat belt locking up. No injuries have been reported."
}
```

```json
{
  "source": "fda-food",
  "agency": "FDA",
  "recallId": "H-0175-2027",
  "date": "2026-11-04",
  "title": "Blue Bottle Coffee 4oz Sweet Blossom Simple Syrup in a glass boston round bottle with metal and… (Pink House Alchemy, LLC)",
  "productCategory": "Food",
  "brands": ["Pink House Alchemy, LLC"],
  "companyLocation": "Fayetteville, AR, United States",
  "reason": "Potential contamination with mold (Aspergillus niger)",
  "classification": "Class II",
  "severity": "medium",
  "quantity": "9420 bottles",
  "status": "Ongoing",
  "recallType": "Voluntary: Firm initiated",
  "recallInitiationDate": "2026-09-10",
  "codeInfo": "UPC: 810123980659 Batch information: 4ozBBCSB261051, Expiration Date: 04/15/2028 …",
  "url": "https://www.accessdata.fda.gov/scripts/ires/index.cfm?Event=99961"
}
```

```json
{
  "source": "nhtsa",
  "agency": "NHTSA",
  "recallId": "26V725000",
  "date": "2026-11-02",
  "title": "2026 FORD BRONCO recall: VISIBILITY:WINDSHIELD WIPER/WASHER",
  "productDescription": "Ford Motor Company (Ford) is recalling certain 2026 Bronco vehicles. A wiper arm nut on the driver-side may loosen, causing the windshield wipers to detach.",
  "brands": ["FORD"],
  "companies": ["Ford Motor Company"],
  "reason": "A loss of driver-side wiper function can reduce driver visibility in certain weather conditions, increasing the risk of a crash.",
  "remedy": "Dealers will inspect the wipers, tighten the wiper arm nut, and replace the wiper arms as necessary, free of charge. …",
  "url": "https://www.nhtsa.gov/recalls?nhtsaId=26V725000",
  "affectedVehicles": [{ "make": "FORD", "model": "BRONCO", "modelYear": "2026" }]
}
```

#### Fields

| Field | Meaning |
|---|---|
| `source` | `fda-food`, `fda-drug`, `fda-device`, `cpsc` or `nhtsa` |
| `recallId` | FDA recall number, CPSC recall number or NHTSA campaign number |
| `date` | FDA enforcement report date, CPSC recall date, or NHTSA report date (YYYY-MM-DD) |
| `brands`, `companies` | Recalling firm, brand, manufacturer, importer or vehicle make |
| `reason` | Reason for recall (FDA), hazard (CPSC) or consequence (NHTSA) |
| `classification` | FDA Class I/II/III; NHTSA "Park it: do not drive" or "Park outside: fire risk"; CPSC has none |
| `severity` | `high` (FDA Class I, NHTSA park-it or park-outside), `medium` (Class II), `low` (Class III), else `null` |
| `distribution`, `quantity` | Where it was sold or shipped, and how many units, when the agency publishes it |
| `remedy`, `status` | What to do (CPSC, NHTSA) and the recall status (FDA) |
| `matchedTerms` | Which of your keywords, brands or categories matched |
| `isNew` | `true` if no earlier run with the same filters returned it |

Some fields exist for one source only: `codeInfo`, `recallType` and `recallInitiationDate` (FDA); `incidents`, `upcs` and `imageUrl` (CPSC); `affectedVehicles` and `overTheAirUpdate` (NHTSA).

The run summary, saved as `OUTPUT` in the key-value store, gives per-source counts, timings, any source errors and notes.

### Pricing

- **$0.003 per recall returned** ($3 per 1,000)
- Nothing else is charged: scanning, filtering and recalls that don't match are free.
- In **Only new** mode you pay only for new recalls, so a quiet day costs almost nothing.

### Data sources

| Source | What | Access |
|---|---|---|
| [openFDA](https://open.fda.gov/apis/) food, drug and device enforcement endpoints | Recalls classified by the FDA, updated weekly | Public API; works without a key (240 requests a minute). An optional free openFDA key raises the limits. |
| [CPSC Recalls API](https://www.cpsc.gov/Recalls/CPSC-Recalls-Application-Program-Interface-API-Information) (SaferProducts.gov) | Consumer product recalls | Public REST API, no key |
| [NHTSA Recalls API](https://www.nhtsa.gov/nhtsa-datasets-and-apis) (api.nhtsa.gov) | Vehicle safety recalls by make, model and year | Public API, no key |

All are official, documented US government APIs. Requests are paced per host and back off on errors. **USDA FSIS** meat and poultry recalls aren't included: its website and API currently refuse automated clients, and this Actor doesn't work around access controls.

### Data handling

- Only public government recall data is read. No login, no scraping of web pages.
- **No personal data**: email addresses inside the recall text are removed (the `url` links to the official notice), and street addresses and consumer contact blocks are left out. Company names, cities and countries stay, because they identify the recalling business.

### Limitations

- **NHTSA** has no public "all recent recalls" API, so it is searched by the vehicles you list (up to 60 make, model and year combinations per run). NHTSA doesn't publish unit counts per vehicle in this API, so `quantity` is empty.
- **FDA** dates are the weekly enforcement report date, which is usually a few weeks after the firm started the recall (`recallInitiationDate`). Each FDA category scans at most the newest 10,000 records per run. For older history, narrow the dates.
- Brand matching is text matching. FDA lists the recalling firm, which isn't always the consumer brand, so the product description is searched too.
- `severity` is a simple mapping of each agency's own classes. It isn't a risk assessment.

### FAQ

**How do I get alerts for new FDA or CPSC recalls?**

Pick the sources and filters, turn on **Only new recalls** (`"onlyNew": true`) and schedule the Actor daily. Each run returns only recalls published since the previous run; connect it to email, Slack or a webhook.

**How do I check if a brand has any recalls?**

Put the brand in **Brands** (e.g. `Trader Joe`), set a date range, and run. It searches FDA, CPSC and NHTSA records in one go.

**How do I find recalls for my car?**

Select the NHTSA source and add the vehicle as model year plus make and model, e.g. `2024 Honda Accord`.

**Where does the data come from?**

Official US government sources: openFDA enforcement reports, the CPSC recalls API and NHTSA's recalls API. Every row links to the official recall page.

### Feedback

Want another source or field? Open an issue on the **Issues** tab.

# Actor input Schema

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

Which recall databases to search. FDA = US Food and Drug Administration enforcement reports; CPSC = US Consumer Product Safety Commission; NHTSA = US vehicle recalls (needs the Vehicles field). API values: "fda-food", "fda-drug", "fda-device", "cpsc", "nhtsa".

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

Optional. Keep recalls that mention any of these words in the title, product, reason or hazard, e.g. "listeria", "peanut", "lithium battery". Matching is case-insensitive at the start of a word ("peanut" also finds "peanuts"). Leave empty for all recalls. Example: \["listeria", "lithium battery"].

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

Optional. Keep recalls whose brand, recalling firm, manufacturer, importer or vehicle make mentions any of these names, e.g. "Ford", "Trader Joe". Leave empty for all. Example: \["Ford"].

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

Optional. Keep recalls whose product type or description mentions any of these, e.g. "toys", "strollers", "supplement", "air bags". CPSC has product types, NHTSA has the affected component, FDA has the product description.

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

Model year plus make, optionally a model: "2025 Ford" (all Ford models of 2025 with recalls) or "2024 Honda Accord". Only used when the NHTSA source is selected. Up to 60 make/model/year combinations are checked per run. Example: \["2024 Honda Accord"].

## `postedWithinDays` (type: `integer`):

Only recalls published in the last N days (FDA enforcement report date, CPSC recall date, NHTSA report date). 0 = no date limit. Ignored if a date range is set below. Example: 7.

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

Optional start date, YYYY-MM-DD. Overrides "Posted within the last N days". Example: "2026-10-01".

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

Optional end date, YYYY-MM-DD. Overrides "Posted within the last N days".

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

Optional. Only FDA recalls of these classes: Class I (serious health risk), Class II, Class III (unlikely to cause harm). CPSC and NHTSA recalls have no classes and are not affected.

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

Maximum recalls to return in total, newest first. When the cap is hit, every selected source gets a fair share. Example: 20.

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

Return only recalls that are new since the last run with the same sources and filters. Use it with a schedule for recall alerts. The first run returns the newest matches and remembers all current matches as the starting point.

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

Optional free key from open.fda.gov for higher FDA rate limits. Not needed for normal use.

## Actor input object example

```json
{
  "sources": [
    "fda-food",
    "fda-drug",
    "fda-device",
    "cpsc",
    "nhtsa"
  ],
  "vehicles": [
    "2026 Ford"
  ],
  "postedWithinDays": 30,
  "maxResults": 50,
  "onlyNew": false
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "sources": [
        "fda-food",
        "fda-drug",
        "fda-device",
        "cpsc",
        "nhtsa"
    ],
    "vehicles": [
        "2026 Ford"
    ],
    "postedWithinDays": 30,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalloom/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 = {
    "sources": [
        "fda-food",
        "fda-drug",
        "fda-device",
        "cpsc",
        "nhtsa",
    ],
    "vehicles": ["2026 Ford"],
    "postedWithinDays": 30,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("signalloom/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 '{
  "sources": [
    "fda-food",
    "fda-drug",
    "fda-device",
    "cpsc",
    "nhtsa"
  ],
  "vehicles": [
    "2026 Ford"
  ],
  "postedWithinDays": 30,
  "maxResults": 50
}' |
apify call signalloom/product-recalls-feed --silent --output-dataset

```

## MCP server setup

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