openFDA Adverse Events Scraper (FAERS)
Pricing
Pay per event
openFDA Adverse Events Scraper (FAERS)
Export FDA FAERS adverse-event reports as flat, one-row-per-reaction rows — drug names, seriousness flags, patient demographics and reaction outcome — from the public openFDA API. Self-reported, unvalidated data for research, never for medical-care decisions.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
🎯 What this 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.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchQuery | string | no | 'patient.drug.medicinalproduct:"ozempic"' | Raw openFDA Lucene-style search expression, passed through to the search query param unmodified, e.g.… |
maxResults | integer | no | 20 | Hard cap on rows emitted. Each row is one billed result-row event. |
pageSize | integer | no | 20 | openFDA limit per request. openFDA's keyless tier caps this at 100. |
proxyConfiguration | object | no | {'useApifyProxy': False} | openFDA is a public government API and does not need a proxy. Leave this off unless your account requires egress… |
Example input
{"searchQuery": "patient.drug.medicinalproduct:\"ozempic\"","maxResults": 3,"pageSize": 3,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
safety_report_id | string | FDA safety report identifier (safetyreportid). |
receive_date | string | Date FAERS received the report, ISO YYYY-MM-DD when parseable, else the raw receivedate value. |
reporter_country | string | Reporter's country code (primarysource.reportercountry, falling back to occurcountry). |
serious | boolean | Whether the report was flagged serious (serious == "1"). |
seriousness_death | boolean | Whether the report flagged death as an outcome (seriousnessdeath == "1"). |
seriousness_hospitalization | boolean | Whether the report flagged hospitalization (seriousnesshospitalization == "1"). |
seriousness_life_threatening | boolean | Whether the report flagged a life-threatening event (seriousnesslifethreatening == "1"). |
seriousness_disabling | boolean | Whether the report flagged a disabling event (seriousnessdisabling == "1"). |
patient_age | number | Patient age at onset, unit not normalized (patient.patientonsetage). |
patient_sex | string | Patient sex mapped to male / female / unknown (patient.patientsex). |
drug_names | string | Every implicated drug name for this report, from patient.drug[].medicinalproduct, joined with ; . |
reaction_term | string | This row's adverse reaction term (patient.reaction[].reactionmeddrapt); empty string if the report listed no… |
reaction_outcome | string | Reaction outcome mapped to text (e.g. fatal, recovered/resolved), or null if unmapped or missing… |
Example output
{"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
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result-row | $0.004 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $4.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 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?
No. openFDA serves FAERS keylessly; the Actor stays inside the anonymous rate limit and backs off automatically on 429 responses.
Can I use this data to evaluate a drug's safety for a patient?
No. openFDA states its own data is unvalidated and self-reported, and this Actor carries the same disclaimer — do not use these rows to make medical care decisions.
Why does one report produce multiple rows?
A report with three reported reactions becomes three rows, each carrying the full drug list for that report — the natural one-row-per-fact join for a reaction-level dataset.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.