openFDA Adverse Events Scraper (FAERS) avatar

openFDA Adverse Events Scraper (FAERS)

Pricing

Pay per event

Go to Apify Store
openFDA Adverse Events Scraper (FAERS)

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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 maxResults row 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

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
searchQuerystringno'patient.drug.medicinalproduct:"ozempic"'Raw openFDA Lucene-style search expression, passed through to the search query param unmodified, e.g.…
maxResultsintegerno20Hard cap on rows emitted. Each row is one billed result-row event.
pageSizeintegerno20openFDA limit per request. openFDA's keyless tier caps this at 100.
proxyConfigurationobjectno{'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.

FieldTypeNotes
safety_report_idstringFDA safety report identifier (safetyreportid).
receive_datestringDate FAERS received the report, ISO YYYY-MM-DD when parseable, else the raw receivedate value.
reporter_countrystringReporter's country code (primarysource.reportercountry, falling back to occurcountry).
seriousbooleanWhether the report was flagged serious (serious == "1").
seriousness_deathbooleanWhether the report flagged death as an outcome (seriousnessdeath == "1").
seriousness_hospitalizationbooleanWhether the report flagged hospitalization (seriousnesshospitalization == "1").
seriousness_life_threateningbooleanWhether the report flagged a life-threatening event (seriousnesslifethreatening == "1").
seriousness_disablingbooleanWhether the report flagged a disabling event (seriousnessdisabling == "1").
patient_agenumberPatient age at onset, unit not normalized (patient.patientonsetage).
patient_sexstringPatient sex mapped to male / female / unknown (patient.patientsex).
drug_namesstringEvery implicated drug name for this report, from patient.drug[].medicinalproduct, joined with ; .
reaction_termstringThis row's adverse reaction term (patient.reaction[].reactionmeddrapt); empty string if the report listed no…
reaction_outcomestringReaction 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:

EventUSDWhat it is
actor-start$0.2One-off warm-up charge per run
result-row$0.004Per 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_age passes 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 maxResults on 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.