# FDA Adverse Events Scraper - FAERS + MAUDE Export

Scrape FDA adverse events from FAERS (drugs) and MAUDE (devices) via openFDA. Deeply nested reports flattened to one clean row each. Export to CSV, JSON, or Excel.

Canonical product page: https://mayd-it.com/data-tools/actors/us-fda-adverse-events-scraper/
Public Actor: https://apify.com/maydit/us-fda-adverse-events-scraper

## Example input

```json
{
  "reportType": "drug",
  "productName": "OZEMPIC",
  "seriousOnly": true,
  "country": "US",
  "receivedSince": "2026-01-01",
  "maxResults": 10
}
```

## Full guide

![FDA adverse-event reports — illustrative workflow](https://api.apify.com/v2/key-value-stores/YGxD9JRpduom8Q5Zd/records/us-fda-adverse-events-scraper-fa76a7b5a606.png?signature=Jk7cvkiyNso6LrBw98Zi)

## FDA adverse-event reports

For safety researchers and product teams, bring FDA drug or device reports into a table you can filter and review.

**Coverage:** Choose FAERS drug reports or MAUDE device reports per run. Country filtering applies only to drug mode.

[Open this Actor in Console](https://console.apify.com/actors/fwuV0byQZJfg9LE8g/input) · [First run](#try-this-actor) · [Results](#result-preview) · [Cost](#usage-and-pricing) · [Full guide](#full-guide)

## Try this Actor

1. Choose a report type and a product example from the input guide below. Lower the maximum report count for your first inspection.
2. Open the run's dataset for the report table or an export; read the key-value store's `SUMMARY` for time or spending stops.

**Read the results correctly:** A reported event does not establish causation. Preserve publication lag and the reported age unit when interpreting the rows.

## Result preview

The dataset view highlights these columns:

- **Report source** · `reportType`
- **FDA report ID** · `reportId`
- **FDA received date** · `receivedDate`
- **Reported serious** · `serious`
- **Reported event type** · `eventType`
- **Reported products** · `products`

Use the original source links and the field definitions below when interpreting the results. CSV works well for flat columns; JSON preserves nested values.

## Usage and pricing

Base result rate on the FREE tier: **$4 per 1,000 results**. The [Pricing tab](https://apify.com/maydit/us-fda-adverse-events-scraper/pricing) shows your plan's result rate and any Actor Start charge. Set a small result limit for the first run; the requested limit is not a guarantee of that many results.

---

## Full guide

> Pull FDA drug and medical-device adverse event reports from openFDA, flattened to one clean row per report, and export to CSV, JSON, or Excel.

### What it does

This **FDA adverse events scraper** queries the official **openFDA API** and returns two kinds of safety reports in one tool: **FAERS** adverse drug reaction reports (20M+) and **MAUDE** medical device event reports (25M+). Unlike drug-only scrapers and bloated "everything openFDA" generalists that dump raw nested JSON, it flattens each deeply nested openFDA report into a single, analysis-ready row - so **FAERS data**, **drug adverse event exports**, and **MAUDE database exports** land in your dataset already cleaned. Filter by product, reaction or device problem, seriousness, country, and received-date window, then export to CSV or Excel for pharmacovigilance, post-market surveillance, and drug safety signal detection.

### Who it's for

- **Pharmacovigilance and drug-safety teams** monitoring products for new or serious adverse events
- **Medical-device safety, regulatory, and QA teams** tracking device malfunctions and injuries
- **Pharma and medtech researchers** running comparative or epidemiologic analyses
- **Product-liability and litigation professionals** pulling report narratives and metadata for cases
- **Academics and data scientists** who need standardized, flattened adverse-event datasets

### What you get / Output

Each report is flattened to one row with these fields:

| Field | Description |
|---|---|
| `reportId` | Unique FDA report identifier |
| `receivedDate` | Date the FDA received the report |
| `serious` | Seriousness flag (death, hospitalization, life-threatening, disability) |
| `products` | Reported product / brand name(s) |
| `genericNames` | FDA-enriched generic name(s) |
| `manufacturer` | Manufacturer / applicant information |
| `indications` | Reported reason the product was used |
| `reactions` | MedDRA-coded reactions, with outcome codes |
| `productProblems` | Device problem descriptors (device mode) |
| `eventType` | Event classification (death / injury / malfunction) |
| `deviceClass` | FDA device class / model (device mode) |
| `narrative` | Truncated event narrative text |
| `patientAge` | Age as reported; drug reports require the unit code below and must not be assumed to be years |
| `patientAgeUnitCode` | Raw FAERS `patientonsetageunit` code in drug mode; null in device mode. See the [FDA field reference](https://open.fda.gov/fields/drugevent_reference.pdf). Device age retains the source's original text |
| `patientSex` | Patient sex |
| `occurCountry` | Country where the event occurred |

Fields populate according to mode: drug (FAERS) reports emphasize reactions, indications, and demographics; device (MAUDE) reports emphasize product problems, event type, and device class.

### Input / How to query

| Input | What it does |
|---|---|
| `reportType` | `drug` = FAERS drug reports; `device` = MAUDE device reports |
| `productName` | Brand or generic drug name (e.g. `OZEMPIC`, `metformin`) or device name (e.g. `insulin pump`, `IMPELLA`); matched against reported and FDA-enriched names. Leave empty for all |
| `reactionOrProblem` | Drug mode: MedDRA reaction term (e.g. `Pancreatitis`). Device mode: product problem (e.g. `Battery Problem`). Leave empty for all |
| `seriousOnly` | Drug mode: only serious reports (death, hospitalization, life-threatening, disability). Device mode: only Death or Injury events |
| `country` | Two-letter country where the event occurred (drug mode only; ignored in device mode) |
| `receivedSince` | Only reports received on or after this date (`YYYY-MM-DD`) |
| `receivedUntil` | Only reports received on or before this date (`YYYY-MM-DD`) |
| `maxResults` | Upper bound on reports returned per run |
| `maxRunSeconds` | Wall-clock budget for the run (default 240). When it is reached the Actor stops cleanly and finishes successfully with the reports it already has, and records `stoppedEarlyOnTimeLimit: true` in the run's `SUMMARY`. Raise it, together with the run timeout, for a deliberately large pull |

### Example use cases

- **Drug safety signal detection:** Pull every serious FAERS report for a single drug over the last quarter and scan reaction terms for emerging patterns.
- **Device post-market surveillance:** Export MAUDE malfunction and injury events for an insulin pump line to feed a QA / complaint-handling review.
- **Product-liability research:** Collect adverse-event narratives, manufacturer, and outcome data tied to a specific product for a lawsuit.
- **Competitive intelligence:** Track a competitor's drug or device adverse events and manufacturer trends over a date range.
- **Epidemiologic analysis:** Build a standardized, flattened adverse drug reaction dataset filtered by reaction, country, and demographics for a research study.

### Recurring use / scheduling

Run it on a **schedule** (daily, weekly, or monthly) to monitor a product for new or serious adverse events - true post-market surveillance without manual polling. Set `receivedSince` to roll forward each run and dedupe on `reportId` when appending to your master dataset. **Mind the publication lag:** openFDA releases FAERS drug reports roughly three months after receipt (MAUDE device reports a few weeks after), so in drug mode keep `receivedSince` about 100 days behind today - setting it to your last run date returns nothing new, and the Actor now warns when the window is inside the lag. Point the run's dataset at a webhook or your BI tool to get alerted when new serious reports appear.

### How do I download FAERS data without hitting the openFDA 25,000 record API limit?

Set your filters (product, reaction, date window, `seriousOnly`) to scope the query, and use `maxResults` plus incremental `receivedSince` / `receivedUntil` windows to page through data across scheduled runs instead of pulling everything at once. Each run writes a clean dataset you can append and dedupe on `reportId`.

### How can I export FDA adverse event reports to CSV or Excel?

Every run stores results in an Apify dataset that you export in one click to **CSV, Excel, JSON, or XML**, or pull via the API. Because reports are already flattened to one row each, the CSV opens cleanly in Excel with no nested-JSON wrangling.

### How do I search the MAUDE database for medical device adverse events in bulk?

Set `reportType` to `device`, optionally add a `productName` (e.g. `IMPELLA`) and a `reactionOrProblem` device problem (e.g. `Material Rupture`), then raise `maxResults` and use a `receivedSince` / `receivedUntil` window to collect device events in bulk.

### How do I get both FAERS drug and MAUDE device adverse events in one dataset?

This is the tool's core differentiator. Run it once with `reportType` = `drug` and once with `reportType` = `device` (or on two schedules) - both write the same flattened schema, so you can merge them into a single combined adverse-events dataset.

### How do I monitor a drug for new adverse event reports (signal detection)?

Schedule the Actor with a fixed `productName` and roll `receivedSince` forward each run (keeping it about 100 days behind today in drug mode - see the publication-lag note above) so it only returns newly received reports. Dedupe on `reportId` and watch the `serious`, `reactions`, and `eventType` fields for emerging safety signals.

### How do I pull only serious adverse events (death, hospitalization, disability) from FAERS?

Set `seriousOnly` to `true` in drug mode to return only reports flagged serious - death, hospitalization, life-threatening, or disability. In device mode the same flag returns only Death or Injury events.

### Do I need an API key to access the openFDA adverse events API?

No. openFDA adverse-event endpoints are public and this Actor handles the querying for you - you only provide the search filters. You just need an Apify account to run the Actor.

### How do I flatten nested openFDA adverse event JSON into one row per report?

That is exactly what this scraper does automatically. openFDA returns deeply nested report objects; the Actor converts each one into a single flat row with the fields listed in the Output table, so you never have to write JSON-flattening code.

### How do I get adverse event data for a product liability lawsuit?

Filter by the product (and optionally reaction / problem, seriousness, and date range), then export the dataset. The `narrative`, `manufacturer`, `reactions`, `productProblems`, and `receivedDate` fields give you the report metadata and event descriptions commonly used in forensic and litigation research.

### What is the difference between FAERS and MAUDE data?

**FAERS** is the FDA Adverse Event Reporting System for **drugs** - it captures adverse drug reactions, MedDRA-coded reactions, indications, and patient demographics. **MAUDE** is the FDA's **medical device** event database - it captures device malfunctions, injuries, and deaths with product problems and device class. This Actor covers both via the `reportType` input.

### Data source & notes

- **Source:** the official, public [openFDA](https://open.fda.gov/) adverse-event endpoints - `drug/event` (FAERS, 20M+ reports) and `device/event` (MAUDE, 25M+ reports). This is public U.S. government data, free to use.
- **Cleaning:** deeply nested openFDA report JSON is flattened to one row per report; the `narrative` field is truncated.
- **Coverage limits:** the `country` filter applies to drug mode only. Field population depends on what the reporter submitted - adverse-event reports are voluntary and can be incomplete, and a report does not establish that a product caused the event. Data reflects openFDA's own refresh cadence.

### Related actors

Part of a set of US public-records tools that work well together:

- [FDA Recalls Scraper](https://apify.com/maydit/us-fda-recalls-scraper) - enforcement actions for drugs, devices and food
- [NPI Registry Scraper](https://apify.com/maydit/us-healthcare-providers-scraper) - provider data for the same healthcare market

See the full collection at [apify.com/maydit](https://apify.com/maydit).

**Free guide:** [Paging past 25,000 and flattening FAERS and MAUDE records](https://mayd-it.com/data-tools/guides/openfda-faers-maude-api-flatten-nested-records/) - the undocumented traps in this data source, measured against the live API.

### Found this useful?

If this actor saved you time, a short review on the Apify Store genuinely helps. Reviews are how the next person decides whether a tool is worth trying.

Something broken, missing a field, or a source you want covered? Open an issue on the **Issues** tab and it will get looked at - that is the fastest route to getting it changed.

#### Run spending limits

The run stops at its spending limit. `SUMMARY.datasetItemsSaved` reports the number of rows actually saved, and `SUMMARY.stoppedOnChargeLimit` identifies this stop. A final batch may be saved only in part; increase the spending limit to collect more results.

## Help with your run

Open the **Issues** tab on this Actor with the run URL, the input field that caused trouble and what you expected to receive. Remove API keys and private information before posting.

[Explore more Mayd-It Actors](https://apify.com/maydit)

## Understand your run

Open **Run report** in the run’s Output tab for saved-record counts, reported source issues and limits, and suggested next steps. Use **CSV export** to take the saved results into a spreadsheet. The existing JSON results and detailed machine-readable summary remain available.

The report reflects this run’s recorded coverage. A successful run or a saved result does not establish that every possible source record was collected.
