# FDA Recalls and Enforcement Reports Tracker (`transparent_meteorite/fda-recalls-enforcement-reports`) Actor

Track FDA drug, medical device and food recalls from the free openFDA enforcement API: recall number, product, recalling firm, class I/II/III, status, reason, dates, distribution and a severity score. No login, no proxy.

- **URL**: https://apify.com/transparent_meteorite/fda-recalls-enforcement-reports.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.93 / 1,000 recall rows

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

## FDA Recalls and Enforcement Reports Tracker: Drug, Device and Food Recalls

**FDA recalls** for drugs, medical devices and food from the official openFDA enforcement API, merged into one newest-first table: recall number, product, recalling firm, class I, II or III, status, reason, dates and a severity score.

**This Actor vs benthepythondev/fda-recall-intelligence:** both read openFDA for drugs, devices and food and score each recall 0-100. Choose this one for an ongoing-only filter, a keyword filter on the reason and product text, and an openFDA link to every exact record.

Pull the latest FDA recalls for drugs, medical devices and food into a clean table. Each row has the recall number, product, recalling firm, location, FDA class (I, II or III), status, reason, report and initiation dates, distribution pattern and a simple severity score. Data comes from the free public openFDA enforcement API. No login, no proxy, no personal data.

### What does this Actor do?

It reads the openFDA enforcement report endpoints (`api.fda.gov/drug/enforcement.json`, `api.fda.gov/device/enforcement.json` and `api.fda.gov/food/enforcement.json`) for the report window you choose, merges the three categories into one list and sorts it newest first. You can filter by FDA class, ongoing status, keyword and minimum severity score. The actor reports what the FDA publishes. It does not add medical advice, and openFDA data should not be used to make medical decisions.

**Run in 30 seconds**

1. Open the Actor and press **Try for free** (a free Apify account is enough).
2. Keep the prefilled input (all three categories, last 90 days) and press **Start**. A run takes under a minute.
3. Open the **Output** tab. Use the table view or download CSV, Excel or JSON.

### Input

| Field | What it does |
|---|---|
| `categories` | `drug`, `device`, `food`. Default: all three. |
| `daysBack` | Keep recalls reported by the FDA in the last N days. Default 90. |
| `classifications` | Optional list of `I`, `II`, `III`. |
| `ongoingOnly` | Hide recalls already marked completed or terminated. |
| `minSeverityScore` | Optional 0 to 100 threshold. |
| `keyword` | Optional phrase that must appear in the reason or product description. |
| `maxItems` | Stop after this many rows (newest first). Default 100. |

Sample input:

```json
{
  "categories": ["food"],
  "daysBack": 30,
  "classifications": ["I"],
  "keyword": "listeria",
  "maxItems": 50
}
```

### Output

One row per recall record:

| Field | Meaning |
|---|---|
| `recallNumber`, `eventId` | The FDA recall number and the FDA event it belongs to. |
| `recordUrl` | An openFDA API link that returns this exact record. |
| `productType` | `drug`, `device` or `food`. |
| `productDescription`, `productQuantity` | What was recalled and how much. |
| `recallingFirm`, `city`, `state`, `country` | Who recalled it and where the firm is. |
| `classification`, `status` | FDA class (Class I, II, III) and status (Ongoing, Completed, Terminated). |
| `reasonForRecall` | The FDA reason text. |
| `reportDate`, `recallInitiationDate`, `classificationDate`, `daysSinceReport` | Key dates (ISO format) and age of the report. |
| `distributionPattern`, `voluntaryMandated` | Where the product went and whether the recall was voluntary. |
| `severityScore` | 0 to 100, see below. |
| `scrapedAt` | When the run read the data. |

### Sample output

```json
{
  "recallNumber": "H-0015-2027",
  "productType": "food",
  "productDescription": "QUESO PALMITA. Generic Name: Pastel de Queso (Cheese Pie). Net weight: 1.2 lbs.",
  "recallingFirm": "QUESO PALMITA GP LLC",
  "city": "Stafford",
  "state": "TX",
  "classification": "Class II",
  "status": "Ongoing",
  "reasonForRecall": "Undeclared milk, cheese declared",
  "reportDate": "2026-10-14",
  "recallInitiationDate": "2026-09-15",
  "distributionPattern": "Texas",
  "severityScore": 59
}
```

### Use cases

- Send a weekly list of new class I recalls to a food safety, quality or compliance team in a spreadsheet or Slack.
- Watch your own suppliers or brand names with the keyword filter and get alerted when a recall appears.
- Build a recall newsletter, dashboard or research dataset on recall reasons, firms and states.
- Feed rows into an n8n, Make or Zapier workflow that opens a ticket when an ongoing high-severity recall matches a product you stock.
- Study which recall reasons (undeclared allergens, contamination, labeling) are most common across drugs, devices and food.

### Severity score

A fixed rule of thumb, not an FDA rating: class I = 80, class II = 45, class III = 15 (10 if the class is missing), plus 8 if the recall is still ongoing, plus 6 per kind of serious wording in the reason (for example listeria, undeclared allergen, sterility, contamination), up to 12. Capped at 100. The same record always gives the same score.

### Why use it

- **Official source.** Data is the FDA enforcement report as published through openFDA.
- **One table.** Drugs, devices and food in the same shape, with ISO dates.
- **Repeatable.** Fixed filters and a fixed score, so runs can be compared week to week.

### Pricing

Pay per event. You pay a small fixed amount per recall row delivered, listed on the Pricing tab, plus a tiny start fee per run. You can set a maximum cost per run in the run options.

### FAQ

**How fresh is the data?**
openFDA refreshes the enforcement reports about weekly, so very recent recalls can take a few days to appear. The `reportDate` is the date the FDA published the record.

**Why do I get fewer rows than maxItems?**
Only recalls reported inside your window and matching your filters exist. Try a larger `daysBack` or remove filters.

**Is this an official FDA product?**
No. It is an independent tool that reads the public openFDA API. Check the FDA website for authoritative notices.

### Limits

- Covers FDA enforcement reports only (drug, device, food). Animal feed, cosmetics and USDA meat and poultry recalls are not included.
- openFDA data is unvalidated and may change. Do not use it for medical decisions.
- Without an API key openFDA allows a limited request rate; the actor retries politely.

### Related Actors

- [Developer Signals](https://apify.com/transparent_meteorite/developer-signals) tracks public developer activity signals for companies.
- [Website Tech Stack](https://apify.com/transparent_meteorite/website-tech-stack) detects which technologies a website runs on.
- [Sitemap Link Inventory](https://apify.com/transparent_meteorite/sitemap-link-inventory) lists every URL a site publishes in its sitemaps.

Found a bug or need a field? Open an issue on the Issues tab with the run URL.

### More from DWA Open Data

Browse all 69 data Actors, with live prices and sample output, at [open-data-actors.pages.dev](https://open-data-actors.pages.dev).

***

**Feedback:** if this Actor was useful, or if it fell short, an honest review on the [Reviews tab](https://apify.com/transparent_meteorite/fda-recalls-enforcement-reports/reviews) helps other users decide. Problems or feature requests: please open an [Issue](https://apify.com/transparent_meteorite/fda-recalls-enforcement-reports/issues) and we usually reply within one business day.

# Actor input Schema

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

Which FDA enforcement reports to read: drug, device (medical devices) and food. Leave empty to read all three.

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

Keep recalls whose FDA report date falls in the last N days.

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

Optional. Class I is the most serious (reasonable chance of serious harm or death), class III the least. Leave empty for all classes.

## `ongoingOnly` (type: `boolean`):

Turn on to hide recalls the FDA already marks as completed or terminated.

## `minSeverityScore` (type: `integer`):

Optional 0 to 100. Keep only rows at or above this score. 80 or more is roughly class I.

## `keyword` (type: `string`):

Optional phrase that must appear in the reason or product description, for example "listeria" or "undeclared milk".

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

Stop after this many rows, newest report date first. You pay only for rows delivered.

## Actor input object example

```json
{
  "categories": [
    "drug",
    "device",
    "food"
  ],
  "daysBack": 90,
  "ongoingOnly": false,
  "minSeverityScore": 0,
  "maxItems": 100
}
```

# Actor output Schema

## `overview` (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 = {
    "categories": [
        "drug",
        "device",
        "food"
    ],
    "daysBack": 90,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/fda-recalls-enforcement-reports").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",
    ],
    "daysBack": 90,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/fda-recalls-enforcement-reports").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"
  ],
  "daysBack": 90,
  "maxItems": 100
}' |
apify call transparent_meteorite/fda-recalls-enforcement-reports --silent --output-dataset

```

## MCP server setup

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

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/IDdkbNLJwDq9u4z9m/builds/k4jvYO9IXEqN5aaHo/openapi.json
