# Health

> openFDA drug and device records, EMA medicines, NPPES providers, ClinicalTrials.gov, WHO indicators and Eurostat mortality.

Page: https://docs.aggre.org/datasets/health · Section: Datasets · All pages: https://docs.aggre.org/llms.txt

Health datasets from public registries and agencies. Reference: [openFDA routes](https://docs.aggre.org/api/data/health-openfda.md) and [registries and statistics](https://docs.aggre.org/api/data/health-registries.md). Every route answers **`503 terms_unread`** until the publisher's terms are recorded as read ([Freshness](https://docs.aggre.org/concepts/freshness.md#terms)).

## Common behaviour {#common}

- **Change feeds**: list routes are ordered by `(updated_at, key)` ascending, and `updated_at` moves only when a record's content changed. Store the newest `updated_at` you handled and pass it back as `updated_since`.
- **Prose and payload are opt-in** where they are large: EMA `include=text`, ClinicalTrials.gov `include=prose` (page capped at 100), FDA 510(k) summaries `include=content` (page capped at 25).
- **Loading in stages**: a `404 not_found` can mean "not loaded yet", and `meta.status` can be `backfilling` (a first full read is still running), `degraded` (some partitions are stuck) or `not_loaded` (NPPES, before a baseline has been applied). `meta` says how far the load has got.
- Single-record routes take no query parameters.

## openFDA {#openfda}

Nineteen openFDA datasets, each with a list route and a record route:

| Category | Datasets (`fda_{name}`) |
|---|---|
| Drugs (`/v1/health/drugs/`) | `label`, `ndc`, `drugsfda`, `orangebook`, `shortages`, `nsde`, `unii`, `substance`, `historicaldocument`, `enforcement`, `crl` |
| Devices (`/v1/health/devices/`) | `510k`, `pma`, `classification`, `udi`, `registrationlisting`, `covid19serology`, `recall`, `device_enforcement` |

Rows keep the upstream openFDA record **whole** in `payload` (nothing renamed or flattened). The list takes `key_prefix` (match on the start of the key), `updated_since`, `cursor` and `limit`; there are no per-field filters. A page is cut to a stored-size budget (4 MiB of payload), so a page can be shorter than `limit` and still have a `next_cursor`: that is normal. A key containing `/` can be sent raw or as `%2F`. `meta` says which export the rows come from and how many partitions are imported, pending or failed.

## FDA 510(k) summaries {#510k}

`GET /v1/health/devices/fda_510k_summary` serves the **extracted text** of 510(k) summary documents, one row per clearance (only those whose document produced text). Filters `k_number` (start of the number), `decision_date_from`/`decision_date_to`, `product_code`, `updated_since`. `content` is left out unless `include=content`.

## EMA medicines {#ema}

`GET /v1/health/drugs/ema_medicines` lists centrally authorised human and veterinary medicines, one row per EMA product number, withdrawn and refused ones included (`in_latest_report: false` when the newest report no longer contains one). Filters include `category`, `status`, `active_substance`, `atc_code`, `therapeutic_area` and several flags (`biosimilar`, `generic`, `conditional_approval`, ...). `GET .../ema_medicines/{product_number}` returns every column.

## NPPES providers {#nppes}

`GET /v1/health/providers/nppes` searches the NPI Registry (practice location only; no mailing address and no phone numbers). These are records about named individuals, so it is a **search, not an enumeration**: give `npi` (up to 20, comma-separated), or `state` together with `last_name`, `organization_name` (a prefix of at least 3 characters) or `taxonomy`; anything less is `400`. At most 100 per page (default 25), ordered by NPI. No change feed and no bulk route.

## ClinicalTrials.gov {#trials}

`GET /v1/health/trials/clinicaltrials_gov` lists studies, one row per NCT id. Filters `overall_status`, `study_type`, `phase`, `sponsor`, `condition`, `country`, `has_results`, `first_post_since`, `updated_since`. The array filters (`phase`, `condition`, `country`) match one element exactly as published (case-sensitive). `GET .../clinicaltrials_gov/{nct_id}` returns the whole study.

## WHO Global Health Observatory {#who}

`GET /v1/health/statistics/who_gho?indicator=...` serves one **curated** indicator at a time (the whole table is too large to page), within one `spatial_dim_type` (default `COUNTRY`; regions and the world are other types). Rows the indicator's last complete read no longer contained are returned with `in_latest_read: false`. `value_display` is WHO's own formatted string. `GET .../who_gho/indicators` is the catalogue. An indicator outside it is `404`.

## Eurostat causes of death {#eurostat}

`GET /v1/health/statistics/eurostat_mortality?icd10=...` returns the cells of one cause code (`icd10` is required: without it the list would be a dump of about 600,000 cells). `GET .../eurostat_mortality/{year}/{geo}/{icd10}` is one cell; `.../causes` and `.../places` list the cause and place codes. `value` is `null` for a status-only cell.

## Caveats {#caveats}

These are public records processed by Aggre: they are not medical advice and not a substitute for the regulator's own record. Check `license`, `attribution` and `credit` on the rows, and treat `meta.status` seriously on staged loads.
