# FDA Data Scraper - openFDA Recalls & Events (`logiover/fda-data-scraper`) Actor

openFDA data export tool: scrape FDA drug recalls, adverse events, drug labels and 510(k) clearances to CSV or JSON. No API key, no login required.

- **URL**: https://apify.com/logiover/fda-data-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 8 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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?

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 Recalls, Adverse Events & Drug Labels (No API Key)

![FDA Data Scraper](https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/GjS6nQ8qauOdq9KGy-actor-CDfb5btbcPvFuTO67-sGZ1tkDl5G-istockphoto-1369753139-612x612.jpg)

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00A67E?logo=apify\&logoColor=white) ![No API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f) ![Pay per result](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6) ![Public Data](https://img.shields.io/badge/Category-Healthcare%20%2F%20Public%20Data-8B5CF6) ![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)

Scrape **U.S. FDA drug, device and food data** straight from the official **[openFDA API](https://open.fda.gov)** — **drug recalls, drug adverse events (20M+ records), drug labels, device recalls, device adverse events (24M+ records), 510(k) clearances and food recalls**. Get clean, flat, structured JSON with **recalling firm, product description, recall reason, Class I/II/III classification, status and report dates**, filtered with openFDA's own search syntax. **Fast, reliable, no browser, no API key, no login** — one run can return tens of thousands of records.

> ### 🏆 Why this FDA scraper?
>
> **9 FDA datasets** · **tens of thousands of records per run** · official openFDA API (never blocked, no fragile HTML parsing) · openFDA search-syntax filtering · export to JSON / CSV / Excel. A friendlier **openFDA data export / API alternative** for legal case-sourcing, regulatory compliance monitoring, drug-safety research and pharmacovigilance.

***

### ✨ What this Actor does / Key features

- 💊 **9 FDA datasets** — drug recalls, drug adverse events, drug labels, device recalls, device adverse events, device 510(k) clearances, food recalls, food adverse events and animal & veterinary adverse events.
- 🛡️ **Official openFDA API** — 100% reliable, never blocked, no captchas, no fragile HTML parsing and no breakage on website redesigns.
- 🔑 **No API key, no login** — just pick a dataset and run. An openFDA key is fully optional (for higher rate limits only).
- 📈 **Massive scale** — 20M+ drug adverse events, 24M+ device adverse events; tens of thousands of records per run.
- 🔎 **Powerful filtering** — use openFDA search syntax to filter by `recalling_firm`, `classification`, `report_date` ranges, product type and any other field.
- ⚖️ **Legal & compliance ready** — enforcement/recall and adverse-event feeds are ideal for product-liability sourcing and regulatory monitoring.
- 🎚️ **Adjustable run size** — set `maxRecords` to cap the run or `0` to pull everything available for your query.
- 📤 **Structured, export-ready output** — flat JSON records, perfect for JSON, CSV, Excel, databases or BI tools.
- ⏰ **Built for scheduling** — recalls and adverse events update constantly; run on a schedule for an always-fresh safety feed.

### 🚀 Quick start (3 steps)

1. **Configure** — pick a `dataset` (e.g. `drug/enforcement` for drug recalls) and optionally add a `searchQuery` filter like `classification:"Class I"`.
2. **Run** — click **Start**. The Actor calls the official openFDA API and streams structured records straight into your dataset.
3. **Get your data** — open the **Output** tab and export to **JSON, CSV, Excel or XML**, or pull it via the Apify API.

No code, no API key and no login required.

### 📥 Input

Pick a `dataset` — everything else is optional. Add a `searchQuery` to narrow the pull and a `maxRecords` cap to control run size.

#### Example — the most serious (Class I) drug recalls

```json
{
  "dataset": "drug/enforcement",
  "searchQuery": "classification:\"Class I\"",
  "maxRecords": 10000
}
```

#### Example — every device recall for a specific firm

```json
{
  "dataset": "device/recall",
  "searchQuery": "recalling_firm:medtronic",
  "maxRecords": 0
}
```

#### Example — drug adverse events in a date range (pharmacovigilance)

```json
{
  "dataset": "drug/event",
  "searchQuery": "receivedate:[20260101+TO+20261231]",
  "maxRecords": 5000
}
```

| Field | Type | Description |
|-------|------|-------------|
| `dataset` | string (enum) | Which openFDA dataset to scrape: `drug/enforcement` (drug recalls), `drug/event` (drug adverse events, 20M+), `drug/label` (drug labels, 258K), `device/recall`, `device/event` (device adverse events, 24M+), `device/510k` (510(k) clearances), `food/enforcement` (food recalls), `food/event` (food adverse events), `animalandveterinary/event`. Default `drug/enforcement`. |
| `searchQuery` | string | Optional openFDA search filter, e.g. `classification:"Class I"`, `recalling_firm:pfizer`, or `report_date:[20260101+TO+20261231]`. Leave empty for all records. |
| `maxRecords` | integer | Maximum records to save. `0` = all available for the query (openFDA caps a single query at ~26,000 — narrow with `searchQuery` for more). Minimum `0`. Prefilled at 200. |
| `apiKey` | string (secret) | Optional openFDA API key for higher rate limits (240 req/min, 120k/day vs 240/min, 1k/day). The Actor works fine without it. Get a free key at [open.fda.gov](https://open.fda.gov/apis/authentication/). |
| `proxyConfiguration` | object | Optional Apify Proxy settings. Empty input auto-selects a route and verifies the last retry directly; a supplied proxy is honored without direct fallback. |

> **Finding a search filter:** openFDA uses a simple `field:value` syntax. Combine terms with `+AND+`, use quotes for phrases (`classification:"Class I"`), and use `[start+TO+end]` for date/number ranges (`report_date:[20260101+TO+20261231]`). Field names differ per dataset — see the [openFDA field reference](https://open.fda.gov/apis/) for each endpoint.

### 📤 Output

One row per FDA record — flat, structured JSON, exportable to JSON, CSV, Excel or XML. The fields below are the common enforcement/recall fields surfaced across datasets; the exact fields available depend on the chosen `dataset`. Here is a trimmed sample record:

```json
{
  "_dataset": "drug/enforcement",
  "recalling_firm": "Example Pharma Inc.",
  "product_description": "Example Drug 10mg Tablets, 100-count bottle",
  "reason_for_recall": "Failed dissolution specifications",
  "classification": "Class I",
  "status": "Ongoing",
  "city": "Trenton",
  "state": "NJ",
  "country": "United States",
  "recall_number": "D-1234-2026",
  "report_date": "20260115",
  "recall_initiation_date": "20260108",
  "product_type": "Drugs",
  "scrapedAt": "2026-07-06T08:30:00.000Z"
}
```

<details>
<summary><b>📋 Full field reference (click to expand)</b></summary>

| Field | Description |
|-------|-------------|
| `_dataset` | The openFDA dataset this record came from (e.g. `drug/enforcement`). |
| `product_res_number` / `res_event_number` | Device recall product and event identifiers. |
| `event_date_posted` / `event_date_initiated` | Device-recall posting and initiation dates (`YYYY-MM-DD`). |
| `recall_status` / `root_cause_description` | Current device-recall status and FDA root-cause category. |
| `product_code` / `k_numbers` / `openfda` | Device product code, related 510(k) numbers, and native openFDA device metadata. |
| `recalling_firm` | Name of the firm that initiated the recall. |
| `product_description` | Description of the recalled or reported product. |
| `reason_for_recall` | Stated reason for the recall. |
| `classification` | FDA recall classification (Class I, II or III). |
| `status` | Recall status (e.g. Ongoing, Completed, Terminated). |
| `city` | City of the recalling firm. |
| `state` | State of the recalling firm. |
| `country` | Country of the recalling firm. |
| `recall_number` | FDA's unique recall identifier. |
| `report_date` | Date the recall was reported (YYYYMMDD). |
| `recall_initiation_date` | Date the recall was initiated (YYYYMMDD). |
| `product_type` | Product type (Drugs, Devices, Food, etc.). |
| `scrapedAt` | ISO 8601 timestamp of when the record was scraped. |

> **Note:** enforcement/recall datasets share the fields above. Other datasets return their own native openFDA schema — e.g. `drug/event` and `device/event` return the full adverse-event report (patient, reaction, drug/device details), `drug/label` returns SPL label sections, and `device/510k` returns clearance metadata. Every native openFDA field for the chosen dataset is preserved in the record.

</details>

### 💡 Use cases

- **Legal case sourcing** — product-liability and drug-injury firms monitor recalls and adverse events at scale to identify plaintiffs and cases.
- **Regulatory compliance** — maintain an always-current FDA enforcement feed for your own product categories and classifications.
- **Competitor & market intelligence** — track competitor recalls, adverse-event reports and 510(k) clearances.
- **Drug & device safety** — pharmacovigilance and post-market surveillance from FDA's official adverse-event data.
- **Risk & insurance analytics** — quantify recall frequency and severity by firm, product type and classification.
- **Journalism & watchdogs** — surface Class I recalls and safety trends as they are reported.
- **Research datasets** — build reproducible, exportable FDA datasets for academic or health-tech work.

### 👥 Who uses it

Product-liability & drug-injury law firms · pharma and medical-device compliance & regulatory teams · drug-safety / pharmacovigilance analysts · health-tech companies & data scientists · insurers and risk analysts · investigative journalists & consumer watchdogs · academic and clinical researchers building FDA safety datasets.

### 💰 Pricing

This Actor runs on a simple **pay-per-result** model — you pay for the records you extract, with no separate Apify platform fees to calculate. Try it on the **free tier** first, then scale up. See the **Pricing** tab on this page for the current rate.

### ❓ Frequently Asked Questions

**Do I need an FDA or openFDA API key?**
No. The Actor uses the public openFDA API, which is accessible without an API key, account or login. You can optionally add a free openFDA key for higher rate limits, but it is not required.

**Can I scrape FDA data without an API key or login?**
Yes. There is no FDA account, login or API key required — only an Apify account. The Actor pulls publicly available FDA records over the official openFDA API.

**Is this an openFDA API alternative?**
It is a ready-to-run openFDA data extraction tool that calls the official openFDA API for you, so you skip writing code, handling pagination and managing rate limits — a practical **openFDA API alternative** for non-developers who just want the data in CSV or JSON.

**Does the FDA have a public API?**
Yes — openFDA is the FDA's official open-data API. This Actor reads it directly, which is why results are reliable and never break with website redesigns. It simply wraps that API in a no-code, export-ready interface.

**Which FDA datasets can I scrape?**
Nine: drug recalls (enforcement), drug adverse events (20M+), drug labels (258K), device recalls, device adverse events (24M+), device 510(k) clearances, food recalls, food adverse events, and animal & veterinary adverse events.

**How much data can I get in one run?**
Tens of thousands of records. openFDA caps a single query at roughly 26,000 records — to extract more, split your work with narrower `searchQuery` filters (e.g. by date range or firm) across multiple runs.

**How do I filter FDA recalls or adverse events?**
Use the `searchQuery` field with openFDA's search syntax. Examples: `classification:"Class I"`, `recalling_firm:pfizer`, `report_date:[20260101+TO+20261231]`. Leave it empty to pull everything.

**How do I export openFDA data to CSV or JSON?**
Pick a dataset, run the Actor, then download the results as CSV, JSON, Excel or XML from the dataset — or pull them via the Apify API. FDA recalls and adverse-events export becomes a one-click job.

**How do I get only Class I FDA drug recalls?**
Pick the `drug/enforcement` dataset and set `searchQuery` to `classification:"Class I"` to export just the most serious drug recalls.

**Can I pull all FDA recalls for a specific company?**
Yes. Use a `searchQuery` like `recalling_firm:pfizer` on any enforcement dataset to collect every recall linked to that firm.

**Is it legal to scrape FDA data?**
Yes — openFDA is the FDA's official open-data API, intended for public programmatic access. The Actor collects only publicly available data. You are responsible for how you use and present it.

**How fast is it and does it get blocked?**
It uses the official API, auto-selects a working route, and verifies an auto-routed failure directly. Upstream validation errors and route exhaustion are reported explicitly rather than returned as a successful empty dataset.

**Can I schedule it and what export formats are supported?**
Yes. Schedule it on Apify to keep recalls and adverse events continuously up to date. Results export to JSON, CSV, Excel or XML, or via the Apify API, Google Sheets and webhooks.

### 🔗 More public & government data scrapers by logiover

Building a compliance, health or B2B research pipeline? Pair this FDA scraper with the rest of the public-data suite:

| Dataset | Actor |
|---|---|
| 🩺 Clinical trials | [ClinicalTrials.gov Scraper](https://apify.com/logiover/clinicaltrials-gov-scraper) |
| 👩‍⚕️ US healthcare providers | [NPI Registry Scraper](https://apify.com/logiover/npi-registry-scraper) |
| 📄 SEC Form D filings | [SEC EDGAR Form D Scraper](https://apify.com/logiover/sec-edgar-form-d-scraper) |
| 💵 US federal spending | [USAspending.gov Scraper](https://apify.com/logiover/usaspending-gov-scraper) |
| 🌍 Global trade data | [UN Comtrade Trade Data Scraper](https://apify.com/logiover/comtrade-trade-data-scraper) |
| 🏢 US (NY) company registry | [New York Company Registry Scraper](https://apify.com/logiover/usa-new-york-company-registry-scraper) |
| 🇬🇧 UK companies | [UK Companies House Bulk Scraper](https://apify.com/logiover/uk-companies-house-bulk-scraper) |
| 🇫🇷 France companies | [France Company Registry Scraper](https://apify.com/logiover/france-company-registry-scraper) |
| 🆔 Global LEI codes | [GLEIF LEI Scraper](https://apify.com/logiover/gleif-lei-scraper) |
| 🇫🇮 Finland companies | [Finland Company Registry Scraper](https://apify.com/logiover/finland-company-registry-scraper) |

👉 Browse all **[logiover scrapers on Apify Store](https://apify.com/logiover)** — 180+ actors across real estate, jobs, crypto, social media & B2B data.

### ⏰ Scheduling & integration

Schedule this Actor on Apify to run daily for an always-fresh FDA recalls and adverse-events feed. Export results to JSON, CSV or Excel, pull them through the Apify API, or connect the dataset to **Google Sheets, webhooks or your compliance and analytics pipelines**. Wire it into **Make, n8n or Zapier** to build automated regulatory-monitoring workflows.

### ⭐ Support & feedback

Found a bug or need an extra field? Open an issue on the **Issues** tab — response is usually fast. If this Actor saves you time, a **★★★★★ review** on the Store page genuinely helps and is hugely appreciated. 🙏

### ⚖️ Legal

This Actor extracts only publicly available data from the FDA's official openFDA API and is intended for legitimate research, analytics, compliance and legal-sourcing use. You are responsible for complying with the openFDA terms of service and any applicable local laws and regulations governing how you use and present the data.

***

### 📝 Changelog

#### 2026-08-01

- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
- Corrected device recalls to sort by openFDA's live `event_date_posted` field, added a direct final-route verification for auto proxy selection, and made total route failure fail explicitly instead of succeeding empty.
- Declared all 17 additional fields observed in the live device-recall feed and fixed saved-row accounting so first-batch schema or storage failures cannot be reported as successful output.

#### 2026-08-01 — Health-check remediation

- August 2026 monthly health-check remediation is in progress; this build contains fixes verified from empty/default, Console-default, targeted live probes, or field-level semantic review.
- Corrected device recalls to sort by openFDA's live `event_date_posted` field, added a direct final-route verification for auto proxy selection, and made total route failure fail explicitly instead of succeeding empty.
- Live-verified 40 newest device recalls, declared all 17 additional fields observed in that feed, added device-specific overview columns, and made first-batch schema/storage failures fail explicitly with an accurate saved count.
- The final four-input matrix verdict will be appended after post-build cloud revalidation.

#### 2026-07-06

- ✨ README overhaul: static badge row, ready-to-run example scenarios, collapsible full field reference, richer FAQ covering the openFDA API-alternative / no-key / CSV-export keyword gaps, and a public/government-data cross-promo grid.

#### 2026-07-01

- Maintenance pass: re-verified end-to-end on live data and confirmed successful runs within the 5-minute quality window on the default input.
- Sharpened Store metadata (SEO title & description) and expanded the FAQ with high-intent, long-tail questions for easier discovery in Google and Apify Store search.
- Added ready-to-run example tasks that cover common real-world use cases.

#### 2026-06-15

- Reliability pass: re-verified end-to-end on live data with real-world inputs. Routine maintenance build.

#### 2026-06-07

- Docs: added coverage for openFDA API alternative, exporting FDA recalls/adverse events to CSV/JSON, and building an FDA dataset without code.

#### 2026-06-05

- 🛡️ Reliability fix: results are no longer dropped by strict output validation — runs now complete cleanly even at high volume (thousands of results).
- ⚡ Stability & performance hardening; fresh rebuild.

#### 2026-06-04

- Verified live & refreshed build — reliability/maintenance pass.

#### 2026-06-01

- Maintenance & reliability pass: pulled the latest source and rebuilt the Actor on the current base image; build verified.

#### 2026-05-25

- Maintenance & reliability pass: pulled the latest source and rebuilt the Actor on the current base image; build verified.

#### 2026-05-20

- Maintenance pass: reviewed the input schema and default values for a smooth one-click start, and rebuilt the Actor on the latest base image.

***

\*Maintained: last verified 2026-09-01 — checked end-to-end against live run history (reliability, output fields and types, and time/memory budgets).

# Actor input Schema

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

Which openFDA dataset to scrape. Recalls/enforcement and adverse events are the highest-demand for legal & compliance use. Leave everything else empty to pull the most recent Drug Recalls.

## `sort` (type: `string`):

How to order results. 'Newest first' / 'Oldest first' sort by the dataset's primary date field (e.g. report date for recalls, receive date for adverse events). 'Default' uses openFDA's native/relevance order.

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

Optional openFDA search filter, e.g. 'classification:"Class I"' or 'recalling\_firm:pfizer' or 'report\_date:\[20260101+TO+20261231]'. Leave empty for all records.

## `maxRecords` (type: `integer`):

Maximum records to save. 0 = all available for the query (up to 26,000 per query; narrow with the search filter for more). Empty input returns the most recent records from the selected dataset.

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

Optional openFDA API key for higher rate limits (240 req/min, 120k/day vs 240/min, 1k/day without). The actor works fine without it. Get a free key at https://open.fda.gov/apis/authentication/

## `proxyConfiguration` (type: `object`):

Optional routing for openFDA. Leave empty to auto-select a working pool and verify the final retry directly; an explicitly supplied proxy remains authoritative.

## Actor input object example

```json
{
  "dataset": "drug/enforcement",
  "sort": "newest",
  "searchQuery": "",
  "maxRecords": 200
}
```

# Actor output Schema

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

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "maxRecords": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/fda-data-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 = { "maxRecords": 200 }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/fda-data-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/CDfb5btbcPvFuTO67/builds/xHRrGBdDJ4QoxXOIb/openapi.json
