# FDA Data Scraper (openFDA) (`trendlab/openfda-scraper`) Actor

Scrape FDA data via the official openFDA API: drug, device, and food recalls, adverse events, and drug labels. One unified, AI-ready JSON output. No API key needed.

- **URL**: https://apify.com/trendlab/openfda-scraper.md
- **Developed by:** [Cheoljae Lee](https://apify.com/trendlab) (community)
- **Categories:** Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 record scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Data Scraper (openFDA)

Pull **FDA data from the official openFDA API** — drug, device, and food **recalls**, **adverse events**, and **drug labels** — into one unified, clean, AI-ready JSON dataset. No API key required. Most FDA scrapers cover a single dataset; this one covers six, with consistent fields and a simple keyword search across all of them.

### What does this Actor do?

Select one or more FDA datasets and get normalized records back:

- 💊 **Drug recalls** (enforcement reports) — firm, product, reason, class, date
- 🍎 **Food recalls** (enforcement reports)
- 🩺 **Device recalls**
- ⚠️ **Drug adverse events** (FAERS) — product, reaction, seriousness, death flag
- 🔬 **Device adverse events** (MAUDE)
- 🏷️ **Drug labels** (SPL) — brand, generic, manufacturer, purpose
- 🔎 **Unified search** — one keyword or a raw openFDA query applied across every dataset, plus date filtering
- 🤖 **AI-ready JSON** — normalized top-level fields plus the full raw record, built for dashboards, monitoring, and AI agents (via the Apify MCP server)

### Why scrape openFDA?

FDA data powers real decisions across industries, but the raw API is spread across many endpoints with different schemas. Pharma companies, health-tech, medical-device makers, product-liability lawyers, insurers, supply-chain teams, and journalists use this Actor to:

- **Monitor recalls** for their products or competitors in real time
- Track **drug/device safety signals** (adverse events) for pharmacovigilance
- Build **compliance and risk dashboards**
- Feed **regulatory data** into models and AI agents

### Input example

```json
{
  "datasets": ["drugRecalls", "foodRecalls", "deviceRecalls"],
  "searchTerm": "insulin",
  "dateFrom": "2025-01-01",
  "maxRecordsPerDataset": 500
}
```

- **searchTerm** — simple keyword matched across firm/product/reason (easiest).
- **searchQuery** — raw openFDA expression for power users, e.g. `classification:"Class I"` or `recalling_firm:Pfizer`.
- **datasets** — mix and match any of the six.

### Output example

```json
{
  "dataset": "drugRecalls",
  "id": "D-0626-2026",
  "date": "2026-07-01",
  "firm": "Annora Pharma Private Limited",
  "product": "Metformin HCl Tablets, 500 mg",
  "reason": "Presence of foreign tablets: possible product mix-up",
  "classification": "Class II",
  "status": "Ongoing",
  "raw": { "…": "full openFDA record" }
}
```

Every record keeps the complete original openFDA payload under `raw`, so no data is lost.

### How much does it cost?

Pay per record returned — a small fee each. Pulling 1,000 records costs a fraction of a dollar. No subscription.

### FAQ

**Do I need an API key?** No. It works key-free (1,000 requests/day). For large jobs, add a free openFDA key (`apiKey` input) to raise the limit to 120,000/day — get one at open.fda.gov/apis/authentication.

**Is this affiliated with the FDA?** No. It uses the FDA's official public openFDA API. Not endorsed by the FDA. openFDA data has usage caveats (do not use to make clinical decisions) — see the FDA's terms.

**Can AI agents use it?** Yes — works with the Apify MCP server, so Claude, ChatGPT, and other agents can call it and pay per use.

### Support

Need another FDA dataset (NDC directory, drug shortages, 510k clearances) or a feature? Open an issue in the **Issues tab** — actively maintained, answered within one business day.

# Actor input Schema

## `datasets` (type: `array`):

Which openFDA datasets to pull. Each is queried and returned in one unified dataset.

## `searchQuery` (type: `string`):

Optional openFDA search expression applied to every dataset, e.g. 'classification:"Class I"' or 'recalling\_firm:Pfizer'. Leave empty to return the most recent records. See openFDA docs for field names.

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

Simple keyword searched across each dataset's main text fields (firm, product, reason). Easier alternative to the raw query above.

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

Only records on or after this date (based on each dataset's primary date field).

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

Only records on or before this date.

## `maxRecordsPerDataset` (type: `integer`):

Maximum records to return per selected dataset (paginated automatically, 1000 per request).

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

Optional free openFDA API key for higher rate limits (120,000/day vs 1,000/day). Get one at open.fda.gov/apis/authentication. Works without a key for small runs.

## Actor input object example

```json
{
  "datasets": [
    "drugRecalls",
    "foodRecalls",
    "deviceRecalls"
  ],
  "maxRecordsPerDataset": 100
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("trendlab/openfda-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("trendlab/openfda-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call trendlab/openfda-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trendlab/openfda-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/z2v0yRof8uBdORmvn/builds/8tUFPaVz9q7GZ1DKH/openapi.json
