# FDA Recalls Scraper - Food, Drug & Device Recalls (`publicrecords101/fda-recalls-scraper`) Actor

Extract FDA food, drug and medical device recalls from openFDA in one feed: firm, product, lot codes, reason, class and dates. Filter by keyword, firm, class, status and state. Get new recalls daily. Official data, no API key needed.

- **URL**: https://apify.com/publicrecords101/fda-recalls-scraper.md
- **Developed by:** [Public Records Data Tools](https://apify.com/publicrecords101) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 recall reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does the FDA Recalls Scraper do?

The **FDA Recalls Scraper** extracts **FDA recall enforcement reports** for **food, drugs and medical devices** from
[openFDA](https://open.fda.gov), the FDA's official open data API. For each recall you get the **recalling firm**,
the **product**, **lot and code numbers**, the **reason for recall**, the **classification** (Class I, II or III),
the **status**, where the product was distributed and all key dates, as clean JSON, CSV or Excel.

The three FDA recall lists are **merged into one feed, newest report first**, with dates as `YYYY-MM-DD` and empty
"N/A" values removed. There is **no login and no API key needed**. Press **Start** to get this week's recalls, or type
a keyword such as `salmonella`, `listeria` or `insulin`.

### What data can you extract from FDA recalls?

| Field | Example |
|---|---|
| `recallNumber` | H-1407-2026 |
| `category` | food, drug or device |
| `classification` | Class I (most serious), Class II, Class III |
| `status` | Ongoing, Completed, Terminated, Pending |
| `recallingFirm` | TODD'S SEEDS LLC |
| `firmAddress`, `firmCity`, `firmState`, `firmPostalCode`, `firmCountry` | 1011 Volunteer Dr, Cookeville, TN |
| `productDescription` | Todd's Seeds Salad Sprouting Mixture - Broccoli, Mustard, Alfalfa and Cabbage ... |
| `productQuantity` | 37,481 retail units (TOTAL) |
| `codeInfo` | Lot No: TS-633-2 Use By: 12/31/2029 |
| `reasonForRecall` | Products contain alfalfa seed recalled by the supplier and may be contaminated with E. coli and/or Salmonella |
| `distributionPattern` | Nationwide; through Amazon or direct to consumer |
| `voluntaryMandated`, `initialFirmNotification` | Voluntary: Firm initiated; E-Mail |
| `recallInitiationDate`, `centerClassificationDate`, `reportDate`, `terminationDate` | 2026-09-11, 2026-09-30, 2026-10-07 |
| `brandNames`, `genericNames`, `manufacturerNames`, `productNdcs` | For drugs: ESTRADIOL, ESTRADIOL TRANSDERMAL, 69238-2448 |
| `eventId`, `url` | FDA recall event and a link to the record |

Every field is described in the Actor's output schema.

### Who uses FDA recall data?

- **Retailers, distributors and food service** checking their suppliers and stock against new recalls.
- **Food, pharma and medical device makers** watching recalls of competitors, suppliers and similar products.
- **Quality, regulatory and compliance consultants** tracking recall trends by product type and reason.
- **Law firms and insurers** researching product liability and recall history of a company.
- **Safety apps, newsletters and AI agents** that alert people about recalls.

### How to use the FDA Recalls Scraper

1. Pick the **product categories** (food, drugs, medical devices, or all three).
2. Optionally enter a **keyword**, a **recalling firm**, a **classification**, a **status**, **firm states** or a
   **report date** range.
3. Set **Maximum results** and press **Start**.
4. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### How much does it cost to scrape FDA recalls?

This Actor uses **pay-per-result pricing**: you pay only for recall reports saved to your dataset. There is no monthly
fee and no separate charge for platform usage.

| Apify plan | Price per 1,000 recall reports |
|---|---|
| Free | $3.00 |
| Bronze | $2.70 |
| Silver | $2.40 |
| Gold | $2.00 |

**Example:** 1,000 recall reports cost **$3.00** on the free plan and **$2.00** on Gold. A test run with 20 results
costs $0.06. Each run also has Apify's standard start fee of $0.00005.

### Input example

```json
{
    "categories": ["food"],
    "keyword": "listeria",
    "classifications": ["Class I"],
    "reportedWithinDays": "90",
    "maxItems": 100
}
```

### Output example

```json
{
    "recallNumber": "H-1407-2026",
    "category": "food",
    "productType": "Food",
    "classification": "Class I",
    "status": "Ongoing",
    "eventId": "99887",
    "recallingFirm": "TODD'S SEEDS LLC",
    "firmAddress": "1011 Volunteer Dr",
    "firmCity": "Cookeville",
    "firmState": "TN",
    "firmPostalCode": "38506-5026",
    "firmCountry": "United States",
    "productDescription": "Todd's Seeds Salad Sprouting Mixture - Broccoli, Mustard, Alfalfa and Cabbage, packaged in heat-sealed resealable bags in the following sizes: 1/4 lb., 1/2 lb., and 1 lb.",
    "productQuantity": "37,481 retail units (TOTAL)",
    "codeInfo": "Lot No: TS-633-2 Use By: 12/31/2029",
    "reasonForRecall": "Products contain alfalfa seed recalled by the supplier and may be contaminated with E. coli and/or Salmonella (downstream recall)",
    "distributionPattern": "Nationwide; through Amazon or direct to consumer",
    "voluntaryMandated": "Voluntary: Firm initiated",
    "initialFirmNotification": "E-Mail",
    "recallInitiationDate": "2026-09-11",
    "centerClassificationDate": "2026-09-30",
    "reportDate": "2026-10-07",
    "terminationDate": null,
    "brandNames": [],
    "genericNames": [],
    "manufacturerNames": [],
    "productNdcs": [],
    "url": "https://api.fda.gov/food/enforcement.json?search=recall_number%3A%22H-1407-2026%22",
    "sourceUrl": "https://api.fda.gov/food/enforcement.json?sort=report_date:desc&limit=100&skip=0",
    "scrapedAt": "2026-10-13T05:00:00.000Z"
}
```

### Get recall alerts every week

FDA publishes its Enforcement Report weekly. Turn on **Only new or updated** and add a **schedule** (for example every
Thursday). Each run then returns only recalls that are new, or whose status or class changed since your last run with
the same filters, so you pay only for what you haven't seen. Connect a webhook, email or Slack integration to get alerts.

### Large runs and the optional API key

openFDA allows 1,000 requests a day per IP address without a key. Each request returns up to 1,000 records, so normal
runs need only a few requests. Because Apify's cloud IPs are shared, you can add your own free openFDA API key
([get one here](https://open.fda.gov/apis/authentication/)) in the **openFDA API key** field; it is stored as a secret
and never written to the dataset.

### Integrations and API

Run the Actor from the Apify API, the JavaScript or Python client, or connect it to **Make**, **Zapier**,
**Google Sheets**, **Slack** and webhooks. Results can be exported as JSON, CSV, Excel, XML or RSS.

### Use with AI assistants (MCP)

The Actor works as a tool for AI agents through Apify's MCP server: the input fields have plain names and
descriptions, and a small run with a keyword returns in seconds.

### Other public-records scrapers

| Actor | Data |
|---|---|
| [Grants.gov Scraper](https://apify.com/publicrecords101/grants-gov-scraper) | Federal grant opportunities with deadlines, amounts and eligibility |
| [USAspending Scraper](https://apify.com/publicrecords101/usaspending-contracts-scraper) | Federal contract awards, including contracts ending soon (recompete leads) |
| [SEC EDGAR Filings Scraper](https://apify.com/publicrecords101/sec-edgar-scraper) | 8-K, 10-K, 10-Q and Form 4 filings for any list of tickers |
| [NIH RePORTER Scraper](https://apify.com/publicrecords101/nih-reporter-scraper) | NIH-funded research projects: newly funded labs, PIs and amounts |
| [Federal Register Scraper](https://apify.com/publicrecords101/federal-register-scraper) | US rules, proposed rules and notices with comment deadlines |

### FAQ

**Is it legal to scrape FDA recall data?** openFDA data is public domain (CC0) and published by the FDA for reuse
through an official API. This Actor reads only that API, at a polite rate. The FDA asks users not to rely on openFDA
for medical decisions; you are responsible for how you use the data.

**Does it include adverse events or patient data?** No. Only recall enforcement reports, which describe firms and
products.

**How fresh is the data?** Each run reads openFDA live. FDA updates the recall lists weekly.

**Something is wrong or missing?** Open an issue on the Actor's Issues tab and we'll reply within 48 hours. Custom
filters or data joins are welcome too.

# Changelog

This Actor's version history is a separate document: https://apify.com/publicrecords101/fda-recalls-scraper/changelog.md

# Actor input Schema

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

Which FDA recall lists to read. Results from several categories are merged, newest report first.

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

Word or phrase to find in the product description, reason for recall or lot codes, e.g. salmonella, peanut, insulin pump. Leave empty for all.

## `recallingFirm` (type: `string`):

Only recalls by this company (name or part of it), e.g. Abbott.

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

Class I is the most serious (risk of serious harm or death). Leave empty for all.

## `statuses` (type: `array`):

Leave empty for all.

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

Only recalls by firms in these US states (two-letter codes). Leave empty for all.

## `reportedWithinDays` (type: `string`):

Only recalls that appeared in FDA's weekly Enforcement Report recently.

## `reportedFrom` (type: `string`):

Only recalls reported on or after this date.

## `reportedTo` (type: `string`):

Only recalls reported on or before this date.

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

Not needed for normal use. Without a key openFDA allows 1,000 requests a day per IP address, which shared cloud IPs can run out of. A free key from https://open.fda.gov/apis/authentication/ raises that to 120,000.

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

Skip recalls your earlier runs with the same filters already returned, unless FDA changed their status or class since. Use with a schedule for recall alerts.

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

Stop after this many recall reports.

## Actor input object example

```json
{
  "categories": [
    "food"
  ],
  "keyword": "listeria",
  "recallingFirm": "Abbott",
  "classifications": [
    "Class I"
  ],
  "statuses": [
    "Ongoing"
  ],
  "states": [
    "CA",
    "NY"
  ],
  "reportedWithinDays": "30",
  "reportedFrom": "2025-01-01",
  "reportedTo": "2025-12-31",
  "onlyNew": true,
  "maxItems": 500
}
```

# Actor output Schema

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

FDA recall enforcement reports found by this run, one per row.

# 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 = {
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicrecords101/fda-recalls-scraper").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 = { "maxItems": 20 }

# Run the Actor and wait for it to finish
run = client.actor("publicrecords101/fda-recalls-scraper").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 '{
  "maxItems": 20
}' |
apify call publicrecords101/fda-recalls-scraper --silent --output-dataset

```

## MCP server setup

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

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/Od7SB1wMXpXRPY5Ly/builds/wrNtdIdjAFLFXaIcK/openapi.json
