openFDA

May 6, 2026 ยท View on GitHub

Mode: ๐ŸŒ Public ยท Domain: fda.gov

US Food & Drug Administration public data API. No API key required for modest read traffic (~240 req/min, 1000 req/day per IP). An API key bumps the daily quota but isn't needed for typical use.

Commands

CommandDescription
opencli openfda drug-label <query>Search FDA-approved drug labels by brand or generic name
opencli openfda food-recallFDA food recall and enforcement actions, most recent first

Usage Examples

# Drug label search
opencli openfda drug-label aspirin
opencli openfda drug-label lisinopril --limit 3

# Recent food recalls (no filter โ€” all recent)
opencli openfda food-recall --limit 5

# Filter to Class I (most serious) recalls
opencli openfda food-recall --classification "Class I"

# Free-text Lucene search
opencli openfda food-recall --query salmonella
opencli openfda food-recall --query listeria --status Ongoing

Output Columns

CommandColumns
drug-labelrank, id, brandName, genericName, manufacturer, productType, route, productNdc, pharmClass, purpose, indications, warnings, dosage, effectiveTime
food-recallrank, recallNumber, status, classification, voluntary, recallingFirm, city, state, country, productDescription, reasonForRecall, productQuantity, distributionPattern, reportDate, recallInitiationDate, terminationDate

Options

drug-label

OptionDescription
query (positional)Brand or generic drug name (e.g. aspirin, lisinopril)
--limitMax rows (1โ€“25, default 5; openFDA caps anonymous tier at 25/page)

food-recall

OptionDescription
--queryFree-text Lucene query (e.g. salmonella, listeria); default: all recent recalls
--statusOngoing, Completed, Terminated
--classificationClass I (most serious), Class II, Class III
--limitMax rows (1โ€“100, default 10; openFDA caps anonymous tier at 100/page)

Notes

  • [string] arrays everywhere. openFDA returns most label fields as 1-element arrays (e.g. purpose: ["Pain reliever"]). The adapter's firstOrNull helper unwraps them, preserving null when the slot is missing.
  • pharmClass fallback chain. A drug can have several pharmacologic class fields (pharm_class_epc = established class, _moa = mechanism of action, _cs = chemical structure, _pe = physiologic effect). The adapter prefers EPC (most user-meaningful) and falls back through MOA โ†’ CS โ†’ PE.
  • Lucene query syntax. --query salmonella becomes search=salmonella โ€” single bare term. Multiple filters are combined with +AND+ (literal, NOT URL-encoded โ€” openFDA's parser treats the encoded form as a syntax error).
  • drug-label brand OR generic match. The adapter sends openfda.brand_name:"X"+openfda.generic_name:"X" so a query like aspirin matches the trade-name and the chemical name in one query.
  • reportDate / recallInitiationDate / terminationDate are YYYYMMDD strings (no separator) as openFDA returns them โ€” passed through unchanged.
  • terminationDate: null for ongoing recalls โ€” preserved (not coerced to a sentinel string).
  • 404 = no matches. openFDA returns HTTP 404 instead of an empty results[] array when a query has no hits โ€” the adapter promotes that to EmptyResultError.
  • Errors. Empty query / --limit out of range โ†’ ArgumentError; 404 โ†’ EmptyResultError; 429 / transport / non-200 โ†’ CommandExecutionError.