openFDA Adverse Events Scraper (FAERS) icon

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 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.

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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row emitted$0.0040Per 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_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.

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

Teams that run this also run