# openFDA Recalls & Adverse Events - Food, Drug, Device (`zhucl1006/openfda-recalls-adverse-events`) Actor

Search FDA recall enforcement reports (food, drugs, medical devices) and adverse event reports (FAERS drug, MAUDE device, CAERS food) via the official openFDA API. Filter by product, firm, class and date; clean flat JSON. For compliance, QA, insurers, law firms, sellers.

- **URL**: https://apify.com/zhucl1006/openfda-recalls-adverse-events.md
- **Developed by:** [leo zhu](https://apify.com/zhucl1006) (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 fda records

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

## openFDA Recalls & Adverse Events - Food, Drug & Medical Device

Search the U.S. FDA's **recall enforcement reports** (food & cosmetics, drugs, medical devices) and **adverse event reports** (FAERS for drugs, MAUDE for medical devices, CAERS for food/supplements/cosmetics) through the **official openFDA API**. Filter by product, brand, ingredient or firm name, recall class and date, and get clean, flat JSON rows instead of deeply nested raw records. No API key needed (optional free key for heavy use) - 50 recalls in about 1 second.

### Who uses it

- **Food, supplement, pharma & device compliance / QA teams**: weekly feed of new Class I/II recalls in your category or from your suppliers.
- **Amazon / e-commerce sellers & retailers**: check products, ingredients and suppliers against recalls before listing or sourcing.
- **Insurers, product-liability & mass-tort law firms**: count and export adverse event reports for a drug or device.
- **Pharmacovigilance, med-affairs & market research**: monitor competitor brands' reported reactions over time.
- **Journalists & AI apps**: recall alerts into Slack, Sheets, newsletters or LLM pipelines via the Apify API.

### Input

| Field | Description |
|---|---|
| `dataset` | `food_recalls`, `drug_recalls`, `device_recalls`, `drug_adverse_events`, `device_adverse_events`, `food_adverse_events`. |
| `searchTerms` | Product / brand / ingredient / firm, e.g. `ozempic`, `salmonella`, `insulin pump`. One search each. |
| `classification` | Recalls only: Class I / II / III. |
| `reportedWithinDays` | Last N days (default 90), or exact `dateFrom` / `dateTo`. |
| `maxItemsPerQuery` | Max records per term (default 100). |
| `rawSearch` | Optional openFDA search expression for power users. |
| `apiKey` | Optional free openFDA key (only for very high volume). |

```json
{ "dataset": "drug_adverse_events", "searchTerms": ["ozempic", "mounjaro"], "reportedWithinDays": 365, "maxItemsPerQuery": 1000 }
```

### Output examples

Recall:

```json
{ "dataset": "food_recalls", "recallNumber": "H-1339-2026", "classification": "Class I", "recallStatus": "Ongoing",
  "recallingFirm": "Everything Sprouts, LLC", "productDescription": "Everything Sprouts Crunchy Protein Sprout Mix ... UPC 0 87906-01018 7",
  "reasonForRecall": "Sprouts may be contaminated with STEC E. coli and/or Salmonella.", "productQuantity": "201.56 pounds",
  "distributionPattern": "MN, WI", "recallInitiationDate": "2026-08-22", "reportDate": "2026-09-23", "city": "Minneapolis", "state": "MN" }
```

Drug adverse event (FAERS):

```json
{ "dataset": "drug_adverse_events", "safetyReportId": "26940200", "receiveDate": "2026-06-30", "serious": true, "hospitalization": true,
  "death": false, "occurCountry": "PK", "patientAge": "45", "patientAgeUnit": "year", "patientSex": "female",
  "reactions": ["Monoplegia", "Back pain", "Product use in unapproved indication"], "suspectDrugs": ["OZEMPIC"],
  "brandNames": ["OZEMPIC"], "genericNames": ["ORAL SEMAGLUTIDE"], "manufacturerNames": ["Novo Nordisk Pharmaceutical Industries, LP"] }
```

Device events include brand/generic names, manufacturer, product codes, product & patient problems and the narrative text.

### Pricing (pay per event)

- **$0.002 per record saved** (`fda-record`) - 500 records = $1.
- Tiny start fee per run (`apify-actor-start`). Failed searches are not charged. Set "Maximum cost per run" to cap spend.

### Notes

- Source: openFDA (U.S. Food and Drug Administration), public-domain data. Adverse event reports are unverified, do not prove causation and are published with a delay. **Do not rely on openFDA for medical decisions.** Not affiliated with or endorsed by the FDA.
- Without a key openFDA allows 1,000 requests/day per IP; this Actor fetches up to 1,000 records per request, so normal runs need only a few requests.

# Actor input Schema

## `dataset` (type: `string`):

Which openFDA database to search.

## `searchTerms` (type: `array`):

Product, brand, ingredient or firm names, e.g. ozempic, salmonella, insulin pump, Listeria. One search per term. Empty = everything in the date range.

## `classification` (type: `string`):

FDA recall health-hazard classification.

## `reportedWithinDays` (type: `integer`):

Only records reported/received in the last N days (0 = any date). Note: adverse event data is published with a lag of a few months.

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

Optional exact start date - overrides 'Reported within'.

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

Optional end date.

## `maxItemsPerQuery` (type: `integer`):

openFDA allows paging up to ~26,000 records per search.

## `rawSearch` (type: `string`):

Optional openFDA search syntax, e.g. state:CA or patient.reaction.reactionmeddrapt:"nausea". Combined with the filters above.

## `includeRaw` (type: `boolean`):

Adds the full original record (all fields) as 'raw'.

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

Free key from open.fda.gov raises the limit from 1,000 to 120,000 requests/day. Not needed for normal use.

## Actor input object example

```json
{
  "dataset": "food_recalls",
  "searchTerms": [],
  "classification": "any",
  "reportedWithinDays": 90,
  "maxItemsPerQuery": 50,
  "includeRaw": 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 = {
    "dataset": "food_recalls",
    "reportedWithinDays": 90,
    "maxItemsPerQuery": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("zhucl1006/openfda-recalls-adverse-events").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 = {
    "dataset": "food_recalls",
    "reportedWithinDays": 90,
    "maxItemsPerQuery": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("zhucl1006/openfda-recalls-adverse-events").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 '{
  "dataset": "food_recalls",
  "reportedWithinDays": 90,
  "maxItemsPerQuery": 50
}' |
apify call zhucl1006/openfda-recalls-adverse-events --silent --output-dataset

```

## MCP server setup

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

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/G11yTWbbT97EV139H/builds/ZYdG5CkHTr7TZZdwJ/openapi.json
