Healthcare data

Pharma and medical devices on US, EU and AU official sources, in two groups: hosted APIs — corpus queries (search / read) and hub REST direct calls to the production store, both token-authenticated; and local keyless APIs — realtime faces that run on your machine straight against the official upstreams, each with its parameter table.

Hosted APIs

Both hosted channels live in this section: corpus queries (search / read, access token) and hub REST direct calls to the production store (subject token).

Corpus queries: search / read (access token)

The datasets search and read answer from — the corpus is collected continuously from these official sources, every row carrying its reasoning, an evidence quote and an official source URL:

Dataset Upstream What it holds
FDA drug approvals (drugsfda) openFDA Drug approval records
FDA device records (UDI) openFDA Device registration & listing, UDI identifiers, establishment roles
Orange Book openFDA Therapeutic equivalence evaluations and marketing status
Purple Book FDA Biological product approvals and status
NPPES NPPES NPI Registry Provider & organization NPI directory (taxonomy_code, comparable across sources)
OpenPayments CMS OpenPayments Annual aggregates of manufacturer payments to providers (program_year)

Corpus snapshot: 7,577,069 searchable rows (as_of 2026-10-27); figures move as the corpus updates. Two commands cover the whole corpus — slice a list, or drill into one subject:

The examples below omit the leading executable name — prepend agentdata (or python -m agentdata ) for a full command.

$ healthcare search --filter subject_kind=institution --limit 5
$ healthcare read --id 1476 --level tier2

The two corpus faces and their parameters (introspected, same source as the CLI reference):

Corpus search (hosted, PAT required): filters/record_kind/level/pagination

Flag Required Meaning
--filter no Filter K=V (repeatable; the filterable fields are listed on this page)
--record-kind no Record kind (closed set; values in the domain spec)
--facets no Comma-separated fields to return facet counts for
--level no Read-layer depth (default tier1; see the read layers on this page)
--limit no Rows per page (default 50, max 1000)
--cursor no Pagination cursor (feed next_cursor from the response)
--mode no Special mode: screen (batch screening; requires --input)
--input no Input JSONL file for batch screening (with --mode screen)

healthcare read

Corpus single-record read (hosted): id + T-layer depth

Flag Required Meaning
--id yes Subject id (from search result rows)
--level no Read-layer depth (default tier1)

Filters — controlled filter fields

Record kind: qualification — official qualifications/registrations, including institutional subject rows. Filters are grouped by it.

Undeclared fields are a 400 error (a typo never returns a silent empty result). The Status column updates automatically with the fields actually open at the interface — fields marked Open are filterable; fields marked Not open cannot be filtered. A miss is never proof of absence — coverage follows the source.

filter Type Applies to record_kind Description Status
record_kind keyword all Record layer: qualification = official qualifications/registrations (including institutional subject rows) Open
qtype keyword qualification Closed qualification-type set (fda_* / us_* and more; facets shows the full set) Open
status keyword qualification Status polarity (matched verbatim; negative facts never default to "active") Open
license_no keyword qualification License numbers (NDC / permit no. / CCN / NPI) — precise fact anchors, never subject merge keys Open
product_name keyword qualification Drug/product name (contains semantics; package specs in T2 spec_note) Open
approval_year range qualification Approval year (extracted from approval_date / marketing_start_date / issue_date) Open
effective_from / effective_until range qualification Permit validity interval (issue_date to expiry_date; expired rows stay out of the "currently active" projection) Open
hospital_type keyword qualification Hospital type (CMS: Acute Care Hospitals…) Open
ownership keyword qualification Ownership (CMS: Government / Proprietary…) Open
taxonomy_code keyword qualification NPPES taxonomy code (same code table as CMS, comparable across sources) Open
program_year range qualification OpenPayments program year (2023-2025 window) Open
payment_amount_usd range qualification Annual payments received, USD (the field name carries the currency — do not pair non-USD values) Open
company_registration_country keyword all Row-level country (US and more; mostly null on the openfda/OpenPayments lines — coverage follows the source, facets shows the null volume) Open
subject_kind keyword all company institution
source / source_observed_at keyword / range all Source and observation time (snapshot / event / interval semantics) Not open
device_class / medical_specialty keyword qualification Device class Ⅰ/Ⅱ/Ⅲ / device panel specialty Not open
establishment_type keyword qualification Establishment role Manufacturer / Importer… Not open
facility_address_country keyword qualification Facility address country (≠ subject registration country) Not open
condition_mesh / phase / sponsor_class keyword / range qualification Clinical-trial dimensions (indications must be MeSH descriptors) Not open

Suggested facets (open fields): qtype / subject_kind / company_registration_country / program_year (record_kind attached by default).

Read · Read layers

Layer Contents
T1 Subject card: name / subject kind (company
T2 qualification details (qtype / product / fact keys / approval or validity / status / evidence quote — approval rows carry openFDA verbatim row quotes); institution profile (hospital_type / ownership / taxonomy_code); OpenPayments annual aggregates (program_year / total USD / nature distribution)
T3 Evidence pack: official URL + content hash (sha256) + fetch time + source batch + shard:row (source_row_key); no personal contact columns in payloads (absent from ingestion onward)

Use cases — corpus queries

Each use case has three parts: the task, a command you can run as-is, and an excerpt of the response. Corpus responses are excerpted from the OpenAPI contract — row contents vary with your filters; the real-output examples inside each local face block below are real command output.

search · slice a registry list

**Use case:**You need the institutions slice (hospitals / CMS facilities / NPPES organizations), or the OpenPayments rows for one program year — subject_kind / program_year filter it directly.

$ healthcare search --filter subject_kind=institution --limit 5
$ healthcare search --filter program_year=2024 --limit 5
{ "domain": "healthcare", "backend": "db", "coverage": "…",
  "rows": [ { "cursor": "…", "record_kind": "…",
              "entity": {"…": "…"}, "reason": "…",
              "evidence": [ { "anchor": "…", "quote": "…", "url": "…", "raw_path": "…", "sha256": "…" } ],
              "source": { "source": "…", "observed_at": "…" } } ],
  "facets": { "qtype": [ { "value": "…", "count": 123 } ] },
  "total_matched": 1968, "next_cursor": "…", "notes": ["…"] }

A misspelled filter field returns 400 undeclared_field — never a silent empty result; feed next_cursor back to page.

read · drill into one subject

**Use case:**A row surfaced in the slice — T2 pulls the qualification details; T3 (table above) is the evidence pack with sha256 and in-document anchors for clicking back to the original disclosure.

$ healthcare read --id 1476 --level tier2

Every result carries its reasoning, an evidence quote and a source URL; the T1/T2/T3 layers are summarized in the table above.

Chain the two families

**Use case:**The slice shortlists a hospital or pharma company; the realtime faces then answer the incremental questions — which trials is this company recruiting (CT.gov), where is the drug's official labeling (DailyMed):

$ healthcare ctgov_studies --filter.advanced 'AREA[LeadSponsorName]("<company>") AND AREA[OverallStatus](RECRUITING)' --page-size 5
$ healthcare dailymed_spls --search "<generic name>" --pagesize 5

hub REST direct calls (production, US faces)

Status note (read first — avoid misreading): healthcare data travels over two channels — the SDK corpus queries (search/read) answer from the corpus face above; hub REST is the other, live channel: REST read faces under /v1/us/* at the production base https://hub.omnimay.com, callable now by holders of a subject token. Key facts below.

  • Base: https://hub.omnimay.com; the US faces live under /v1/us/* — 13 read faces: six domains (drug approvals / device approvals / risk events / institutions / clinical trials / pricing) each with list+get, plus the US monthly aggregate timeline.
  • Auth: every request carries Authorization: Bearer <subject JWT> (RS256; all six claims iss/aud/sub/iat/exp/jti required; token lifetime defaults to 300s, capped at 3600s; service:-prefixed subjects always get 403).
  • Response envelope: {"items":[…],"limit":<int>,"next_cursor":<string|null>}; limit 1..100 defaulting to 20; keyset pagination in descending ingestion-time order (pass next_cursor back verbatim).
  • Error shapes: 401 (missing/bad/expired Bearer) · 403 (service subjects) · 404 HEALTHCARE_NOT_FOUND · 400 CURSOR_INVALID · 400/422 PARAM_INVALID · 422 PRODUCT_KIND_MISMATCH (approval face mismatch) · 500.
  • Known limitations (read before integrating): all parameters AND-combine (no _or/_not, no multi-value); no count endpoint, no facets; date ranges exist only on the risk face (date_from/date_to); prices are not filterable by amount; undeclared parameters are silently ignored.

Local keyless APIs

The 31 faces below run on your machine, direct to the official upstream: no account or key, no platform-side quota — each upstream's own limits apply, and repeats within a cache lifetime are served from your local cache. Every result carries the upstream's official URL so you can verify the original. Each face carries its parameter table and a real-output example (real command output, excerpts only — running it returns whatever the official source holds at that moment, so figures shift as upstreams update); the full flag set also lives in the CLI reference.

The examples below omit the leading executable name — prepend agentdata (or python -m agentdata ) for a full command.

healthcare au_tga_artg

Australian Therapeutic Goods Register (ARTG) lookup.

Jurisdiction: AU

Flag Required Meaning
--query no Free-text words, ANDed across fields; for an exact sponsor match put the name in double quotes, e.g. "Sun Pharma ANZ Pty Ltd"
--limit no Rows (cap 100, default 20)
--skip no Rows to skip (default 0)

Note: Pages cap at 100 (--skip continues); --query is an AND-words search across all fields — a broad word brings the whole product family, so query with the full product name when you need precision.

$ healthcare au_tga_artg --query paracetamol --limit 2
{
  "reason": "TGA ARTG 注册册:检索「paracetamol」 命中 1 条(本页,Sponsor 列自证)",
  "result": {
    "rows": [
      { "product_name": "APO-PARACETAMOL paracetamol 500mg tablets bottle",
        "artg_id": "156815",
        "pi_cmi": null,
        "product_type": "Medicine",
        "sponsor": "Arrotex Pharmaceuticals Pty Ltd",
        "doc_url": "https://www.ebs.tga.gov.au/ebs/ANZTPAR/PublicWeb.nsf/5a7ce0ae150c481fca2579340013ce64/cd31e5c61d7ed808ca25885500428402?OpenDocument&Highlight=0,paracetamol" }
    ],
    "count": 1,
    "has_more": false,
    "query": "paracetamol"
  },
  "evidence": [
    { "quote": "156815 APO-PARACETAMOL paracetamol 500mg tablets bottle = Arrotex Pharmaceuticals Pty Ltd(Medicine)",
      "url": "https://www.ebs.tga.gov.au/ebs/ANZTPAR/PublicWeb.nsf/5a7ce0ae150c481fca2579340013ce64/cd31e5c61d7ed808ca25885500428402?OpenDocument&Highlight=0,paracetamol" }
  ],
  "source": { "provider": "au_tga", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-30T07:36:35.476Z" }
}

healthcare au_tga_manufacturers

Australian registered manufacturers list (filterable by state).

Jurisdiction: AU

Flag Required Meaning
--state no State filter, e.g. QLD / NSW / VIC (local filter on SiteState)
--limit no Rows (cap 500, default 100)

Note: --state is a local post-filter (no such upstream parameter; filters on SiteState) — the whole register fits one call (cap 500), no pagination assembly needed.

$ healthcare au_tga_manufacturers --state QLD --limit 2
{
  "reason": "TGA MIS 执照册:全册 445 张,返回 2 张(州筛 QLD)——QLD 2",
  "result": {
    "rows": [
      { "issue_date": "1991-10-21", "licence_number": "MI-26112004-LI-000238-1", "manufacturer_id": "18",
        "address": "100 & 102 Antimony & 11 & 15-25 Garnet Street, CAROLE PARK, QLD, 4300",
        "state": "QLD", "manufacturer": "Alphapharm Pty Ltd" }
    ],
    "total": 445,
    "count": 2,
    "limit_applied": 2
  },
  "evidence": [
    { "quote": "MI-26112004-LI-000238-1 = Alphapharm Pty Ltd(QLD)",
      "url": "https://www.ebs.tga.gov.au/ebs/ANZTPAR/PublicWeb.nsf/luPortalManufacturers?ReadViewEntries&outputformat=json&count=500" }
  ],
  "source": { "provider": "au_tga", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-30T07:36:42.589Z" }
}

healthcare ca_dpd_companies

Canada Drug Product Database companies: DIN owners × company code, with type and full address.

Jurisdiction: CA

Flag Required Meaning
--limit no Rows (default 200 — the upstream serves the whole register in one shot, this slices locally)
--skip no Rows to skip (default 0, local slice)

healthcare ca_dpd_drug_products

Canadian drug products: DIN × brand name × company, filtered by the market-status closed set.

Jurisdiction: CA

Flag Required Meaning
--status yes Market status, closed set, required: 1=Approved 2=Marketed 3=Cancelled Pre-Market 4=Cancelled Post-Market 6=Dormant (no 5) — an unknown value is silently ignored upstream and dumps the whole 15MB register, so the SDK walls it first
--limit no Rows (default 200, local slice)
--skip no Rows to skip (default 0, local slice)

Note: --status is required and only takes the closed set {1, 2, 3, 4, 6} — the upstream silently ignores unknown values and returns the whole register (15MB, ~55k rows), so the SDK walls it locally first; rows carry no company_code — join on company_name or run ca_dpd_companies first.

healthcare ca_mdall_companies

Canada MDALL medical-device company register (a two-country register — US makers carry their country code).

Jurisdiction: CA

Flag Required Meaning
--limit no Rows (default 200 — one full shot upstream, sliced locally)
--skip no Rows to skip (default 0, local slice)

healthcare ca_mdall_licence

Single MDALL licence dossier: manufacturer block × company ID × device class and identifier family.

Jurisdiction: CA

Flag Required Meaning
--licence-id yes MDALL licence number, numeric (e.g. 111577; upstream param licenceId)
--licence-type no Licence index: active (default)
--lang no Language: eng (default)

Note: active and archived are two separate upstream indexes: an inactive licence needs an explicit --licence-type archived (under active it returns a 200 empty page → not_found); in the result, type echoes the index parameter while licence_type is the licence's own kind (Device Family etc.) — both keys coexist.

healthcare ctgov_studies

ClinicalTrials.gov search — by condition, sponsor or status.

Jurisdiction: US

Flag Required Meaning
--query.term no Raw query expression (official query.term syntax; by sponsor: AREA\[LeadSponsorName\]("Pfizer"))
--query.titles no Title-field search (combinable with --query.term / --query.cond)
--query.intr no Intervention-field search (drug / procedure name; combinable)
--query.cond no Condition search (combinable)
--filter.advanced no Advanced filter, AREA\[field\](value) syntax, combinable (example below)
--agg-filters no Facet filter with numeric enum values, e.g. phase:3 (the PHASE3 spelling yields zero hits)
--fields no Columns to return, comma-separated, e.g. NCTId,BriefTitle
--page-size no Rows per page (default 20; no enforced upstream cap)
--page-token no Pagination token (feed next_page_token)
--sort no Sort, e.g. EnrollmentCount:desc
--count-total, --no-count-total no Request totalCount (default on)

Note: --filter.advanced takes CT.gov AREA syntax (e.g. AREA[LeadSponsorName]("AstraZeneca")) and combines with --query.cond; a bare call with no arguments is legal upstream behavior — the first page of all studies.

$ healthcare ctgov_studies --filter.advanced 'AREA[LeadSponsorName]("AstraZeneca") AND AREA[OverallStatus](RECRUITING)' --page-size 2
{
  "reason": "CT.gov 命中 244 项,返回 2 项(续页 page_token=ZVNj7o2Elu8o3lpzTIj75q2tmpOQJJxoZven3_g)",
  "result": {
    "total": 244,
    "count": 2,
    "rows": [
      { "nct_id": "NCT06531798",
        "title": "Post-marketing Phase 4 Safety & Tolerability Study of Breztri aerosphereTM in Indian Patients With Chronic Obstructive Pulmonary Disease",
        "status": "RECRUITING", "phase": "PHASE4", "sponsor": "AstraZeneca",
        "start_date": "2026-01-20", "url": "https://clinicaltrials.gov/study/NCT06531798" }
    ],
    "next_page_token": "ZVNj7o2Elu8o3lpzTIj75q2tmpOQJJxoZven3_g",
    "page_size": 2
  },
  "evidence": [
    { "quote": "NCT06531798 Post-marketing Phase 4 Safety & Tolerability Study of Breztri aerosphereTM in Indian Patients With Chronic Obstructive Pulmonary Disease",
      "url": "https://clinicaltrials.gov/study/NCT06531798",
      "status": "RECRUITING", "phase": "PHASE4", "sponsor": "AstraZeneca" }
  ],
  "source": { "provider": "ctgov", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-27T09:33:09.760Z" }
}

healthcare dailymed_spls

US structured product labels (DailyMed SPL) search.

Jurisdiction: US

Flag Required Meaning
--search no Drug name (native drug_name channel)
--manufacturer no Labeler filter, e.g. Pfizer
--setid no Exact SPL setid filter
--page no Page number
--pagesize no Rows per page (clamped at 100 — larger asks still return 100)
--sort no Sort, e.g. published_date

Note: --pagesize is silently clamped to 100 upstream — the echoed elements_per_page is the real page width; gauge paging progress by returned rows, not by the requested value.

$ healthcare dailymed_spls --search lipitor --pagesize 2
{
  "reason": "DailyMed SPL 命中 3 份说明书,返回 2 份,上游实发 elements_per_page=2",
  "result": {
    "total": 3,
    "count": 2,
    "rows": [
      { "setid": "a60cc18b-0631-4cf0-b021-9f52224ece65",
        "title": "LIPITOR (ATORVASTATIN CALCIUM) TABLET, FILM COATED [VIATRIS SPECIALTY LLC]",
        "spl_version": 8, "published_date": "2026-07-15",
        "url": "https://dailymed.nlm.nih.gov/dailymed/drugInfo.cfm?setid=a60cc18b-0631-4cf0-b021-9f52224ece65" }
    ],
    "page": 1,
    "elements_per_page": 2
  },
  "evidence": [
    { "quote": "LIPITOR (ATORVASTATIN CALCIUM) TABLET, FILM COATED [VIATRIS SPECIALTY LLC]",
      "url": "https://dailymed.nlm.nih.gov/dailymed/drugInfo.cfm?setid=a60cc18b-0631-4cf0-b021-9f52224ece65",
      "setid": "a60cc18b-0631-4cf0-b021-9f52224ece65", "published_date": "2026-07-15" }
  ],
  "source": { "provider": "dailymed", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-27T09:35:32.100Z" }
}

Europe PMC literature search — by affiliation or topic.

Jurisdiction: GLOBAL

Flag Required Meaning
--search no Query expression, e.g. AFF:"Novartis" AND "psoriasis" (AFF filters by affiliation)
--result-type no Row depth (default lite)
--page-size no Rows per page, 1–1000 (default 25)
--cursor-mark no Pagination cursor (* = first page)
--sort no Sort, e.g. CITED desc
$ healthcare epmc_search --search 'AFF:"Novartis" AND "psoriasis"' --page-size 2
{
  "reason": "Europe PMC 命中 778 条,返回 2 条(检索式 AFF:\"Novartis\" AND \"psoriasis\"),续页 cursorMark=AoIIQGpAoig1NTMyNDM3Mg==",
  "result": {
    "hitCount": 778,
    "count": 2,
    "rows": [
      { "id": "42191094", "pmid": "42191094", "source": "MED",
        "title": "Early intervention with secukinumab prevents epigenetic scar development in new-onset psoriasis: STEPIn mechanistic substudy results.",
        "journal": "J Allergy Clin Immunol", "pub_year": "2026", "cited_by": 1,
        "url": "https://europepmc.org/article/MED/42191094" }
    ],
    "next_cursor_mark": "AoIIQGpAoig1NTMyNDM3Mg==",
    "page_size": 2
  },
  "evidence": [
    { "quote": "Early intervention with secukinumab prevents epigenetic scar development in new-onset psoriasis: STEPIn mechanistic substudy results.",
      "url": "https://europepmc.org/article/MED/42191094", "pmid": "42191094",
      "journal": "J Allergy Clin Immunol", "pub_year": "2026", "cited_by": 1 }
  ],
  "source": { "provider": "epmc", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-27T09:35:55.333Z" }
}

healthcare eudamed_devices_udi_di_data

EU UDI-DI → EUDAMED registration data.

Jurisdiction: EU

Flag Required Meaning
--primary-di yes EU UDI-DI (required)
--page no Page number (starts at 0)
--page-size no Rows per page (default 5)
--iso2-code no Response language (default en)

Note: primaryDi is unindexed upstream — a cold call routinely takes ~50s (upstream op timeout 90s; the SDK burns no retries); an occasional all-empty page is an upstream transient — the SDK discards the account and refetches once, and only a second empty page becomes not_found; keep --page-size small (the unindexed face gets slower), and paging past the end yields an empty page → not_found.

$ healthcare eudamed_devices_udi_di_data --primary-di 00191506004682
{
  "reason": "EUDAMED 主档:DI 00191506004682 → WATCHMAN FLX™(Boston Scientific Corporation,SRN US-MF-000004702;欧代 IE-AR-000003840,class-iii)——total_elements=1(page=0,page_size=2)",
  "result": {
    "primary_di": "00191506004682",
    "basic_udi": "01915060000000000000569NV",
    "trade_name": "WATCHMAN FLX™",
    "risk_class": "class-iii",
    "device_status": "on-the-market",
    "version_number": 1,
    "manufacturer": { "name": "Boston Scientific Corporation", "srn": "US-MF-000004702", "status": "active" },
    "authorised_representative": { "name": "Boston Scientific Limited", "srn": "IE-AR-000003840" },
    "uuid": "dc143619-f8c4-4849-a9f9-0f67cd3f8bb5",
    "total_elements": 1,
    "page": 0,
    "page_size": 2
  },
  "evidence": [
    { "quote": "00191506004682 = WATCHMAN FLX™ / Boston Scientific Corporation(SRN US-MF-000004702)",
      "url": "https://ec.europa.eu/tools/eudamed/api/devices/udiDiData?primaryDi=00191506004682&page=0&pageSize=2" }
  ],
  "source": { "provider": "eudamed", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-27T09:35:29.635Z" }
}

healthcare fda_crl_letters

FDA Complete Response Letters: company × negative-approval events, with approval status and letter date.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. company_name:"Firm Name" — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default letter_date:desc)

healthcare fda_device_510k

510(k) premarket notifications: K number × applicant, with decision code and decision date.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. applicant:"Medtronic" — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default decision_date:desc)

healthcare fda_device_classification

Device product-code taxonomy: device name × product code × device class; the product code joins the 510(k) / PMA / recall faces.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. device_name:"syringe" — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (this face has no date field — there is no default; give one yourself)

healthcare fda_device_pma

PMA premarket approvals and supplements: PMA number × applicant, with decision code and decision date.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. applicant:"Medtronic" — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default decision_date:desc)

healthcare fda_device_recalls

US device recalls (the RES system, full lifecycle incl. ongoing): the recalling firm's FEI number and K numbers are the join keys.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. recalling_firm:"Firm Name" (phrase form) — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default event_date_posted:desc)

healthcare fda_device_registrations

Device establishment registrations and listings (quarterly): registration number / FEI number × firm name.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. registration.name:"Firm Name" (searchable fields live in the registration.* namespace; top-level firm_name / fei_number never match) — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default registration.reg_expiry_date_year:desc)

healthcare fda_drug_approvals

Drugs@FDA application dossiers: application number × sponsor, with product lists and submission timelines.

Jurisdiction: US

Flag Required Meaning
--search no Query expression (openFDA syntax), e.g. sponsor_name:"TEVA" — the company key is sponsor_name (applicant_name is an upstream-docs illusion); keyword fields are case-sensitive in their stored form — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default submissions.submission_status_date:desc)

healthcare fda_drug_catalog

NDC product catalog (refreshed daily): product NDC × labeler, with marketing dates and category.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. labeler_name:"pfizer" for a labeler — the NDC directory refreshes daily; NSDE marketing dates live in this face — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default marketing_start_date:desc)

healthcare fda_drug_recalls

US drug recall and enforcement records (2012+): recall number × recalling firm, with class, status and reason.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. recalling_firm.exact:"Firm Name" — required at runtime: a missing expression fails locally rather than hitting upstream
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default report_date:desc)

healthcare fda_drug_shortages

US drug shortage reports (openFDA).

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. openfda.manufacturer_name.exact:"Fresenius Kabi USA, LLC" AND status:Current (openFDA syntax; manufacturer, drug and status all go into the expression)
--limit no Rows, 1–1000 (default 20)
--skip no Rows to skip (default 0)
--sort no Sort (default update_date:desc)

Note: --limit 1-1000 is an upstream hard wall — page deeper by accumulating --skip offsets (each page still ≤1000), not by raising limit.

$ healthcare fda_drug_shortages --search 'generic_name:"bupivacaine"' --limit 2
{
  "reason": "openFDA 药品短缺:命中 82 条(update_date 降序),返回 2 条,续页 skip=2——厂商名匹配 openFDA 归一层(exact 短语),母子集团不合并,落库前以 NDC/application_number 收窄",
  "result": {
    "rows": [
      { "generic_name": "Bupivacaine Hydrochloride Injection",
        "company_name": "Hospira, Inc., a Pfizer Company",
        "manufacturers": [ "Hospira, Inc." ],
        "availability": "Available", "status": "Current",
        "update_type": "Reverified", "update_date": "10/21/2026", "first_posted": "02/20/2018",
        "package_ndc": "0409-1163-01",
        "applications": [ "ANDA070597" ],
        "product_ndcs": [ "0409-1163", "0409-1159", "0409-1160" ] }
    ],
    "total": 82,
    "count": 2,
    "has_more": true,
    "search": "generic_name:\"bupivacaine\"",
    "sort": "update_date:desc"
  },
  "evidence": [
    { "quote": "Bupivacaine Hydrochloride Injection = Hospira, Inc., a Pfizer Company(Available / Current,更新 10/21/2026)",
      "url": "https://api.fda.gov/drug/shortages.json?search=generic_name%3A%22bupivacaine%22",
      "package_ndc": "0409-1163-01" }
  ],
  "source": { "provider": "shortages", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-27T09:35:39.109Z" }
}

healthcare fda_food_recalls

US food recall and enforcement records (2012+): recall number × recalling firm, with class, status and reason.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. recalling_firm.exact:"Firm Name" — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default report_date:desc)

healthcare fda_orangebook

Orange Book approved drugs: approval date × application holder, with reference-listed-drug flags.

Jurisdiction: US

Flag Required Meaning
--search no Query expression, e.g. products.application_full_name:"Teva" (the holder sits inside products[]; there is no top-level applicant field) — required at runtime: a missing expression fails locally
--limit no Rows, 1–1000 (upstream hard wall; default 20)
--skip no Rows to skip (default 0 — upstream has no cursor, deep paging relies on it)
--sort no Sort (default approval_date:desc)

healthcare gb_mhra_alert

Single UK MHRA alert dossier (notice body + PDF attachments).

Jurisdiction: GB

Flag Required Meaning
--slug yes Alert slug (from gb_mhra_alerts rows; pasting the full gov.uk link also works — a trailing .json is stripped too)

healthcare gb_mhra_alerts

UK MHRA medicines & device safety-alert search (recalls, device alerts, field safety notices).

Jurisdiction: GB

Flag Required Meaning
--q no Query (a company/product penetration channel — e.g. Abbott hits 160 alerts; omit for the full 1,462-alert register, newest first)
--count no Rows per page, 1–100 (default 20; our politeness cap — no upstream wall)
--start no Offset pagination: row to start from (default 0)

healthcare gudid_devices

US device registry (GUDID): DI / UDI → device record.

Jurisdiction: US

Flag Required Meaning
--di no Device Identifier (DI)
--udi no Full UDI string
--record-key no Record key (native GUDID row key)

Note: The upstream sits behind an AWS WAF bot gate that keys on both the client stack and your egress IP — a 2xx non-JSON body is normalized into an error with egress troubleshooting hints: check your proxy/egress or switch networks rather than retrying blindly; openFDA UDI carries the same data as the fallback.

$ healthcare gudid_devices --di 40198459305314
{
  "reason": "AccessGUDID v3 主档:di=40198459305314 → Medline Industries, Inc. / MEDLINE INDUSTRIES, INC.",
  "result": {
    "by": "di",
    "di": "40198459305314",
    "brand_name": "Medline Industries, Inc.",
    "company_name": "MEDLINE INDUSTRIES, INC.",
    "device_description": "SPINE MINOR",
    "model": "DYNJ911253",
    "mr_safety": "Labeling does not contain MRI Safety Information",
    "record_status": "Published",
    "public_version": 1,
    "product_codes": [
      { "code": "OJH", "name": "Orthopedic Tray", "device_class": "1",
        "regulation_number": "878.4800", "medical_specialty": "SU" }
    ]
  },
  "evidence": [
    { "quote": "SPINE MINOR",
      "url": "https://accessgudid.nlm.nih.gov/api/v3/devices/lookup.json?di=40198459305314" }
  ],
  "source": { "provider": "gudid", "execution": "local", "from_cache": true,
              "fetched_at": "2026-10-21T07:19:07.718Z" }
}

healthcare mesh_descriptor

MeSH descriptor lookup — normalize drug / disease terms to standard descriptors.

Jurisdiction: GLOBAL

Flag Required Meaning
--label yes Term to look up (passing term/descriptor gets a 400 upstream — use label)
--match no Match mode (default contains)
--limit no Candidates cap (default 10, max 50)

Note: mesh_ui (the D prefix) is the stable cross-library anchor — bibliographic and trial databases all resolve it; an empty candidate list means the spelling isn't in the vocabulary: the colloquial “type 2 diabetes” gets zero hits while the controlled form is “Diabetes Mellitus, Type 2” — retry with the inverted or controlled form.

$ healthcare mesh_descriptor --label aspirin --limit 3
{
  "reason": "MeSH 归一:「aspirin」→ D001241 Aspirin(同义词 17 条,权威名 Aspirin)",
  "result": {
    "candidates": [
      { "mesh_ui": "D001241", "descriptor_uri": "http://id.nlm.nih.gov/mesh/D001241", "label": "Aspirin" },
      { "mesh_ui": null, "descriptor_uri": "http://id.nlm.nih.gov/mesh/D000068342", "label": "Aspirin, Dipyridamole Drug Combination" }
    ],
    "limit_applied": 3,
    "top_descriptor": { "mesh_ui": "D001241", "label": "Aspirin", "preferred_term": "Aspirin" }
  },
  "evidence": [
    { "quote": "D001241 = Aspirin", "url": "http://id.nlm.nih.gov/mesh/D001241" }
  ],
  "source": { "provider": "mesh", "execution": "local", "from_cache": false,
              "observed_at": "2026-10-23T03:02:56.494Z" }
}

healthcare rasff_notifications

EU RASFF food-and-feed safety-alert search: notifying country × product category × risk decision.

Jurisdiction: EU

Flag Required Meaning
--subject no Free text on the alert subject (upstream param subject; e.g. aflatoxin)
--notification-reference no Reference number, exact (upstream param notificationReference; e.g. 2026.9701)
--ec-valid-date-from no Window start, dd-MM-yyyy (upstream param ecValidDateFrom; e.g. 01-09-2026 — ISO input is rejected upstream)
--ec-valid-date-to no Window end, dd-MM-yyyy (upstream param ecValidDateTo)
--page-number no Page number, 1-based (upstream param pageNumber; default 1)
--items-per-page no Rows per page, 1–200 (upstream param itemsPerPage; browser default 25, 200 is our politeness cap)

Note: The session is managed internally by a two-step handshake (the shell page mints it, then a POST with Cookie/Origin/Referer; an expired session re-mints once automatically); the enum-shaped filters (notifying country / product category / risk decision etc.) are deliberately unexposed — their parameter shapes are unpublished upstream and every probe was rejected with a generic error, so filter by subject / reference / date window first.

healthcare rxnav_rxcui_atc

RxCUI → ATC classification.

Jurisdiction: US

Flag Required Meaning
--rxcui yes Numeric RxCUI

Note: Numeric RxCUIs only — resolve drug names first via rxnav_rxcui_by_name; ingredient-level (tty=IN) RxCUIs map most reliably (brand-level BN works, but the normalization face is authoritative).

$ healthcare rxnav_rxcui_atc --rxcui 83367
{
  "reason": "RxNav ATC:RxCUI 83367 → C10AA05",
  "result": { "rxcui": "83367", "atc": [ "C10AA05" ] },
  "evidence": [
    { "quote": "RxCUI 83367 ATC = C10AA05",
      "url": "https://rxnav.nlm.nih.gov/REST/rxcui/83367/property.json?propName=ATC" }
  ],
  "source": { "provider": "rxnav", "execution": "local", "from_cache": true,
              "fetched_at": "2026-10-16T10:13:56.341Z" }
}

healthcare rxnav_rxcui_by_name

Drug or brand name → RxCUI (RxNorm official normalization).

Jurisdiction: US

Flag Required Meaning
--name yes Drug or brand name

Note: English dictionary only — Chinese drug names honestly return not_found, never fuzzy guessing; RxCUIs are immutable and cached permanently on your machine (reruns report from_cache:true).

$ healthcare rxnav_rxcui_by_name --name "atorvastatin"
{
  "reason": "RxNav 归一:药名「atorvastatin」→ RxCUI 83367(成分名级)",
  "result": { "rxcui": "83367", "normalized_name": "atorvastatin", "synonym": null,
              "tty": "IN", "suppress": "N" },
  "evidence": [
    { "quote": "RxCUI 83367 = atorvastatin",
      "url": "https://rxnav.nlm.nih.gov/REST/rxcui/83367/properties.json" }
  ],
  "source": { "provider": "rxnav", "execution": "local", "from_cache": true,
              "fetched_at": "2026-10-16T08:23:11.106Z" }
}

healthcare safety_gate_alerts

EU Safety Gate (ex-RAPEX) non-food product-safety weekly-report index.

Jurisdiction: EU

Flag Required Meaning
--year no Report year — a local post-filter, not an upstream param (the index always arrives whole)
--limit no Rows (default 200, local slice)
--skip no Rows to skip (default 0, local slice)

healthcare safety_gate_report

One Safety Gate weekly report's alerts: case number × category × risk level × notifying country × country of origin.

Jurisdiction: EU

Flag Required Meaning
--report-id yes Numeric report id (the report_id echoed by safety_gate_alerts; a pasted detail URL also works)
--limit no Rows (default 200, local slice)
--skip no Rows to skip (default 0, local slice)

The fine print

  • Coverage ≠ completeness: "no such company found" is never "does not exist / no risk"; row-level country is mostly null on the US lines — coverage follows the source, so do not infer registration country from a source's domain name.
  • Negative status is explicit: negative facts (recalls / revocations / selection cancellations) carry an explicit negative status, never a default "active"; an explicit positive status means currently on the source list.
  • License numbers are anchors, not merge keys: NDC / CCN / NPI / taxonomy_code anchor facts precisely and never decide "same subject"; fuzzy cross-jurisdiction name hits are always candidate-state.
  • Institutions kept separate: subject_kind=institution (hospitals / CMS facilities / NPPES organizations) is the institution-directory exit, never mixed into the company directory.
  • No personal contact columns: OpenPayments ships company-side annual aggregates only; NPPES / clinical-trial contact columns are stripped at the collection layer.