# FDA Recalls - Drug, Device and Food Enforcement (`loopchips/fda-recalls`) Actor

Every drug, medical device and food recall the FDA has published, as clean rows. Filter by hazard class, firm, state, date or keyword. Class I recalls - the ones that can kill - are flagged and sortable. No API key needed.

- **URL**: https://apify.com/loopchips/fda-recalls.md
- **Developed by:** [Loopchips](https://apify.com/loopchips) (community)
- **Categories:** Automation, Lead generation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 recalls

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

## FDA Recalls - Drug, Device and Food Enforcement

Every drug, medical device and food recall the FDA has published, as clean rows.

When a product is pulled from the US market the FDA records why, who made it,
what the hazard class is and how far it was distributed. This Actor turns that
enforcement database into a table you can filter, monitor and join against your
own catalogue.

**No API key needed.** It works out of the box.

### What you get

| Field | Description |
|---|---|
| `classification` / `classificationLevel` | Class I, II or III, plus a number so you can sort by severity |
| `recallingFirm` | The company that issued the recall |
| `productDescription` | What was recalled, including size and packaging |
| `reasonForRecall` | Why, in the FDA's own words |
| `status` / `isOngoing` | Whether the recall is still open |
| `recallInitiatedOn` / `terminatedOn` / `daysOpen` | Timeline of the recall |
| `distributionPattern` | How widely it shipped, from one state to nationwide |
| `voluntaryOrMandated` | Whether the FDA had to force it |
| `city` / `state` / `country` / `address` | Where the firm is |
| `codeInfo` | Lot numbers and expiry codes for matching your own stock |
| `brandName` / `genericName` / `manufacturerName` / `substanceName` / `productNdc` | Drug identifiers, where the FDA has linked them |

### Hazard classes, in plain terms

| Class | What it means |
|---|---|
| **Class I** | Reasonable probability of serious injury or death |
| **Class II** | Temporary or medically reversible harm |
| **Class III** | Unlikely to cause harm, but violates FDA rules |

`classificationLevel` is 1, 2 or 3, so sorting ascending puts the dangerous
recalls at the top.

### Example input

Every ongoing Class I recall this year, across all three databases:

```json
{
  "categories": ["drug", "device", "food"],
  "classifications": ["Class I"],
  "onlyOngoing": true,
  "startDate": "2026",
  "endDate": "2026"
}
```

Watch one company:

```json
{
  "categories": ["device"],
  "firmName": "Abbott",
  "startDate": "2020"
}
```

Watch one hazard:

```json
{
  "categories": ["food"],
  "searchTerm": "undeclared peanut",
  "startDate": "2024"
}
```

### Example output

```json
{
  "category": "device",
  "recallNumber": "Z-2372-2023",
  "classification": "Class I",
  "classificationLevel": 1,
  "status": "Ongoing",
  "isOngoing": true,
  "recallingFirm": "Medtronic Inc.",
  "productDescription": "MAHURKAR 12 Fr High Pressure Triple Lumen Acute Dialysis Catheter",
  "reasonForRecall": "Catheter center lumen was found to have an occlusion in the tip",
  "recallInitiatedOn": "2023-05-18",
  "distributionPattern": "Nationwide",
  "voluntaryOrMandated": "Voluntary: Firm initiated",
  "state": "MN",
  "country": "United States"
}
```

### What people use it for

- **Supplier monitoring** - match `recallingFirm` and `codeInfo` against what you
  actually stock
- **Competitive intelligence** - recall history by manufacturer over time
- **Insurance and legal** - Class I history for a product line or a company
- **Newsrooms** - a filtered feed of serious recalls as they are classified
- **Health apps** - warn users about drugs and devices they have on file

### Notes

- The FDA answers an empty result set with a 404. That is treated as "no
  matches", not as an error.
- openFDA will not page beyond 25,000 results in a single query, so wide pulls
  are split year by year automatically. If one year still exceeds that in a
  single category, the Actor says so rather than silently truncating.
- Drug identifiers such as `brandName` and `productNdc` come from the FDA's own
  linking, which is present on roughly a fifth of drug recalls and empty on the
  rest. They are left blank rather than guessed at.
- The optional API key is only worth setting if you are pulling many years at
  once. Without one, requests share a per-address daily allowance.
- Source: U.S. Food and Drug Administration, via openFDA. The FDA does not
  endorse any product or company, and this data must not be used to make
  clinical decisions.

### Pricing

Pay per result. You are charged only for recalls actually returned.

# Actor input Schema

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

Which FDA enforcement databases to pull from.

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

Class I means a reasonable probability of serious harm or death, Class II temporary or reversible harm, Class III unlikely harm. Leave empty for all.

## `searchTerm` (type: `string`):

Matched against the recall reason and the product description, for example salmonella or undeclared milk.

## `firmName` (type: `string`):

Limit to one company, for example Abbott. Matched against the recalling firm name.

## `states` (type: `array`):

Two-letter state codes of the recalling firm, for example CA or NJ. Leave empty for all.

## `startDate` (type: `string`):

Year the recall started, for example 2024. Defaults to two years ago.

## `endDate` (type: `string`):

Year the recall started, for example 2026. Defaults to the current year.

## `onlyOngoing` (type: `boolean`):

Keep only recalls that have not been terminated, which is what monitoring usually cares about.

## `maxResultsPerCategory` (type: `integer`):

Upper bound on rows collected from each of drug, device and food.

## `apiKey` (type: `string`):

Not required. A free key from open.fda.gov raises the daily request allowance if you are pulling very large ranges.

## `requestDelayMs` (type: `integer`):

Pause between requests so the source is not hit too quickly.

## Actor input object example

```json
{
  "categories": [
    "drug",
    "device",
    "food"
  ],
  "classifications": [],
  "states": [],
  "onlyOngoing": false,
  "maxResultsPerCategory": 1000,
  "requestDelayMs": 300
}
```

# Actor output Schema

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

Every matching recall with hazard class, firm, product and reason.

# 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 = {
    "categories": [
        "drug",
        "device",
        "food"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("loopchips/fda-recalls").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 = { "categories": [
        "drug",
        "device",
        "food",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("loopchips/fda-recalls").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 '{
  "categories": [
    "drug",
    "device",
    "food"
  ]
}' |
apify call loopchips/fda-recalls --silent --output-dataset

```

## MCP server setup

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

```

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/77BVTDfJMo6KqQZQE/builds/5pqemLBP2HLlY63U5/openapi.json
