Openfda Database
Google DeepMindOfficialPublished by Google DeepMind
- Skill
- Tool integration
- Science and research
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The openfda-database skill provides a structured interface to interact with the openFDA API. It enables users to search, count, and download large datasets related to drugs, medical devices, food, tobacco, and other regulated products. The skill includes built-in rate-limiting management and helper scripts to ensure efficient data retrieval while adhering to API constraints.
What it does
- Searches across 28 distinct FDA API endpoints for regulatory and safety data.
- Aggregates and counts unique field values to identify trends in adverse events or product data.
- Downloads large datasets with automated pagination and safety caps.
- Supports precise querying using exact-match syntax for categorical fields.
- Provides guidance on handling hyphenated identifiers like NDCs and managing discontinued product lookups.
- Integrates with local environment configurations to manage API keys for increased request limits.
When to use it
- When researching adverse event reports for specific drugs or medical devices.
- When performing regulatory analysis on product recalls, approvals, or shortages.
- When looking up National Drug Code (NDC) information for active or discontinued products.
- When analyzing demographic or geographic trends in safety reporting data.
- When conducting large-scale data extraction from FDA databases for research purposes.
Advantages
- Simplifies complex API interaction with a unified command-line interface.
- Prevents accidental rate-limit exhaustion through built-in management.
- Enforces best practices for data precision using exact-match suffixes.
- Provides a safe, file-based output mechanism to handle large JSON responses.
- Includes clear fallback strategies for common data retrieval challenges.
Usage examples
- “Find the top 10 adverse reaction terms for Metformin.”
- The agent uses the count command with the exact-match suffix on the reaction field to generate a summary file of the most frequent MedDRA preferred terms.
- “Download all adverse event reports for Aspirin from January 2025.”
- The agent uses the download command with a date-range filter to fetch and save the relevant records to a JSON file.
- “Look up information for a discontinued drug using its NDC.”
- The agent attempts to query the NDC endpoint, and upon finding no results, automatically falls back to the label endpoint to retrieve product information.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/google-deepmind/openfda-database/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip openfda-database.zip -d .agents/skills
Documentation by Google DeepMind
openFDA Search and Query
Prerequisites
uv: Read theuvskill and follow its Setup instructions to ensureuvis installed and on PATH.User Notification: If .licenses/openfda_database_LICENSE.txt does not already exist in the workspace root directory then (1) prominently notify the user to check the terms at https://open.fda.gov/apis/ and https://open.fda.gov/license, then (2) create the file recording the notification text and timestamp.
.envfile: Make sure the.envfile exists in your home directory. Create one if it does not exist.FDA_API_KEY(optional but recommended): Raises the daily request limit from 1,000 to 120,000. The skill works without it, but an agent can easily exhaust the keyless limit in a single session. You can register for a free key at https://open.fda.gov/apis/authentication/. You MUST use the safe credentials protocol in thecredentialsskill to check for and request this key if this skill looks relevant to the user's request.
Core Rules
Use the Wrapper: ALWAYS execute the provided helper scripts to query the database rather than accessing the database directly. The scripts automatically enforce the required rate limit gracefully.
Rate Limiting: Respect openFDA rate limits. Without API key: 240 requests/min, 1,000 requests/day per IP. With API key: 240 requests/min, 120,000 requests/day per key. Always set an API key before running multi-query workflows.
Warning: An automated agent can easily exhaust the 1,000-request daily limit in a single research session. Always set an API key before running multi-query workflows.
You MUST use the safe credentials protocol in the
credentialsskill to help the user addFDA_API_KEYto their.envfile if this skill looks relevant to the user's request. The script will emit a warning to stderr if no API key is detected.
Always Use
--output: All subcommands require--output <file>to write results to a file. This prevents large output becoming overwhelming. Use jq or code to read the output file.Notification: If this skill is used, ensure this is mentioned in the output.
Utility Script
Single script for all operations:
uv run scripts/openfda_query.py {search,count,download} --output <file> [options]1. Search
Search any of the 28 endpoints and save JSON results to a file.
uv run scripts/openfda_query.py search \
--category drug --endpoint event \
--search "patient.drug.medicinalproduct:aspirin" \
--limit 5 --output /tmp/fda_results.jsonStdout prints a compact summary:
{"status": "success", "output": "/tmp/fda_results.json", "results_in_file": 5, "total_matching": 601477}Options:
--output: Output file for full JSON results (required).--category: API category —drug,device,food,tobacco,other,animalandveterinary,cosmetic,transparency.--endpoint: Endpoint within the category (e.g.,event,label,510k). See references/api_endpoints.md for full list.--search: Query string (e.g.,patient.drug.medicinalproduct:aspirin+AND+serious:1).--sort: Sort field and order (e.g.,receivedate:desc).--limit: Max results (default 10, max 1000).--skip: Pagination offset (default 0).--api_key: API key (also readsFDA_API_KEYenv var).
2. Count
Count unique values of a field within matching results.
uv run scripts/openfda_query.py count \
--category drug --endpoint event \
--search "patient.drug.medicinalproduct:aspirin" \
--count_field "patient.reaction.reactionmeddrapt.exact" \
--summary 10 --output /tmp/aspirin_reactions.jsonStdout prints a summary with the top 5 terms. Full data is in the output file.
Additional options:
--count_field: Field to count (append.exactfor whole-phrase counting).--summary N: Return only the top N most frequent terms. Use this to avoid flooding the context with hundreds of infrequent terms.
3. Download
Download multiple pages of results to a file.
uv run scripts/openfda_query.py download \
--category drug --endpoint event \
--search "patient.drug.medicinalproduct:aspirin" \
--limit 100 --max_pages 5 \
--output /tmp/aspirin_events.jsonAdditional options:
--max_pages: Maximum pages to fetch (default 10).--all_results: Automatically paginate to fetch all matching results. Safety cap of 25,000 records maximum per download to prevent runaway downloads and prevent excessive API usage.Tip: Common drugs can have excessive reports. Use a date range (e.g.,
receivedate:[20250101+TO+20250131]) to limit the volume of download.
Entity Resolution: Using .exact for Precision
When searching for specific product names, drug names, or categorical terms,
always use the .exact suffix on the field to get exact-match results. Without
it, the API tokenizes multi-word values and returns noisy partial matches.
# Precise: matches only "ADVIL"
uv run scripts/openfda_query.py search --category drug --endpoint label \
--search 'openfda.brand_name.exact:"ADVIL"' \
--limit 5 --output /tmp/advil_label.jsonNote: Many brand names in the FDA database include variant suffixes (e.g., "TYLENOL Extra Strength" rather than just "TYLENOL"). If an
.exactsearch returns 0 results, try without.exactto see the available brand name variants, then re-query with the full exact name.
The .exact suffix is also required when using --count_field to aggregate
whole phrases instead of individual words.
NDC Lookups: Hyphens & Discontinued Drugs
Always Quote Hyphenated NDCs: In openFDA search syntax, an unquoted hyphen (
-) acts as the boolean NOT operator (e.g.,51285-092searches for51285 AND NOT 092). Always enclose hyphenated NDC strings in escaped double quotes:uv run scripts/openfda_query.py search --category drug --endpoint ndc \ --search 'product_ndc:"51285-092"' \ --limit 5 --output /tmp/ndc.jsonDiscontinued Drugs Fallback (
drug/label): Thedrug/ndcendpoint only contains currently active/marketed products. If a valid NDC returns 0 results indrug/ndc, query thedrug/labelendpoint with exact phrase quotes (--search '"51285-092"'). Note that for discontinued drugs, theopenfdametadata block may be empty ({}), so read brand name, active ingredients, and labeler from the label text fields (package_label_principal_display_panel,description, orspl_product_data_elements).
MedDRA Term Resolution
openFDA adverse event data uses MedDRA (Medical Dictionary for Regulatory Activities) terms for reactions. The API reports Preferred Terms (PTs) but does not provide the MedDRA hierarchy (System Organ Class, High Level Terms, etc.).
Note: MedDRA is a proprietary ontology and is not indexed in the EMBL-EBI OLS. To approximate MedDRA hierarchy lookups, use the Human Phenotype Ontology (HP) or NCI Thesaurus (NCIT) as proxy ontologies — they cross-reference MedDRA IDs and provide parent/ancestor relationships.
# Step 1: Get top reactions from openFDA
uv run scripts/openfda_query.py count \
--category drug --endpoint event \
--search "patient.drug.medicinalproduct:metformin" \
--count_field "patient.reaction.reactionmeddrapt.exact" \
--summary 5 --output /tmp/metformin_reactions.json
# Step 2: Look up the top reaction term using a biomedical ontology service
# skill (e.g. embl-ebi-ols skill).
# MedDRA is not available in OLS; use the Human Phenotype Ontology (HP) or
# NCI Thesaurus (NCIT) as a proxy to find the hierarchical classification of
# the reaction term.Available Endpoints (28 total)
Category to endpoint mapping:
drug: event, label, ndc, enforcement, drugsfda, shortagesdevice: 510k, classification, enforcement, event, pma, recall, registrationlisting, udi, covid19serologyfood: enforcement, eventtobacco: problem, researchpreventionads, researchdigitalads, researchsmokefreeother: historicaldocument, nsde, substance, uniianimalandveterinary: eventcosmetic: eventtransparency: crl
Reference
Query syntax and all endpoints: See references/api_endpoints.md for field names, search syntax, date ranges, and boolean operators.
Recipes
Common query patterns for drugs, devices, foods, tobacco, cosmetics, animal and veterinary products, substances, transparency data, adverse events, recalls, labeling, approvals, shortages, 510(k) clearances, NDC lookups, any FDA safety or regulatory data query, and more. See references/recipes.md for the full recipes.
Workflow
Search for records using
searchwith--output. Read the output file.Use
countwith--summary 10 --outputto summarize field distributions.Use
download(with--all_resultsfor exhaustive pulls) to fetch larger datasets.Read and analyze the output file using standard tools.
For MedDRA term hierarchy questions, use a biomedical ontology service skill (e.g. EMBL-EBI OLS skill with the HP or NCIT ontology) to look up the term.
Files
- ATTRIBUTION.mdAdded by AutoGineer914 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md9.7 KiB
- references/api_endpoints.md6.3 KiB
- references/citation.bib2.0 KiB
- references/recipes.md4.4 KiB
- scripts/openfda_query.pyScript13.9 KiB
references/api_endpoints.md
openFDA API Endpoints Reference
Base URL
All requests go to https://api.fda.gov/{category}/{endpoint}.json.
Authentication
Without API key: 240 requests/min, 1,000/day per IP
With API key: 240 requests/min, 120,000/day per key
Pass via --api_key flag or FDA_API_KEY environment variable.
Important: Without an API key you are capped at 1,000 requests/day. An automated agent can easily exceed this in a single session. Always set a key before running multi-query workflows.
Query Syntax
Search
search=field:termsearch=field:term— match a single termsearch=field:term+AND+field:term— match ALL termssearch=field:term+field:term— match ANY term (OR)search=field:[20200101+TO+20201231]— date rangesearch=field:"exact+phrase"— exact phrase matching
Exact Matching (.exact)
For categorical fields (drug names, reaction terms, manufacturer names), use
the .exact suffix to match whole phrases rather than individual tokens:
search=openfda.brand_name.exact:"TYLENOL"
count=patient.reaction.reactionmeddrapt.exactWithout .exact, the API tokenizes multi-word values and returns noisy partial
matches. Always use .exact when:
Searching for a specific product by brand name
Counting reaction terms or manufacturer names
Querying any field that contains multi-word values
Sort
sort=field:asc
sort=field:descCount
Use count=field to aggregate unique values. Add .exact suffix for
whole-phrase counting:
count=patient.reaction.reactionmeddrapt.exactPagination
limit=N— number of results (max 1000)skip=N— offset for pagination (max 25000)
Date Formats
openFDA requires dates in YYYYMMDD format (not ISO 8601). Date ranges use
bracket syntax with +TO+:
search=receivedate:[20230101+TO+20231231]Common pitfalls:
| Format | Valid? |
|---|---|
20230101 | ✓ Correct |
[20230101+TO+20231231] | ✓ Correct range |
2023-01-01 | ✗ Will cause an API error |
2023/01/01 | ✗ Will cause an API error |
January 1, 2023 | ✗ Will cause an API error |
All Endpoints
Drug (6 endpoints)
| Endpoint | Path | Description |
|---|---|---|
| event | /drug/event.json | Adverse event reports (FAERS) |
| label | /drug/label.json | Structured product labeling (SPL) |
| ndc | /drug/ndc.json | National Drug Code directory |
| enforcement | /drug/enforcement.json | Recall enforcement reports |
| drugsfda | /drug/drugsfda.json | Drug approvals since 1939 |
| shortages | /drug/shortages.json | Drug shortage reports |
Device (9 endpoints)
| Endpoint | Path | Description |
|---|---|---|
| 510k | /device/510k.json | 510(k) premarket clearances |
| classification | /device/classification.json | Device classification data |
| enforcement | /device/enforcement.json | Recall enforcement reports |
| event | /device/event.json | Adverse event reports (MDR) |
| pma | /device/pma.json | Premarket approval (Class III) |
| recall | /device/recall.json | Device recall details |
| registrationlisting | /device/registrationlisting.json | Facility registrations |
| udi | /device/udi.json | Unique Device Identifiers (GUDID) |
| covid19serology | /device/covid19serology.json | COVID-19 antibody test data |
Food (2 endpoints)
| Endpoint | Path | Description |
|---|---|---|
| enforcement | /food/enforcement.json | Food recall enforcement reports |
| event | /food/event.json | CAERS adverse event reports |
Tobacco (4 endpoints)
| Endpoint | Path | Description |
|---|---|---|
| problem | /tobacco/problem.json | Tobacco product problem reports |
| researchpreventionads | /tobacco/researchpreventionads.json | Prevention ads research |
| researchdigitalads | /tobacco/researchdigitalads.json | Digital ads research |
| researchsmokefree | /tobacco/researchsmokefree.json | Smokefree campaign research |
Other (4 endpoints)
| Endpoint | Path | Description |
|---|---|---|
| historicaldocument | /other/historicaldocument.json | FDA press releases 1913-2014 |
| nsde | /other/nsde.json | NDC SPL data elements |
| substance | /other/substance.json | Substance molecular data |
| unii | /other/unii.json | Unique Ingredient Identifiers |
Animal & Veterinary (1 endpoint)
| Endpoint | Path | Description |
|---|---|---|
| event | /animalandveterinary/event.json | Animal drug adverse events |
Cosmetic (1 endpoint)
| Endpoint | Path | Description |
|---|---|---|
| event | /cosmetic/event.json | Cosmetic adverse event reports |
Transparency (1 endpoint)
| Endpoint | Path | Description |
|---|---|---|
| crl | /transparency/crl.json | Complete Response Letters |
Common Field Names
Drug Adverse Events (drug/event)
patient.drug.medicinalproduct— drug namepatient.reaction.reactionmeddrapt— reaction term (MedDRA PT)serious— 1 for serious, 2 for not seriousoccurcountry— country codereceivedate— date received (YYYYMMDD)patient.drug.drugindication— drug indication
Drug Labeling (drug/label)
openfda.brand_name— brand name (use.exactfor precise matching)openfda.generic_name— generic nameopenfda.manufacturer_name— manufacturerindications_and_usage— indicationswarnings— warnings sectiondosage_and_administration— dosage info
Drug Shortages (drug/shortages)
generic_name— generic drug namestatus— shortage statusproprietary_name— brand/proprietary name
Device Events (device/event)
device.generic_name— device generic namedevice.brand_name— device brand namedevice.manufacturer_d_name— manufacturermdr_text.text— event narrative
Animal & Veterinary Events (animalandveterinary/event)
animal.species— species name (e.g. Dog, Cat, Horse)animal.breed.breed_component— breedanimal.gender— genderreaction.veddra_term_name— reaction termdrug.brand_name— drug brand nameserious_ae— serious adverse event flag
Food Enforcement (food/enforcement)
reason_for_recall— recall reasonclassification— Class I, II, or IIIrecalling_firm— company nameproduct_description— product detailsrecall_initiation_date— date of recall (YYYYMMDD)
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Google DeepMind
- Publisher
- Google DeepMind (Official)
- Source
- google-deepmind/science-skills · skills/openfda_database · commit 4de6786
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Google DeepMind.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download openfda-database.zip