> For the complete documentation index, see [llms.txt](https://docs.dataplex-consulting.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.dataplex-consulting.com/data-catalog/fda-aems-dataset.md).

# FDA AEMS Adverse Events Dataset

### About the Dataset

The **FDA AEMS (Adverse Event Monitoring System) Adverse Events Dataset** delivers analysis-ready drug and medical device adverse event reports from the **U.S. Food and Drug Administration (FDA)**, the unified successor to **FAERS (FDA Adverse Event Reporting System)** and **MAUDE (Manufacturer and User Facility Device Experience)**. 9M+ drug safety reports and 14M+ device adverse event reports are sourced directly from the **openFDA** real-time feed, updated daily as new data is published, and delivered with native BOOLEAN flags, MedDRA-coded reactions, full untruncated narratives, and pre-built PRR (Proportional Reporting Ratio) signal-detection aggregates, built for pharmacovigilance analysts, drug safety scientists, regulatory affairs teams, medical device safety engineers, biotech R\&D, and post-market surveillance programs.

{% hint style="info" %}
**Get Full Access** | [Snowflake Marketplace](https://app.snowflake.com/marketplace/listing/GZT1Z7QRT19A) | [Databricks](https://checkout.dataplex-consulting.com/b/00waEQ1eX6dWh2waC8bQY06) | [Databricks Marketplace](https://marketplace.databricks.com/details/bf5d58c8-0926-4f62-b4b5-d94b450d62d0/Dataplex-Consulting-Data-Products_FDA-AEMS-Adverse-Events-Dataset) | [Free Trial](https://trial.dataplex-consulting.com)
{% endhint %}

### Quick Access

|                       |                                                                                                                                                |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **Drug Stream**       | DRUG\_REPORTS · DRUG\_REACTIONS · DRUG\_SUBSTANCES · DRUG\_REPORT\_SOURCES · DRUG\_REPORT\_DUPLICATES                                          |
| **Device Stream**     | DEVICE\_REPORTS · DEVICE\_DETAILS · DEVICE\_NARRATIVES · DEVICE\_PATIENTS · DEVICE\_PROBLEMS                                                   |
| **Reference Tables**  | DEVICE\_CLASSIFICATION · DRUG\_NDC\_DIRECTORY                                                                                                  |
| **Signal Aggregates** | DRUG\_REACTION\_ASSOCIATIONS · DRUG\_SAFETY\_TRENDS · DRUG\_MANUFACTURER\_EVENTS · DEVICE\_MANUFACTURER\_EVENTS · DEVICE\_EXECUTIVE\_DASHBOARD |
| **Sources**           | openFDA Drug Event · openFDA Device Event · openFDA Device Classification · openFDA Drug NDC Directory                                         |
| **Coverage**          | 2020-present (pre-2020 backfill available on request: drug to 2004, device to 1991)                                                            |
| **Records**           | 9M+ drug reports · 14M+ device reports · 27M+ drug reactions · 32M+ device narratives                                                          |
| **Update Frequency**  | Weekly (drug + device events) · Monthly (NDC + device classification reference)                                                                |
| **Automatic Updates** | Our pipeline monitors openFDA daily and loads new bulk releases within hours of publication; no manual refresh needed                          |
| **Platforms**         | Snowflake Marketplace · Databricks Delta Sharing                                                                                               |

## Pharmacovigilance & Post-Market Safety Surveillance Overview

The FDA AEMS Adverse Events Dataset consolidates two of the most-queried public safety surveillance systems, drug adverse events (formerly FAERS) and medical device adverse events (formerly MAUDE), into a single, consistently-modeled Snowflake share with shared design patterns across both streams:

* **Native BOOLEAN flags** for seriousness, death, hospitalization, life-threatening, disability, congenital anomaly, expedited reporting, single-use, implantable, and product-problem indicators: query `WHERE serious = TRUE` directly without VARCHAR-to-boolean gymnastics
* **MedDRA preferred terms** (`reaction_meddra_pt`) for drug reactions with title-case spelling per the openFDA standard (`'Death'`, not `'DEATH'`)
* **Full untruncated device narratives**: no 16K-character limit on `DEVICE_NARRATIVES.text`; both Description of Event AND Manufacturer Narrative types preserved
* **Full openFDA enrichment** on drug substances: `substance_name`, `rxcui`, `unii`, `nui`, all 4 `pharm_class_*` variants (EPC, MoA, PE, CS), `spl_id`, `spl_set_id`, `package_ndc`, `application_number`
* **2017-expanded patient demographics** on devices: `patient_ethnicity`, `patient_race`, `patient_problems`, outcome and treatment sequence numbers
* **Pre-built PRR signal-detection**: `DRUG_REACTION_ASSOCIATIONS` carries Proportional Reporting Ratio with 95% confidence intervals (Evans et al. 2001) plus an `is_signal` BOOLEAN flag (PRR>=2.0 AND N>=3 AND lower-95>=1.0)
* **One row per report, always current**: every view returns the latest version of each report keyed on `safety_report_id` (drugs) or `report_number` (devices). No batch-history filtering, no `is_latest = TRUE` clauses. Just query and go.

### Why FDA AEMS, Not FAERS or MAUDE Separately

FDA consolidated the FAERS drug-adverse-event database and the MAUDE medical-device-adverse-event database under the unified **Adverse Event Monitoring System (AEMS)** brand on openFDA. The two streams share a common surveillance philosophy (voluntary reporting, MedDRA coding where applicable, semiquarterly bulk releases) but live as separate tables here because their schemas diverge sharply: drug events key on `safety_report_id` while device events key on `report_number`. This product gives you both under one Marketplace listing with shared design conventions so a query learned on one stream transfers cleanly to the other.

## Entity Relationship Diagram

![FDA AEMS Entity Relationship Diagram](https://813439891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDeimGtBflXKQn786VLvj%2Fuploads%2Fgit-blob-f56b34279a09ab181b63ac45d2b949822629dd8d%2Fentity-relationship.png?alt=media)

**Primary join keys:**

* **Drug stream**: JOIN every drug table on `safety_report_id`. `DRUG_REPORTS` is the header, `DRUG_REACTIONS` / `DRUG_SUBSTANCES` / `DRUG_REPORT_SOURCES` / `DRUG_REPORT_DUPLICATES` are line-level children
* **Device stream**: JOIN every device table on `report_number`. `DEVICE_REPORTS` is the header, `DEVICE_DETAILS` / `DEVICE_NARRATIVES` / `DEVICE_PATIENTS` / `DEVICE_PROBLEMS` are line-level children
* **Reference enrichment**: `DEVICE_DETAILS.device_report_product_code` joins `DEVICE_CLASSIFICATION.product_code` (near-complete coverage). `DRUG_SUBSTANCES.product_ndc` joins `DRUG_NDC_DIRECTORY.product_ndc` (SPLIT/FLATTEN required; see the DRUG\_NDC\_DIRECTORY section)

> **One row per report, always current.** Each view returns the latest version of every report: one row per `safety_report_id` (drugs) or `report_number` (devices). No `WHERE is_latest = TRUE`, no batch-history JOINs, no deduplication step. Query any table directly and you get the current state of FDA's data.

## Drug Adverse Event Tables (formerly FAERS)

The drug stream covers spontaneous, mandatory-from-manufacturer, and study-derived adverse event reports for FDA-regulated drugs, biologics, and combination products. JOIN every drug table on `safety_report_id`.

### DRUG\_REPORTS: Drug Safety Report Headers

Header-level drug safety reports, one row per `safety_report_id`. Carries patient demographics (age group, onset age, sex, weight, ethnicity when present), outcome severity (`seriousness_death`, `seriousness_hospitalization`, `seriousness_life_threatening`, `seriousness_disabling`, `seriousness_congenital_anomaly`, `seriousness_other`), the native BOOLEAN `serious` flag, reporter context (`reporter_country`, `reporter_qualification_decoded`), sender / receiver organizations, and the high-impact `patient_summary_narrative` field for full clinical context.

**Key columns** (full schema: 40+ columns):

| Column                           | Type    | Description                                                                                                                    |
| -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `safety_report_id`               | VARCHAR | Primary key: FDA safety report identifier. JOIN target for all drug child tables.                                              |
| `safety_report_version`          | VARCHAR | Version number; FDA reissues updated reports as new info arrives                                                               |
| `receive_date`                   | DATE    | Date FDA received the report (default cutoff: 2020-01-01)                                                                      |
| `serious`                        | BOOLEAN | Serious adverse event flag: death, hospitalization, life-threatening, disability, congenital anomaly, or required intervention |
| `seriousness_death`              | BOOLEAN | TRUE when event resulted in patient death                                                                                      |
| `seriousness_hospitalization`    | BOOLEAN | TRUE when event caused or prolonged hospitalization                                                                            |
| `seriousness_life_threatening`   | BOOLEAN | TRUE when event was life-threatening                                                                                           |
| `patient_onset_age`              | NUMERIC | Patient age at onset (unit in `patient_onset_age_unit`; 800=Decade through 805=Hour)                                           |
| `patient_age_group`              | VARCHAR | Bucket: neonate / infant / child / adolescent / adult / elderly                                                                |
| `patient_sex_decoded`            | VARCHAR | Male / Female / Unknown                                                                                                        |
| `patient_death_present`          | BOOLEAN | TRUE when patient.patientdeath block was present (covers cases where date is unparseable)                                      |
| `patient_summary_narrative`      | TEXT    | Free-text clinical case summary, the highest-value field for context                                                           |
| `reporter_qualification_decoded` | VARCHAR | Physician / Pharmacist / Other HCP / Lawyer / Consumer                                                                         |
| `primary_source_country`         | VARCHAR | ISO country code from primary source                                                                                           |
| `occur_country`                  | VARCHAR | ISO country where event occurred                                                                                               |
| `report_type_decoded`            | VARCHAR | Spontaneous / Report from study / Other / Not available                                                                        |
| `reaction_count`, `drug_count`   | NUMERIC | Number of reactions / drugs on this report, pre-computed for quick filtering                                                   |

### DRUG\_REACTIONS: MedDRA-Coded Adverse Reactions

Line-level adverse reactions per safety report. Multiple rows per `safety_report_id` (one per reaction).

| Column                     | Type    | Description                                                                                                  |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
| `safety_report_id`         | VARCHAR | FK to DRUG\_REPORTS                                                                                          |
| `reaction_meddra_pt`       | VARCHAR | MedDRA Preferred Term in title case (e.g. `'Death'`, not `'DEATH'`). UPPER() for case-insensitive filtering. |
| `reaction_meddra_pt_code`  | VARCHAR | Numeric MedDRA preferred-term code; JOIN to external MedDRA dimension tables                                 |
| `reaction_meddra_version`  | VARCHAR | MedDRA dictionary version (e.g. `'26.1'`)                                                                    |
| `reaction_outcome_decoded` | VARCHAR | Recovered / Recovering / Not recovered / Recovered with sequelae / Fatal / Unknown                           |

### DRUG\_SUBSTANCES: Drugs Implicated in Each Report

Line-level drugs implicated in each report with full **openFDA enrichment**. Multiple rows per `safety_report_id`.

| Column                                                                    | Type         | Description                                                                                                                              |
| ------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `safety_report_id`                                                        | VARCHAR      | FK to DRUG\_REPORTS                                                                                                                      |
| `substance_name`                                                          | VARCHAR      | openFDA-normalized active ingredient (e.g. `'METFORMIN'` covers Glucophage, Fortamet); primary key for substance-level analytics         |
| `medicinal_product`                                                       | VARCHAR      | Reported drug name as entered by the reporter (often brand or local name)                                                                |
| `drug_characterization_decoded`                                           | VARCHAR      | Suspect / Concomitant / Interacting                                                                                                      |
| `brand_name`                                                              | VARCHAR      | Brand / trade name from openFDA enrichment                                                                                               |
| `generic_name`                                                            | VARCHAR      | Generic / non-proprietary name                                                                                                           |
| `manufacturer_name`                                                       | VARCHAR      | Manufacturer from openFDA enrichment                                                                                                     |
| `product_ndc`                                                             | VARCHAR      | National Drug Code. May be a `;` -separated list when one substance has multiple NDCs. SPLIT+FLATTEN before JOIN to DRUG\_NDC\_DIRECTORY |
| `pharm_class_epc`                                                         | VARCHAR      | Established Pharmacologic Class (e.g. `'HMG-CoA Reductase Inhibitor [EPC]'`)                                                             |
| `pharm_class_moa`, `pharm_class_pe`, `pharm_class_cs`                     | VARCHAR      | Mechanism of Action / Physiologic Effect / Chemical Structure pharm classes                                                              |
| `rxcui`                                                                   | VARCHAR      | RxNorm CUI. JOIN to RxNorm for clinical-vocabulary cross-references                                                                      |
| `unii`                                                                    | VARCHAR      | FDA UNII (Unique Ingredient Identifier)                                                                                                  |
| `application_number`                                                      | VARCHAR      | FDA application number (NDA/ANDA/BLA prefix)                                                                                             |
| `drug_indication`, `drug_dosage_text`, `drug_start_date`, `drug_end_date` | VARCHAR/DATE | Indication, dosage, therapy window                                                                                                       |
| `action_drug_decoded`                                                     | VARCHAR      | Drug withdrawn / Dose reduced / Dose increased / Dose not changed / Unknown / Not applicable                                             |

### DRUG\_REPORT\_SOURCES: Reporter / Sender / Receiver Provenance

One row per (`safety_report_id`, `source_kind` ∈ {primary, sender, receiver}). Lets you trace which organization filed each report, which qualification level (physician, consumer, etc.) the reporter held, and any literature reference for study-derived cases.

### DRUG\_REPORT\_DUPLICATES: Multi-Source Dedup Chain

One row per `reportduplicate[]` entry, present when the same case was filed by multiple sources (e.g. manufacturer + foreign regulatory authority). Lets you walk the cross-source dedup chain when reconciling reports.

## Medical Device Adverse Event Tables (formerly MAUDE)

The device stream covers medical device adverse event reports submitted via the Medical Device Reporting (MDR) regulation. JOIN every device table on `report_number`.

### DEVICE\_REPORTS: MDR Report Headers

Header-level medical device reports, one row per `report_number`. Carries event classification (`event_type`: Death / Injury / Malfunction / Other), dates (`date_received`, `date_of_event`, `report_date`), native BOOLEAN flags (`adverse_event_flag`, `product_problem_flag`, `single_use_flag`, `reprocessed_and_reused_flag`, `implant_flag`), the full `manufacturer_contact_*` address block, distributor info, recall references (`removal_correction_number`, `pma_pmn_num`), and the back-compat first-narrative field `mdr_text_narrative`.

| Column                                                                                    | Type    | Description                                                                            |
| ----------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------- |
| `report_number`                                                                           | VARCHAR | Primary key: MDR (Medical Device Report) number                                        |
| `event_type`                                                                              | VARCHAR | `'Death'`, `'Injury'`, `'Malfunction'`, `'Other'`, `'No answer provided'` (title-case) |
| `date_received`                                                                           | DATE    | Date FDA received the report (default cutoff: 2020-01-01)                              |
| `date_of_event`                                                                           | DATE    | Date the adverse event physically occurred                                             |
| `adverse_event_flag`                                                                      | BOOLEAN | TRUE when event involved patient harm                                                  |
| `product_problem_flag`                                                                    | BOOLEAN | TRUE when a product problem contributed; see DEVICE\_PROBLEMS for the per-problem rows |
| `single_use_flag`, `reprocessed_and_reused_flag`, `implant_flag`                          | BOOLEAN | Native flags for downstream filtering                                                  |
| `manufacturer_contact_country`, `manufacturer_contact_state`, `manufacturer_contact_city` | VARCHAR | Full HQ address block for the manufacturer's reporting contact                         |
| `distributor_name`, `distributor_city`, `distributor_state`                               | VARCHAR | Distributor identification                                                             |
| `pma_pmn_num`                                                                             | VARCHAR | Top-level PMA / 510(k) reference                                                       |
| `removal_correction_number`                                                               | VARCHAR | Recall / correction action reference (Z-number)                                        |

### DEVICE\_DETAILS: Device Identification per Report

Line-level device identification, with multiple rows per `report_number` if multiple devices were implicated. Carries brand / generic / model / catalog / lot, parsed numeric device age, the manufacturer's device-side address block, FDA product code, and the openFDA classification cross-reference set (`openfda_pma_number`, `openfda_k_number`, `openfda_fei_number`, `openfda_registration_number`, `openfda_implant_flag`, `openfda_life_sustain_support_flag`, `openfda_class_advisor_committee`).

The most important field is `device_report_product_code`, the FDA 3-letter device code, which joins **DEVICE\_CLASSIFICATION** on `product_code` at near-complete coverage, enriching every device-event row with the full FDA classification context (device class, medical specialty, regulation number, implant flag, life-sustain support flag).

### DEVICE\_NARRATIVES: Full-Text Event Narratives

Full event / manufacturer-evaluation / additional-narrative text per device adverse event report. Multiple rows per `report_number`. `text_type_code` distinguishes `'Description of Event or Problem'` from `'Manufacturer Narrative'` and `'Additional Manufacturer Narrative'`.

**No 16K truncation, both Description AND Manufacturer narrative types**: narratives carry up to \~10 million characters per row, and reports with multiple narrative types (Description of Event, Manufacturer Narrative, Additional Manufacturer Narrative) keep each one on its own row. Full-text search hits the complete investigative record.

### DEVICE\_PATIENTS: 2017-Expanded Patient Demographics

One row per patient\[] entry per device adverse event report. Carries `patient_age` + `patient_age_unit` (YR/MO/DA/WK), `patient_sex`, `patient_weight` + `patient_weight_unit`, plus the **2017-expanded** demographics: `patient_ethnicity`, `patient_race`, `patient_problems` (semicolon-joined list of what was happening to the patient), and the `sequence_number_outcome` / `sequence_number_treatment` arrays.

### DEVICE\_PROBLEMS: Product-Problem Codes per Report

One row per (`report_number`, `product_problem`): when a device adverse event involved multiple product problems, each problem gets its own row. Filter with `WHERE product_problem = 'Device Sensing Problem'` to find every report that cited that specific problem, no string parsing required.

## Reference Tables

### DEVICE\_CLASSIFICATION: FDA Device Product-Code Reference

FDA device product-code reference table, one row per 3-letter `product_code` (\~7K codes). Carries `device_name`, `regulation_number` (21 CFR), `medical_specialty` + description, `device_class` (1/2/3), and native BOOLEAN flags (`implant_flag`, `life_sustain_support_flag`, `gmp_exempt_flag`, `third_party_flag`); filter directly with `WHERE implant_flag = TRUE`, no string parsing. Includes openFDA cross-reference arrays (`openfda_k_number`, `openfda_fei_number`, `openfda_registration_number`).

**Join coverage:** Near-complete; virtually every `DEVICE_DETAILS` row with a `device_report_product_code` finds a matching `DEVICE_CLASSIFICATION.product_code`. This is the clean substitute for any device-class enrichment work. Use this view in preference to the openFDA enrichment columns directly on DEVICE\_DETAILS.

### DRUG\_NDC\_DIRECTORY: National Drug Code Reference

National Drug Code reference covering 100K+ NDCs. Carries `brand_name`, `generic_name`, `labeler_name`, `manufacturer_name`, `product_type` (`'HUMAN PRESCRIPTION DRUG'` / `'HUMAN OTC DRUG'` / `'VACCINE'` / etc.), `marketing_category` (NDA / ANDA / BLA / OTC monograph final), parsed marketing-start/end/expiration dates, `dea_schedule` (controlled-substance flag), `dosage_form`, `route`, and a full openFDA enrichment block (`spl_id`, `spl_set_id`, `rxcui`, `unii`, `nui`, `application_number`, all 4 pharm\_class variants).

**JOIN pattern (CRITICAL):** when joining from `DRUG_SUBSTANCES`, the `product_ndc` column is a `;` -separated list of NDCs (one substance can carry multiple NDCs). You MUST `SPLIT_TO_TABLE` + `LATERAL FLATTEN` before equality-joining, which boosts the hit rate from \~12% to \~98%. See the example below.

## Pre-Built Signal Aggregates (Paid-Only)

These five tables are pre-computed aggregations powered by the underlying drug and device streams. They make pharmacovigilance signal detection and executive reporting one-query operations instead of multi-CTE rollups against the full report history.

### DRUG\_REACTION\_ASSOCIATIONS: PRR Safety Signals

One row per (`substance_name`, `reaction_meddra_pt`) pair. Carries the full 2×2 contingency for **Proportional Reporting Ratio (PRR)**: `report_count`, `total_drug_reports`, `total_reaction_reports`, `total_reports` plus `prr_score`, `prr_lower_95`, `prr_upper_95` (Evans et al. 2001 formula), and the boolean `is_signal` flag (TRUE when `prr_score >= 2.0 AND report_count >= 3 AND prr_lower_95 >= 1.0`, the FDA's signal threshold). Filter `WHERE is_signal = TRUE` for emerging safety signals; sort by `prr_score DESC` within a substance for strongest associations.

### DRUG\_SAFETY\_TRENDS: Time-Series by Substance × Reaction

Monthly / Quarterly / Yearly time-series per (substance, reaction) pair. Carries `event_count`, `serious_events`, `death_events`, `serious_rate`, `death_rate`, `prior_event_count` (LAG), `yoy_event_count` (year-ago), `yoy_change_pct`, and `trend_direction` (INCREASING when YoY >= +20%, DECREASING when <= -20%, STABLE otherwise, NEW when no prior-year comparison). Filter `period_type = 'QUARTER'` and a substance name for a single drug's trajectory.

### DRUG\_MANUFACTURER\_EVENTS: Drug Manufacturer Rollups

One row per manufacturer with `total_events`, `unique_drugs`, all seriousness rollups (`serious_events`, `death_events`, `life_threatening_events`, `hospitalization_events`, `disability_events`), drug-characterization splits (suspect / concomitant / interacting), `top_substance`, `top_substance_count`, reporting-window dates, and a coarse `risk_class` banding (HIGH / MEDIUM / LOW / MINIMAL) for at-a-glance triage. Powers competitive intelligence + investor due diligence on the drug side.

### DEVICE\_MANUFACTURER\_EVENTS: Device Manufacturer Rollups

One row per (`manufacturer_name`, `manufacturer_d_country`) for geography drill-down. Carries `total_reports`, event-type splits (`death_count`, `injury_count`, `malfunction_count`, `other_count`), product-problem / adverse-event rates, `unique_devices`, `reports_last_12_months`, `top_product_code` (JOIN to DEVICE\_CLASSIFICATION for context), and the same `risk_class` banding.

### DEVICE\_EXECUTIVE\_DASHBOARD: Board-Ready Device KPIs

Board-deck-ready KPIs in relational shape. Grain: one row per (manufacturer × device\_class × medical\_specialty × quarter), with convenience columns `report_year` and `report_quarter`. Carries `total_reports`, `rolling_4q_reports` (trailing 12-month sum), `prior_year_reports`, `yoy_delta`, event-type rates, and `top_product_problem` + count. Powers BI dashboards without scanning the full DEVICE\_REPORTS history.

## Getting Started: How to Query FDA AEMS Data

### Platform Schema Reference

This dataset is available on both Snowflake and Databricks. Queries use schema-only references; the database is already set by the share or catalog context.

| Platform       | Schema         | Example                     |
| -------------- | -------------- | --------------------------- |
| **Snowflake**  | `DWV`          | `DWV.DRUG_REPORTS`          |
| **Databricks** | `fda_aems_dwv` | `fda_aems_dwv.drug_reports` |

### Data Freshness Check

Quick sanity check to confirm the dataset has loaded recent openFDA data for both streams:

{% tabs %}
{% tab title="Snowflake" %}

```sql
-- Data freshness: should be within ~7 days of today
SELECT 'DRUG_REPORTS' AS stream, MAX(receive_date) AS latest_report
FROM DWV.DRUG_REPORTS
UNION ALL
SELECT 'DEVICE_REPORTS', MAX(date_received)
FROM DWV.DEVICE_REPORTS;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT 'DRUG_REPORTS' AS stream, MAX(receive_date) AS latest_report
FROM fda_aems_dwv.drug_reports
UNION ALL
SELECT 'DEVICE_REPORTS', MAX(date_received)
FROM fda_aems_dwv.device_reports;
```

{% endtab %}
{% endtabs %}

### Top Drug Adverse Reactions

Find the most commonly reported adverse reactions across all drug reports, the classic pharmacovigilance "what reactions are showing up" question.

{% tabs %}
{% tab title="Snowflake" %}

```sql
SELECT r.reaction_meddra_pt,
       COUNT(*) AS report_count,
       SUM(CASE WHEN rpt.serious THEN 1 ELSE 0 END) AS serious_count
FROM DWV.DRUG_REACTIONS r
JOIN DWV.DRUG_REPORTS rpt
    ON r.safety_report_id = rpt.safety_report_id
GROUP BY r.reaction_meddra_pt
ORDER BY report_count DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT r.reaction_meddra_pt,
       COUNT(*) AS report_count,
       SUM(CASE WHEN rpt.serious THEN 1 ELSE 0 END) AS serious_count
FROM fda_aems_dwv.drug_reactions r
JOIN fda_aems_dwv.drug_reports rpt
    ON r.safety_report_id = rpt.safety_report_id
GROUP BY r.reaction_meddra_pt
ORDER BY report_count DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

### Drug Adverse Events by Substance (with Pharm-Class Enrichment)

Analyze adverse event counts and seriousness by drug substance with the full pharm-class enrichment available on `DRUG_SUBSTANCES`:

{% tabs %}
{% tab title="Snowflake" %}

```sql
SELECT s.substance_name, s.pharm_class_epc, s.pharm_class_moa,
       COUNT(DISTINCT rpt.safety_report_id) AS total_reports,
       SUM(CASE WHEN rpt.seriousness_death THEN 1 ELSE 0 END) AS death_reports,
       SUM(CASE WHEN rpt.seriousness_hospitalization THEN 1 ELSE 0 END) AS hospital_reports
FROM DWV.DRUG_SUBSTANCES s
JOIN DWV.DRUG_REPORTS rpt
    ON s.safety_report_id = rpt.safety_report_id
WHERE s.substance_name IS NOT NULL
GROUP BY s.substance_name, s.pharm_class_epc, s.pharm_class_moa
ORDER BY total_reports DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT s.substance_name, s.pharm_class_epc, s.pharm_class_moa,
       COUNT(DISTINCT rpt.safety_report_id) AS total_reports,
       SUM(CASE WHEN rpt.seriousness_death THEN 1 ELSE 0 END) AS death_reports,
       SUM(CASE WHEN rpt.seriousness_hospitalization THEN 1 ELSE 0 END) AS hospital_reports
FROM fda_aems_dwv.drug_substances s
JOIN fda_aems_dwv.drug_reports rpt
    ON s.safety_report_id = rpt.safety_report_id
WHERE s.substance_name IS NOT NULL
GROUP BY s.substance_name, s.pharm_class_epc, s.pharm_class_moa
ORDER BY total_reports DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

### Device Narratives: Full-Text Signal Search

Search the full device-event narrative corpus (no 16K truncation, both Description and Manufacturer narrative types) for keywords:

{% tabs %}
{% tab title="Snowflake" %}

```sql
SELECT n.report_number, n.text_type_code, dr.event_type, dr.date_received,
       LEFT(n.text, 400) AS narrative_preview
FROM DWV.DEVICE_NARRATIVES n
JOIN DWV.DEVICE_REPORTS dr
    ON n.report_number = dr.report_number
WHERE UPPER(n.text) LIKE '%MALFUNCTION%'
  AND dr.event_type IN ('Injury', 'Death')
ORDER BY dr.date_received DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT n.report_number, n.text_type_code, dr.event_type, dr.date_received,
       LEFT(n.text, 400) AS narrative_preview
FROM fda_aems_dwv.device_narratives n
JOIN fda_aems_dwv.device_reports dr
    ON n.report_number = dr.report_number
WHERE UPPER(n.text) LIKE '%MALFUNCTION%'
  AND dr.event_type IN ('Injury', 'Death')
ORDER BY dr.date_received DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

### Device Events by Manufacturer

Analyze device adverse events by device-side manufacturer and event type:

{% tabs %}
{% tab title="Snowflake" %}

```sql
SELECT d.manufacturer_name,
       dr.event_type,
       COUNT(*) AS event_count,
       COUNT(DISTINCT dr.report_number) AS unique_reports
FROM DWV.DEVICE_DETAILS d
JOIN DWV.DEVICE_REPORTS dr
    ON d.report_number = dr.report_number
WHERE d.manufacturer_name IS NOT NULL
GROUP BY d.manufacturer_name, dr.event_type
ORDER BY event_count DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT d.manufacturer_name,
       dr.event_type,
       COUNT(*) AS event_count,
       COUNT(DISTINCT dr.report_number) AS unique_reports
FROM fda_aems_dwv.device_details d
JOIN fda_aems_dwv.device_reports dr
    ON d.report_number = dr.report_number
WHERE d.manufacturer_name IS NOT NULL
GROUP BY d.manufacturer_name, dr.event_type
ORDER BY event_count DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

### Pharmacovigilance Signal Detection via PRR

Find emerging drug-reaction safety signals using **Proportional Reporting Ratio (PRR)** with 95% confidence intervals (Evans et al. 2001). The `is_signal` flag is TRUE when `prr_score >= 2.0 AND report_count >= 3 AND prr_lower_95 >= 1.0` (the FDA's standard signal-detection threshold):

{% tabs %}
{% tab title="Snowflake" %}

```sql
SELECT substance_name, reaction_meddra_pt,
       report_count, serious_count, death_count,
       ROUND(prr_score, 2) AS prr_score,
       ROUND(prr_lower_95, 2) AS prr_lower_95,
       ROUND(prr_upper_95, 2) AS prr_upper_95,
       first_seen_date, last_seen_date
FROM DWV.DRUG_REACTION_ASSOCIATIONS
WHERE is_signal = TRUE
  AND report_count >= 10
ORDER BY prr_score DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT substance_name, reaction_meddra_pt,
       report_count, serious_count, death_count,
       ROUND(prr_score, 2) AS prr_score,
       ROUND(prr_lower_95, 2) AS prr_lower_95,
       ROUND(prr_upper_95, 2) AS prr_upper_95,
       first_seen_date, last_seen_date
FROM fda_aems_dwv.drug_reaction_associations
WHERE is_signal = TRUE
  AND report_count >= 10
ORDER BY prr_score DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

### Device Classification Cross-Reference

Enrich device adverse events with FDA product-code classification, filtering to life-sustaining / life-supporting devices with fatal outcomes:

{% tabs %}
{% tab title="Snowflake" %}

```sql
SELECT dr.report_number, dr.event_type,
       d.brand_name, d.device_report_product_code,
       dc.device_name AS classification_name,
       dc.device_class, dc.regulation_number,
       dc.medical_specialty_description,
       dc.life_sustain_support_flag
FROM DWV.DEVICE_REPORTS dr
JOIN DWV.DEVICE_DETAILS d
    ON dr.report_number = d.report_number
JOIN DWV.DEVICE_CLASSIFICATION dc
    ON d.device_report_product_code = dc.product_code
WHERE dc.life_sustain_support_flag = TRUE
  AND dr.event_type = 'Death'
ORDER BY dr.date_received DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
SELECT dr.report_number, dr.event_type,
       d.brand_name, d.device_report_product_code,
       dc.device_name AS classification_name,
       dc.device_class, dc.regulation_number,
       dc.medical_specialty_description,
       dc.life_sustain_support_flag
FROM fda_aems_dwv.device_reports dr
JOIN fda_aems_dwv.device_details d
    ON dr.report_number = d.report_number
JOIN fda_aems_dwv.device_classification dc
    ON d.device_report_product_code = dc.product_code
WHERE dc.life_sustain_support_flag = TRUE
  AND dr.event_type = 'Death'
ORDER BY dr.date_received DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

### NDC Directory Drill-Down (Multi-NDC SPLIT/FLATTEN)

Enrich drug substances with the full NDC directory context. `DRUG_SUBSTANCES.product_ndc` is a `;` -separated list of NDCs when a substance has multiple codes, so `SPLIT` + `LATERAL FLATTEN` before equality-joining to `DRUG_NDC_DIRECTORY` for full coverage (\~98% hit rate vs \~12% without splitting):

{% tabs %}
{% tab title="Snowflake" %}

```sql
WITH ndcs AS (
  SELECT s.safety_report_id, s.substance_name, s.product_ndc AS raw_ndcs,
         TRIM(t.value::STRING) AS single_ndc
  FROM DWV.DRUG_SUBSTANCES s,
       LATERAL FLATTEN(SPLIT(s.product_ndc, '; ')) t
  WHERE s.product_ndc IS NOT NULL AND s.product_ndc != ''
)
SELECT n.safety_report_id, n.substance_name, n.single_ndc AS product_ndc,
       nd.brand_name AS ndc_brand,
       nd.marketing_category, nd.dea_schedule,
       nd.dosage_form, nd.route, nd.package_ndcs
FROM ndcs n
JOIN DWV.DRUG_NDC_DIRECTORY nd ON n.single_ndc = nd.product_ndc
WHERE nd.dea_schedule IS NOT NULL
ORDER BY n.safety_report_id DESC
LIMIT 25;
```

{% endtab %}

{% tab title="Databricks" %}

```sql
WITH ndcs AS (
  SELECT s.safety_report_id, s.substance_name, s.product_ndc AS raw_ndcs,
         TRIM(t.value::STRING) AS single_ndc
  FROM fda_aems_dwv.drug_substances s
       LATERAL VIEW EXPLODE(SPLIT(s.product_ndc, '; ')) t AS value
  WHERE s.product_ndc IS NOT NULL AND s.product_ndc != ''
)
SELECT n.safety_report_id, n.substance_name, n.single_ndc AS product_ndc,
       nd.brand_name AS ndc_brand,
       nd.marketing_category, nd.dea_schedule,
       nd.dosage_form, nd.route, nd.package_ndcs
FROM ndcs n
JOIN fda_aems_dwv.drug_ndc_directory nd ON n.single_ndc = nd.product_ndc
WHERE nd.dea_schedule IS NOT NULL
ORDER BY n.safety_report_id DESC
LIMIT 25;
```

{% endtab %}
{% endtabs %}

## Who Uses This Data

### Common Use Cases

* **Pharmacovigilance signal detection**: Monitor drug and biologic adverse event reports in near real-time to detect emerging safety signals, disproportionality patterns, and unexpected reactions. The `DRUG_REACTION_ASSOCIATIONS` PRR aggregate makes this a one-query operation against the full openFDA drug-event corpus.
* **Medical device post-market surveillance**: Track device-related adverse events, malfunctions, and patient injuries by product code, manufacturer, and event type to support post-market safety, recall assessment, and 522 surveillance studies.
* **Cross-product safety analysis**: Analyze adverse events across both drug and device categories to identify combination-product risks, drug-device interaction signals, and multi-product safety patterns under one consistent schema.
* **Regulatory submission support**: Generate comprehensive adverse event summaries, MedDRA-coded reaction profiles, and temporal trend analyses for regulatory submissions, REMS assessments, periodic safety reports (PSUR/PBRER), and safety label updates.
* **Competitive intelligence**: Compare adverse event profiles across competitors' products by reaction type, seriousness, and outcome to inform product positioning, M\&A diligence, and risk communication strategies.
* **Drug safety scientist daily workflow**: Search MedDRA-coded reactions, validate PRR scores, drill into individual case narratives via `patient_summary_narrative`, and trace reporter provenance via `DRUG_REPORT_SOURCES`.
* **Device safety engineering**: Search the full untruncated `DEVICE_NARRATIVES` corpus for specific failure modes, JOIN to `DEVICE_CLASSIFICATION` for device-class context, and aggregate via `DEVICE_MANUFACTURER_EVENTS` for benchmarks.

### Target Audience

Pharmacovigilance analysts · drug safety scientists · regulatory affairs · medical device safety engineers · post-market surveillance teams · biotech R\&D · pharma medical affairs · health economics / outcomes research · CROs · clinical safety database vendors · FDA / EMA submission consultants · device manufacturers · healthcare AI / NLP teams building safety models on adverse event text.

### Related Dataplex Products

This dataset pairs well with:

* [**CMS Medicaid Provider Spending**](/data-catalog/cms-medicaid-provider-spending-dataset.md): link adverse events to provider prescribing patterns for outcomes research
* [**CMS NPPES Provider Dataset**](/data-catalog/cms-nppes-provider-dataset.md): enrich reporter qualification + sender organization with NPI-level provider context
* [**FDA Total Diet Study Dataset**](/data-catalog/fda-tds-dataset.md): pair drug-substance safety with FDA's food-contaminant exposure data for combined safety analytics

### Frequently Asked Questions

**Is this a unified FDA FAERS and MAUDE adverse events dataset?** Yes. FDA AEMS is the unified successor to Dataplex's separate FAERS (drug) and MAUDE (device) products: 9M+ drug safety reports and 14M+ device adverse event reports in one schema, with consistent keys, MedDRA-coded reactions, full untruncated device narratives, and pre-built PRR signal aggregates.

**Can my AI agent query this data?** Yes. The marketplace share is read-only SQL, and an agent inside your Snowflake account can mount the listing without a browser. See the [AI Agent Quickstart](/snowflake-access/ai-agent-quickstart.md).

**What's the difference between FDA AEMS and the legacy FAERS / MAUDE datasets?** FDA AEMS is the unified successor brand. FDA consolidated FAERS (drug) and MAUDE (device) under the **Adverse Event Monitoring System (AEMS)** umbrella on openFDA. This product carries both streams under one Snowflake share with shared design conventions (native BOOLEANs, MedDRA reaction coding, full untruncated narratives, pre-built PRR aggregates), so a query learned on the drug side transfers cleanly to the device side. The standalone FDA FAERS and FDA MAUDE listings were retired in September 2026; FDA AEMS is the single place to get this data going forward.

**Why doesn't this include pre-2020 data?** The default coverage is 2020-present, which matches 99%+ of pharmacovigilance and post-market surveillance use cases (recent data drives FDA signal detection). Pre-2020 backfill is available on request: drug history goes back to 2004 and device history to 1991 in the openFDA archive. Contact our team to enable the full historical horizon for your subscription.

**How often is the data updated?** Updated daily. Our pipeline checks openFDA every day for new releases and loads new data within hours of publication, so no manual refresh is needed. The data behind your queries stays within \~24 hours of FDA's latest publish.

**Why does `reaction_meddra_pt = 'DEATH'` return zero rows?** FDA AEMS uses openFDA's title-case spelling (`'Death'`, `'Nausea'`, `'Headache'`), not the legacy uppercase FAERS spelling. Either update string literals or wrap with `UPPER(reaction_meddra_pt)` for case-insensitive filtering. This is the most common gotcha for queries written against the legacy uppercase FAERS spelling.

**Why does my `JOIN DRUG_NDC_DIRECTORY ON product_ndc` only return \~12% of substances?** Because `DRUG_SUBSTANCES.product_ndc` is a `;` -separated list when one substance carries multiple NDCs. You need to `SPLIT` + `LATERAL FLATTEN` the column before equality-joining to the NDC directory. The "NDC Directory Drill-Down" example above shows the full pattern, and the hit rate jumps from \~12% to \~98%.

**Are there known data quality issues?** None currently affecting customer-facing tables. For best device-classification context, always join `DEVICE_DETAILS.device_report_product_code` to `DEVICE_CLASSIFICATION.product_code` (near-complete hit rate, no edge cases). The reference table is the authoritative source for device class, medical specialty, regulation number, and the implant / life-sustain flags.

**Can I detect safety signals without writing PRR math from scratch?** Yes: `DRUG_REACTION_ASSOCIATIONS` carries pre-computed `prr_score`, `prr_lower_95`, `prr_upper_95` (Evans et al. 2001 formula) and an `is_signal` BOOLEAN flag implementing the FDA's standard signal threshold (PRR>=2.0 AND N>=3 AND lower-95>=1.0). One `WHERE is_signal = TRUE` filter surfaces all flagged drug-reaction pairs.

**What's the difference between `DRUG_REPORTS.serious` and the per-outcome `seriousness_*` flags?** `serious` is TRUE when ANY of the per-outcome flags is TRUE (death, hospitalization, life-threatening, disability, congenital anomaly, or "other serious outcomes"). The individual `seriousness_*` flags let you filter to a specific seriousness category, e.g., `WHERE seriousness_death = TRUE` for fatal outcomes only.

**How do I find all narratives for a specific device report?** Each `DEVICE_REPORTS` row links to multiple `DEVICE_NARRATIVES` rows (avg \~2.2 per report), one per narrative type (Description of Event, Manufacturer Narrative, Additional Manufacturer Narrative). JOIN on `report_number` and filter by `text_type_code` if you want a specific narrative type. No 16K truncation applies; text can reach \~10 million characters per row.

**What's the difference between this and querying openFDA directly?** openFDA's REST API is rate-limited (1000 requests/day unauthenticated, 240 requests/minute authenticated) and caps at 100 records per page, so a full historical pull means thousands of paginated requests and your own JSON-handling code. The Dataplex FDA AEMS Dataset gives you the same data as joinable relational tables in Snowflake or Databricks: native BOOLEAN flags, MedDRA-coded reactions, pre-built PRR safety signals, and the complete drug-report and device-report history in one SQL query, with automatic updates and no rate limits.

{% hint style="success" %}
**Ready to access FDA AEMS adverse event data?**

Questions? [Contact our team](mailto:support@dataplex-consulting.com) for a walkthrough.
{% endhint %}

| Platform       | Action                                                                                                                                  |
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Snowflake**  | [Get on Marketplace](https://app.snowflake.com/marketplace/listing/GZT1Z7QRT19A) \| [Free Trial](https://trial.dataplex-consulting.com) |
| **Databricks** | [Start 14-Day Free Trial](https://trial.dataplex-consulting.com/?platform=databricks)                                                   |

### Trial Access

The free trial provides a deterministic 1,500-drug-report + 1,500-device-report sample with all child tables (reactions, substances, report sources, duplicates, device details, narratives, patients, problems) joined to the trial seed. Every parent-child JOIN returns complete results, so you can run any of the example queries above against trial data and get accurate, representative results before subscribing. Reference tables (`DEVICE_CLASSIFICATION`, `DRUG_NDC_DIRECTORY`) include 500-row representative samples. Aggregate signal tables (`DRUG_REACTION_ASSOCIATIONS`, etc.) are paid-only because aggregates need full denominators to be meaningful.

## openFDA vs. FDA AEMS: Which Should You Use?

openFDA is free and is the source this product is built from. For a handful of one-off lookups, the openFDA API is the right tool. FDA AEMS exists for analytical workloads that the raw API is not designed for:

|                        | openFDA API (free)                        | FDA AEMS (this product)                                                         |
| ---------------------- | ----------------------------------------- | ------------------------------------------------------------------------------- |
| Access                 | JSON REST API, paginated                  | SQL on Snowflake or Databricks                                                  |
| Rate limits            | Per-key request limits and result caps    | None; it's your warehouse                                                       |
| Shape                  | Deeply nested JSON per report             | 17 analysis-ready relational tables                                             |
| Drug + device together | Two separate endpoints, different schemas | One unified schema, consistent keys                                             |
| Deduplication          | You build the multi-source dedup chain    | `DRUG_REPORT_DUPLICATES` ships resolved                                         |
| Signal detection       | You compute PRR yourself                  | Pre-built `DRUG_REACTION_ASSOCIATIONS` PRR aggregates with confidence intervals |
| Freshness              | You poll and re-ingest                    | Loaded automatically as openFDA publishes; weekly event loads                   |
| Schema stability       | Upstream changes break your parser        | Stable published tables and a customer-visible `CHANGELOG`                      |

## Data Sources & References

* [FAERS Public Dashboard](https://www.fda.gov/drugs/questions-and-answers-fdas-adverse-event-reporting-system-faers/fda-adverse-event-reporting-system-faers-public-dashboard): FDA's own drug-event explorer
* [MAUDE Search](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfmaude/search.cfm): FDA's own device-event search interface
* [MedDRA](https://www.meddra.org/): the Medical Dictionary for Regulatory Activities used for reaction coding
* [FDA Product Code Database](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpcd/pcdsimplesearch.cfm): device product-code reference (also available as `DEVICE_CLASSIFICATION`)

## Important Data Interpretation Guidelines

Adverse event reports are voluntary and do not undergo extensive FDA validation. They may be incomplete, inaccurate, or duplicative. A causal relationship cannot be established between a drug or device and the reported reaction based solely on this data. Reports represent a small fraction of total drug or device use and should not be the sole basis for clinical decisions. Use FDA AEMS for signal detection, hypothesis generation, post-market surveillance, and regulatory submission support, not as definitive evidence of causation.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.dataplex-consulting.com/data-catalog/fda-aems-dataset.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
