Developer tools
openFDA Adverse Events Scraper (FAERS)
Flat, ready-to-query FDA FAERS adverse-event rows — drug names, seriousness flags, patient demographics, and reaction outcome, one row per reaction — pulled straight from the openFDA API instead of a 180 KB nested JSON document per report.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
The FDA's Adverse Event Reporting System (FAERS) is the world's largest public feed of drug-safety signals, but the raw record is a deeply nested JSON blob that buries seriousness flags and patient data three levels down. This Actor pages api.fda.gov/drug/event.json on your search, flattens every report into one row per reaction, each carrying the report's full drug list, and hands pharmacovigilance and competitive-intel teams a table they can pivot on directly. openFDA's own guidance applies here: this is unvalidated, self-reported data, and it should never drive medical care decisions.
What we handle for you
- flattens each FAERS report into one row per reaction — each row carries the report's full drug list — instead of a deeply nested blob
- retries transient 429/5xx responses with backoff so a rate-limit blip does not kill the run
- stops cleanly at your
maxResultsrow cap instead of over-fetching openFDA's full result set - validates every row through a typed Pydantic model before it reaches your dataset
Use cases
- Track adverse-event volume for a specific drug ahead of a competitive or regulatory review.
- Feed a pharmacovigilance signal-detection pipeline with flattened seriousness and outcome fields.
- Benchmark reported reaction severity across a drug class over a date range.
- Backfill a research dataset without hand-flattening FAERS' nested JSON.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
searchQuery | string | no | Raw openFDA Lucene-style search expression, passed through to the search query param unmodified, e.g. patient.drug.medicinalproduct:"ozempic" or receivedate:[20240101+TO+20241231]. |
maxResults | integer | no | Hard cap on rows emitted. Each row is one billed result-row event. |
pageSize | integer | no | openFDA limit per request. openFDA's keyless tier caps this at 100. |
{
"searchQuery": "patient.drug.medicinalproduct:\"ozempic\"",
"maxResults": 3,
"pageSize": 3,
"proxyConfiguration": {
"useApifyProxy": false
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
safety_report_idreceive_datereporter_countryseriousseriousness_deathseriousness_hospitalizationseriousness_life_threateningseriousness_disablingpatient_agepatient_sexdrug_namesreaction_termreaction_outcome
{
"safety_report_id": "10188271",
"receive_date": "2014-05-22",
"reporter_country": "US",
"serious": true,
"seriousness_death": false,
"seriousness_hospitalization": true,
"seriousness_life_threatening": false,
"seriousness_disabling": true,
"patient_age": 81.0,
"patient_sex": "female",
"drug_names": "LANTUS SOLOSTAR",
"reaction_term": "Stenosis",
"reaction_outcome": "unknown"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0040 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- openFDA's own disclaimer applies in full: this is unvalidated, self-reported adverse-event data and must never be used to make medical care decisions.
patient_agepasses through openFDA's raw numeric value without normalizing the reporting unit (years vs. months vs. weeks).- openFDA's keyless tier rate-limits aggressively (public guidance: ~240 requests/minute); a very large
maxResultson a broad query may take longer to complete.
FAQ
Do I need an API key?
Can I use this data to evaluate a drug's safety for a patient?
Why does one report produce multiple rows?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors