Skip to content
Aggre Docs

Loading…

Console

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, 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#

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

CategoryDatasets (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