Datasets
Health
openFDA drug and device records, EMA medicines, NPPES providers, ClinicalTrials.gov, WHO indicators and Eurostat mortality.
Health datasets from public registries and agencies. Reference: openFDA routes and registries and statistics. Every route answers 503 terms_unread until the publisher's terms are recorded as read (Freshness).
Common behaviour#
- Change feeds: list routes are ordered by
(updated_at, key)ascending, andupdated_atmoves only when a record's content changed. Store the newestupdated_atyou handled and pass it back asupdated_since. - Prose and payload are opt-in where they are large: EMA
include=text, ClinicalTrials.govinclude=prose(page capped at 100), FDA 510(k) summariesinclude=content(page capped at 25). - Loading in stages: a
404 not_foundcan mean "not loaded yet", andmeta.statuscan bebackfilling(a first full read is still running),degraded(some partitions are stuck) ornot_loaded(NPPES, before a baseline has been applied).metasays how far the load has got. - Single-record routes take no query parameters.
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#
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#
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#
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#
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#
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#
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#
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.
Source: content/datasets/health.md