openFDA Adverse Events Scraper (FAERS) avatar

openFDA Adverse Events Scraper (FAERS)

Pricing

from $4.00 / 1,000 result row emitteds

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

from $4.00 / 1,000 result row emitteds

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

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