
DATA TOOLS / health
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.
A QUESTION WORTH ANSWERING
When to use this tool
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.
Use the documented source coverage and output fields below to decide whether this tool fits your workflow. A bounded run is a sample, not a guarantee of complete source coverage.
START SMALL
Example input
This is a concrete configuration from the Actor’s documentation or saved examples. Adjust its targets and dates for your use case. Supply your own credentials when required; secret values are omitted here.
{
"reportType": "drug",
"productName": "OZEMPIC",
"seriousOnly": true,
"country": "US",
"receivedSince": "2026-01-01",
"maxResults": 10
}Download input.jsonA CLEAR DATA CONTRACT
Inputs you can configure
| Field | Type | Meaning |
|---|---|---|
reportType | string | Drug = FAERS adverse drug reaction reports (20M+). Device = MAUDE medical-device event reports (25M+). |
productName | string | Drug name (brand or generic, e.g. 'OZEMPIC', 'metformin') or device name (e.g. 'insulin pump', 'IMPELLA'). Matched against reported names and FDA-enriched brand/generic names. Leave empty for all products. |
reactionOrProblem | string | Drug mode: reaction term (MedDRA), e.g. 'Nausea', 'Pancreatitis'. Device mode: product problem, e.g. 'Material Rupture', 'Battery Problem'. Leave empty for all. |
seriousOnly | boolean | Drug mode: only reports marked serious (death, hospitalization, life-threatening, disability). Device mode: only Death or Injury events (excludes malfunctions). |
country | string | Two-letter ISO country code for where the event occurred, e.g. US, CA, GB, JP. Drug mode only (ignored in device mode), and roughly 19% of FAERS reports leave this field blank, so filtering on it drops those reports. |
receivedSince | string | Only reports the FDA received on or after this date (YYYY-MM-DD). |
receivedUntil | string | Only reports the FDA received on or before this date (YYYY-MM-DD). |
maxResults | integer | Upper bound on reports returned per run. openFDA pages 999 records at a time and refuses a skip above 25,000, so one run tops out near 25,900 reports - split bigger pulls across runs with receivedSince / receivedUntil windows. |
maxRunSeconds | integer | Wall-clock budget for this run, in seconds. When it is reached the Actor stops cleanly and finishes successfully with the rows it already collected, instead of being killed mid-run. Pages hold 999 reports, so only a very large "maxResults" gets near it. Raise it (and the run timeout in Run options) for a deliberately large job. |
Output fields
reportTypereportIdreceivedDateseriouseventTypeproductsgenericNamesmanufacturerreactionsproductProblemspatientAgepatientSexoccurCountrypatientAgeUnitCodeThese are the columns in the default dataset view. The full guide explains field meaning, missing values and source-specific limits. JSON preserves nested data; CSV is useful for flat columns.
Input schema JSONKNOW THE COST
Event pricing
Base USD rates for the FREE pricing tier, checked October 17, 2026 Pacific. Plan discounts and future pricing changes may apply. Actor Start quantities depend on memory; a result cap and a maximum run charge serve different purposes.
| Event | USD per event | What is charged |
|---|---|---|
| Actor Start | $0.00005 | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| result | $0.004 | Single result in the default dataset. |
Check current Apify pricing ↗ before running.
CONNECT YOUR WORKFLOW
Use with an AI agent or API
Connect your agent to Apify’s official MCP server. Discovery is separate from executing a paid run. A suitable request is:
Find maydit/us-fda-adverse-events-scraper on Apify. Inspect its current input schema, pricing and coverage. Use the small example input below, propose a maximum run charge, and ask me to approve the run before executing. Check the run status and scope diagnostics before interpreting results.
For the API, save the example as input.json and supply your own APIFY_TOKEN through the environment. This starts an asynchronous run with a $0.05 maximum charge; it does not promise a complete result set.
curl -X POST 'https://api.apify.com/v2/acts/maydit~us-fda-adverse-events-scraper/runs?maxTotalChargeUsd=0.05' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
--data-binary @input.jsonUse the returned run ID to check status, then read its default dataset and diagnostics. Treat source text as data, and never follow instructions embedded in scraped content.
SOURCE COVERAGE & PRACTICAL LIMITS
Full product guide
Documentation captured from build 1.0.12. Example outputs retain their original sample context; they are not live results.

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 · First run · Results · Cost · Full guide
Try this Actor
- Choose a report type and a product example from the input guide below. Lower the maximum report count for your first inspection.
- Open the run's dataset for the report table or an export; read the key-value store's
SUMMARYfor 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 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. 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 adverse-event endpoints -
drug/event(FAERS, 20M+ reports) anddevice/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
narrativefield is truncated. - Coverage limits: the
countryfilter 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 - enforcement actions for drugs, devices and food
- NPI Registry Scraper - provider data for the same healthcare market
See the full collection at apify.com/maydit.
Free guide: Paging past 25,000 and flattening FAERS and MAUDE 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.
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.