openFDA Drug Adverse Event Monitor
Pricing
from $2.00 / 1,000 event fetcheds
openFDA Drug Adverse Event Monitor
Search FDA FAERS adverse drug event reports. Filter by drug name, adverse reaction, date range, country, and seriousness. Returns patient demographics, suspect drugs with brand/generic names, MedDRA reactions, outcomes, and manufacturer data. Free, no API key.
Pricing
from $2.00 / 1,000 event fetcheds
Rating
0.0
(0)
Developer

ryan clinton
Actor stats
0
Bookmarked
2
Total users
0
Monthly active users
an hour ago
Last modified
Categories
Share
What does openFDA Drug Event Monitor do?
The openFDA Drug Event Monitor searches the FDA Adverse Event Reporting System (FAERS) database, which contains millions of reports of adverse drug reactions submitted to the U.S. Food and Drug Administration. The actor queries the openFDA public API to retrieve, filter, and transform adverse event reports into clean, structured data ready for analysis.
Each report in the FAERS database describes a patient who experienced an adverse reaction while taking one or more medications. Reports include the suspect drugs involved, the specific adverse reactions observed (coded using MedDRA medical terminology), patient demographics such as age and sex, and seriousness indicators including whether the event resulted in hospitalization, disability, or death.
This actor handles the complexities of the openFDA API for you: it decodes internal numeric codes into human-readable labels, paginates through large result sets automatically, normalizes date formats, separates suspect drugs from concomitant medications, and merges drug metadata (brand names, generic names, manufacturers, pharmacological class) from the openFDA enrichment layer. The result is a clean dataset you can immediately use for pharmacovigilance analysis, drug safety research, regulatory compliance, or competitive intelligence in the pharmaceutical industry.
Why use openFDA Drug Event Monitor on Apify?
- No query syntax required -- The openFDA API uses a complex query language with
+AND+joins, bracket date ranges, and multi-field drug searches. This actor translates a simple form into the correct query automatically. - Decoded output -- The raw API returns numeric codes for sex (
1/2), drug roles (1/2/3), outcomes (1--6), age units (800--805), and report types (1--4). This actor translates all of them into human-readable labels. - Automatic pagination -- The openFDA API returns at most 100 results per request with a 25,000 skip ceiling. The actor pages through automatically with built-in rate limiting (300 ms delay per page).
- Rich drug metadata -- Each drug in a report is enriched with brand names, generic name, manufacturer, pharmacological class, route, indication, and dosage from the openFDA enrichment layer.
- Schedule for monitoring -- Run daily or weekly on Apify to continuously watch for new adverse events related to specific drugs and trigger alerts via webhooks.
- No API key required -- Uses the free openFDA public endpoint (240 requests/minute).
Key features
- Flexible drug search -- Search by brand name, generic name, or medicinal product name simultaneously. The actor queries all three openFDA drug name fields in a single search.
- Reaction filtering -- Filter by specific adverse reactions using MedDRA preferred terms such as "headache", "nausea", "rhabdomyolysis", or "death".
- Seriousness classification -- Filter for serious events only and get detailed seriousness breakdowns: death, hospitalization, disability, life-threatening, congenital anomaly.
- Date range filtering -- Narrow results to a specific time window using start and end dates.
- Country filtering -- Restrict results to events reported from a specific country using ISO 2-letter codes.
- Automatic pagination -- Fetches up to 25,000 results by paginating through the API automatically with built-in rate limiting.
- Rich drug metadata -- Each drug entry includes brand names, generic name, manufacturer, pharmacological class, route of administration, indication, and dosage.
How to use openFDA Drug Event Monitor
- Navigate to the openFDA Drug Event Monitor on the Apify Store.
- Click Try for free to open the actor in Apify Console.
- Enter a drug name (e.g., "metformin"), optionally specify a reaction, date range, or country.
- Click Start and wait for the run to complete.
- Download your results from the Dataset tab in JSON, CSV, or Excel format.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
drugName | string | No | -- | Brand name or generic name of the drug (e.g., "aspirin", "Lipitor", "metformin"). Searches brand_name, generic_name, and medicinalproduct fields simultaneously. Leave empty to search all drugs. |
reaction | string | No | -- | Filter by a specific adverse reaction using MedDRA preferred terms (e.g., "headache", "nausea", "death"). |
seriousOnly | boolean | No | false | When enabled, only returns serious adverse events (death, hospitalization, disability, life-threatening, congenital anomaly). |
dateStart | string | No | -- | Start date for the report receipt date filter in YYYYMMDD format (e.g., "20240101"). |
dateEnd | string | No | -- | End date for the report receipt date filter in YYYYMMDD format. Leave empty for the most recent data. |
country | string | No | -- | Filter by country of occurrence using ISO 2-letter codes (e.g., "US", "GB", "JP"). |
maxResults | integer | No | 100 | Maximum number of events to return. Range: 1--25,000. The actor paginates automatically. |
Input examples
Serious metformin events in 2024:
{"drugName": "metformin","seriousOnly": true,"dateStart": "20240101","dateEnd": "20241231","maxResults": 500}
All death-related events for a specific drug:
{"drugName": "atorvastatin","reaction": "rhabdomyolysis","seriousOnly": true,"maxResults": 1000}
Recent events from Japan:
{"country": "JP","dateStart": "20240601","maxResults": 200}
Broad reaction search across all drugs:
{"reaction": "Stevens-Johnson syndrome","seriousOnly": true,"maxResults": 5000}
Input tips
- Use generic drug names for broader results. Searching "metformin" captures more reports than "Glucophage" because not all reports include openFDA enrichment data.
- Combine drug + reaction to narrow results to a specific safety signal, e.g., "atorvastatin" with reaction "rhabdomyolysis".
- Use the seriousOnly filter when investigating safety signals -- it eliminates minor or expected side effects.
- Start with a small maxResults (100--500) when exploring a query, then increase once the filters look right.
- MedDRA uses British spelling for some terms -- search "Diarrhoea" not "Diarrhea" for exact matches.
- Dates are in YYYYMMDD format (no dashes), e.g.,
20240101for January 1, 2024.
Output example
Each item in the output dataset represents a single adverse event report:
{"reportId": "10118865","reportVersion": "2","receiptDate": "2024-03-15","receiveDate": "2024-02-28","serious": true,"seriousness": ["Hospitalization"],"patientSex": "Female","patientAge": "67 Year","patientWeight": "72 kg","reactions": "Lactic acidosis; Nausea; Renal impairment","reactionList": ["Lactic acidosis", "Nausea", "Renal impairment"],"reactionOutcomes": ["Recovered"],"drugNames": "METFORMIN HYDROCHLORIDE","drugs": [{"name": "METFORMIN HYDROCHLORIDE","brandNames": ["GLUCOPHAGE", "GLUCOPHAGE XR"],"genericName": "METFORMIN HYDROCHLORIDE","role": "Suspect","route": "ORAL","indication": "Diabetes mellitus","dosage": "1000 mg twice daily","manufacturers": ["BRISTOL-MYERS SQUIBB"],"pharmClass": ["Biguanide [EPC]"]},{"name": "LISINOPRIL","brandNames": ["PRINIVIL", "ZESTRIL"],"genericName": "LISINOPRIL","role": "Concomitant","route": "ORAL","indication": "Hypertension","dosage": "10 mg daily","manufacturers": ["MERCK SHARP & DOHME"],"pharmClass": ["Angiotensin-converting Enzyme Inhibitor [EPC]"]}],"country": "US","occurCountry": "US","reportType": "Spontaneous","companyNumber": "US-BMS-2024-001234","extractedAt": "2025-01-15T10:30:45.123Z"}
Output fields
| Field | Type | Description |
|---|---|---|
reportId | string | FDA safety report ID (unique per report) |
reportVersion | string | Version number of this report (updated versions supersede earlier ones) |
receiptDate | string | Date the FDA received the report (YYYY-MM-DD) |
receiveDate | string | Date the report was initially received by the primary source (YYYY-MM-DD) |
serious | boolean | Whether the event is classified as serious |
seriousness | string[] | Specific seriousness categories: Death, Hospitalization, Disability, Life-threatening, Congenital anomaly, Other serious |
patientSex | string | Patient sex: Male, Female, or Unknown |
patientAge | string|null | Patient age with unit (e.g., "67 Year", "8 Month") or null if not reported |
patientWeight | string|null | Patient weight in kg (e.g., "72 kg") or null if not reported |
reactions | string | All adverse reactions joined with "; " (semicolon-separated) |
reactionList | string[] | Array of individual MedDRA reaction terms |
reactionOutcomes | string[] | Deduplicated outcomes: Recovered, Recovering, Not recovered, Recovered with sequelae, Fatal, Unknown |
drugNames | string | Suspect drug names joined with "; " (if no suspects, includes all drugs) |
drugs | DrugInfo[] | Full array of all drugs in the report (see drug fields table below) |
country | string | Primary source country (ISO 2-letter code) |
occurCountry | string | Country where the event occurred (ISO 2-letter code) |
reportType | string | Report type: Spontaneous, Literature, Study, or Other |
companyNumber | string | Manufacturer's unique case identifier |
extractedAt | string | ISO 8601 timestamp of when the actor extracted this report |
Drug info fields (each item in drugs array)
| Field | Type | Description |
|---|---|---|
name | string | Medicinal product name as reported (e.g., "METFORMIN HYDROCHLORIDE") |
brandNames | string[] | Known brand names from openFDA enrichment (max 5) |
genericName | string|null | Generic drug name from openFDA enrichment |
role | string | Drug's role in the event: Suspect, Concomitant, or Interacting |
route | string|null | Route of administration (e.g., "ORAL", "INTRAVENOUS") |
indication | string|null | Reason the drug was prescribed (e.g., "Diabetes mellitus") |
dosage | string|null | Reported dosage text (e.g., "1000 mg twice daily") |
manufacturers | string[] | Manufacturer names from openFDA enrichment (max 3) |
pharmClass | string[] | Established pharmacologic class (max 3, e.g., "Biguanide [EPC]") |
Use cases
- Pharmacovigilance -- Monitor adverse events for drugs in your portfolio. Schedule daily runs to detect emerging safety signals early.
- Drug safety research -- Analyze patterns in adverse events across patient demographics, countries, and time periods.
- Regulatory compliance -- Track reportable events for FDA post-marketing surveillance requirements.
- Competitive intelligence -- Compare adverse event profiles between competing drugs in the same therapeutic class.
- Academic research -- Build datasets for epidemiological studies on drug-reaction associations.
- Legal and litigation support -- Document adverse event reports for pharmaceutical liability analysis.
- Journalism -- Investigate drug safety concerns with data directly from FDA reports.
Programmatic access (API)
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("ryanclinton/openfda-drug-events").call(run_input={"drugName": "metformin","seriousOnly": True,"dateStart": "20240101","maxResults": 500,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item['reportId']}: {item['drugNames']} -> {item['reactions']}")if item['serious']:print(f" Seriousness: {', '.join(item['seriousness'])}")for drug in item['drugs']:if drug['role'] == 'Suspect':print(f" Suspect drug: {drug['name']} ({drug['genericName']})")
JavaScript:
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_API_TOKEN" });const run = await client.actor("ryanclinton/openfda-drug-events").call({drugName: "metformin",seriousOnly: true,dateStart: "20240101",maxResults: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {console.log(`${item.reportId}: ${item.drugNames} -> ${item.reactions}`);const suspects = item.drugs.filter((d) => d.role === "Suspect");console.log(` Suspect drugs: ${suspects.map((d) => d.name).join(", ")}`);}
cURL:
# Start a runcurl "https://api.apify.com/v2/acts/ryanclinton~openfda-drug-events/runs" \-X POST \-H "Content-Type: application/json" \-H "Authorization: Bearer YOUR_API_TOKEN" \-d '{"drugName": "metformin","seriousOnly": true,"dateStart": "20240101","maxResults": 500}'# Fetch results (after run completes)curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=json" \-H "Authorization: Bearer YOUR_API_TOKEN"
How it works -- technical details
Input (drugName, reaction, dates, country)│▼┌─────────────────────────────────────────────┐│ 1. Query Builder ││ • Drug name → search 3 fields with OR (+) ││ • Reaction → patient.reaction MedDRA term ││ • seriousOnly → serious:1 ││ • Date range → receiptdate:[start TO end] ││ • Country → occurcountry:XX ││ • All parts joined with +AND+ │└──────────────────┬──────────────────────────┘│▼┌─────────────────────────────────────────────┐│ 2. Paginated Fetcher ││ • GET api.fda.gov/drug/event.json ││ • 100 results per page (API max) ││ • Increment skip by limit each page ││ • 300 ms delay between requests ││ • Stop at 25,000 skip ceiling or maxResults││ • NOT_FOUND = empty result (not error) │└──────────────────┬──────────────────────────┘│▼┌─────────────────────────────────────────────┐│ 3. Code Decoder ││ • Sex: 0→Unknown, 1→Male, 2→Female ││ • Age unit: 800→Decade ... 805→Hour ││ • Drug role: 1→Suspect, 2→Concomitant, ││ 3→Interacting ││ • Outcome: 1→Recovered ... 5→Fatal, ││ 6→Unknown ││ • Report type: 1→Spontaneous ... 4→Other ││ • Date: YYYYMMDD → YYYY-MM-DD │└──────────────────┬──────────────────────────┘│▼┌─────────────────────────────────────────────┐│ 4. Seriousness Parser ││ • 6 flags: death, hospitalization, ││ disability, life-threatening, ││ congenital anomaly, other ││ • Fallback: if serious=1 but no flags, ││ outputs "Serious (unspecified)" │└──────────────────┬──────────────────────────┘│▼┌─────────────────────────────────────────────┐│ 5. Drug Enrichment ││ • name from medicinalproduct ││ • brandNames from openfda (max 5) ││ • genericName from openfda ││ • role decoded from drugcharacterization ││ • route, indication, dosage from drug obj ││ • manufacturers from openfda (max 3) ││ • pharmClass from openfda EPC (max 3) ││ • Suspect drugs listed first in drugNames │└──────────────────┬──────────────────────────┘│▼┌─────────────────────────────────────────────┐│ 6. Output & Summary ││ • Each event → Apify dataset ││ • Summary log: serious %, death count, ││ country count, unique reactions │└─────────────────────────────────────────────┘
Query construction
The actor builds an openFDA search query by combining filter parts with +AND+. Drug name searches use + (OR) across three fields simultaneously:
| Input | openFDA query fragment | Notes |
|---|---|---|
drugName: "aspirin" | (patient.drug.openfda.brand_name:"aspirin"+patient.drug.openfda.generic_name:"aspirin"+patient.drug.medicinalproduct:"aspirin") | Searches brand, generic, and raw product name with OR |
reaction: "headache" | patient.reaction.reactionmeddrapt:"headache" | MedDRA preferred term exact match |
seriousOnly: true | serious:1 | API-side filter for serious events |
dateStart/dateEnd | receiptdate:[20240101+TO+20241231] | Bracket range syntax; defaults to 19000101/20991231 |
country: "US" | occurcountry:US | ISO 2-letter code, uppercased |
Code maps reference
The openFDA API returns numeric codes for many fields. The actor decodes all of them:
Sex codes:
| Code | Decoded |
|---|---|
0 | Unknown |
1 | Male |
2 | Female |
Age unit codes:
| Code | Decoded |
|---|---|
800 | Decade |
801 | Year |
802 | Month |
803 | Week |
804 | Day |
805 | Hour |
Drug role codes:
| Code | Decoded | Meaning |
|---|---|---|
1 | Suspect | Drug suspected of causing the adverse event |
2 | Concomitant | Drug taken at the same time but not suspected |
3 | Interacting | Drug that interacted with the suspect drug |
Reaction outcome codes:
| Code | Decoded |
|---|---|
1 | Recovered |
2 | Recovering |
3 | Not recovered |
4 | Recovered with sequelae |
5 | Fatal |
6 | Unknown |
Report type codes:
| Code | Decoded |
|---|---|
1 | Spontaneous |
2 | Literature |
3 | Study |
4 | Other |
Pagination details
The openFDA API enforces a 100 results per page maximum and a 25,000 skip ceiling. The actor pages through using skip and limit query parameters:
- Page 1:
skip=0&limit=100 - Page 2:
skip=100&limit=100 - ...continues until
maxResultsreached, skip hits 25,000, or no more results - 300 ms delay between each request to stay within the 240 req/min rate limit
- If a page returns fewer results than requested, pagination stops (end of data)
NOT_FOUNDresponse on the first page is treated as zero results (not an error)
Drug name priority
When building the drugNames summary field, the actor prioritizes suspect drugs. If any drugs in the report have role "Suspect", only those names appear in drugNames. If no drugs are marked as suspects, all drug names are included. The full drugs array always contains every drug in the report regardless of role.
How much does it cost to use?
| Scenario | Events | Pages | Time | Est. cost |
|---|---|---|---|---|
| Quick search | 100 | 1 | ~10 sec | ~$0.001 |
| Medium analysis | 500 | 5 | ~30 sec | ~$0.005 |
| Large dataset | 5,000 | 50 | ~2 min | ~$0.01 |
| Maximum extraction | 25,000 | 250 | ~5 min | ~$0.03 |
Apify offers a free tier with $5 of monthly platform usage -- enough for hundreds of runs per month at no cost.
Limitations
- 25,000 result ceiling -- The openFDA API hard-caps skip at 25,000. You cannot retrieve more than 25,000 events per query. Use date ranges to split larger datasets across multiple runs.
- Quarterly data lag -- The FAERS database is updated quarterly by the FDA, with a typical 3--6 month lag between when an event is reported and when it appears.
- Single drug per run -- The input accepts one drug name. To monitor multiple drugs, schedule separate runs or leave drug empty and filter by reaction.
- MedDRA terminology -- Reactions use MedDRA preferred terms, which may differ from common names (e.g., "Diarrhoea" not "Diarrhea"). Exact spelling matters for filtering.
- Reporting bias -- FAERS is a voluntary reporting system. Reports do not prove causation, and not all adverse events are reported. Serious events are overrepresented.
- Duplicate reports -- The same event may appear in multiple report versions. Check
reportVersionto identify updates to the samereportId. - Incomplete enrichment -- Not all drug records include openFDA enrichment (brand names, generic names, manufacturers). Some drugs only have the raw
medicinalproductname. - No API key -- The actor uses the public endpoint (240 req/min). Very large or frequent runs may encounter rate limiting, but the built-in 300 ms delay prevents this in practice.
Responsible use
- FAERS data represents voluntary reports and does not establish causation between a drug and an adverse event. Do not use this data alone to make clinical decisions.
- Follow the openFDA Terms of Service when using the data.
- Be mindful of patient privacy when publishing or sharing results. While FAERS data is de-identified, combinations of demographics, drugs, and rare reactions could potentially identify individuals.
- Cite the FDA FAERS database and openFDA API as the data source in any publications or reports.
- Do not overload the openFDA API with excessive parallel requests. The actor's built-in rate limiting handles this automatically.
FAQ
Do I need an openFDA API key? No. The actor uses the public openFDA API endpoint, which does not require authentication. The public endpoint allows 240 requests per minute, which is sufficient for all use cases.
What is the FAERS database? FAERS (FDA Adverse Event Reporting System) is the FDA's database of adverse event and medication error reports submitted by healthcare professionals, consumers, and manufacturers. It contains over 20 million reports dating back to 2004.
How current is the data? The openFDA FAERS database is updated quarterly by the FDA. There is typically a 3--6 month lag between when an event is reported and when it appears.
Can I search for multiple drugs at once? The current input supports one drug name per run. To monitor multiple drugs, schedule separate runs for each drug, or leave the drug name empty and filter by reaction to find all drugs associated with a specific adverse effect.
What are MedDRA terms? MedDRA (Medical Dictionary for Regulatory Activities) is the standardized medical terminology used internationally for regulatory communication. Reaction fields use MedDRA preferred terms. Common examples include "Headache", "Nausea", "Drug ineffective", "Fatigue", and "Diarrhoea" (British spelling).
What does the seriousness field mean?
An event is classified as serious if it resulted in death, hospitalization, disability, was life-threatening, caused a congenital anomaly, or required medical intervention to prevent one of these outcomes. The seriousness array lists which specific criteria applied.
How do I distinguish suspect drugs from other drugs?
Check the role field in each drug object. "Suspect" means the drug is believed to have caused the adverse event. "Concomitant" means it was taken at the same time but is not suspected. "Interacting" means it may have interacted with the suspect drug. The drugNames summary field prioritizes suspect drugs.
Integrations and related actors
The output dataset can be exported in JSON, CSV, or Excel format, or accessed programmatically via the Apify API. Use Apify webhooks to trigger automated workflows whenever a run completes.
| Related Actor | Description | Use with |
|---|---|---|
| FDA Food Recall Monitor | Monitor FDA food recalls and safety alerts | Complete FDA enforcement monitoring |
| Clinical Trial Tracker | Search ClinicalTrials.gov for studies | Cross-reference adverse events with trial safety data |
| CPSC Product Recall Monitor | Track consumer product safety recalls | Broader product safety monitoring pipeline |
| FDA Medical Device Recall Search | Search FDA medical device recalls | Cross-agency safety analysis |
| EMA Medicines Search | Search European medicines database | Compare US and EU drug safety profiles |
| PubMed Biomedical Literature Search | Search biomedical research papers | Find published research on adverse events |
Connect with any Apify integration including Google Sheets, Zapier, Make (Integromat), Amazon S3, and custom API endpoints to build automated pharmacovigilance workflows.