14 KiB
FDA Drug Databases
This reference covers all FDA drug-related API endpoints accessible through openFDA.
Overview
The FDA drug databases provide access to information about pharmaceutical products, including adverse events, labeling, recalls, approvals, and shortages. All endpoints follow the openFDA API structure and return JSON-formatted data.
Available Endpoints
1. Drug Adverse Events
Endpoint: https://api.fda.gov/drug/event.json
Purpose: Access reports of drug side effects, product use errors, product quality problems, and therapeutic failures submitted to the FDA.
Data Source: FDA Adverse Event Reporting System (FAERS)
Key Fields:
patient.drug.medicinalproduct- Drug namepatient.drug.drugindication- Reason for taking the drugpatient.reaction.reactionmeddrapt- Adverse reaction descriptionreceivedate- Date report was receivedserious- Whether the event was serious (1 = serious, 2 = not serious)seriousnessdeath- Whether the event resulted in deathprimarysource.qualification- Reporter qualification (physician, pharmacist, etc.)
Common Use Cases:
- Safety signal detection
- Post-market surveillance
- Drug interaction analysis
- Comparative safety research
Example Queries:
# Find adverse events for a specific drug
import requests
api_key = "YOUR_API_KEY"
url = "https://api.fda.gov/drug/event.json"
# Search for aspirin-related adverse events
params = {
"api_key": api_key,
"search": "patient.drug.medicinalproduct:aspirin",
"limit": 10
}
response = requests.get(url, params=params)
data = response.json()
# Count most common reactions for a drug
params = {
"api_key": api_key,
"search": "patient.drug.medicinalproduct:metformin",
"count": "patient.reaction.reactionmeddrapt.exact"
}
2. Drug Product Labeling
Endpoint: https://api.fda.gov/drug/label.json
Purpose: Access structured product information including prescribing information, warnings, indications, and usage for FDA-approved and marketed drug products.
Data Source: Structured Product Labeling (SPL)
Key Fields:
openfda.brand_name- Brand name(s) of the drugopenfda.generic_name- Generic name(s)indications_and_usage- Approved useswarnings- Important safety warningsadverse_reactions- Known adverse reactionsdosage_and_administration- How to use the drugdescription- Chemical and physical descriptionpharmacodynamics- How the drug workscontraindications- When not to use the drugdrug_interactions- Known drug interactionsactive_ingredient- Active ingredientsinactive_ingredient- Inactive ingredients
Common Use Cases:
- Clinical decision support
- Drug information lookup
- Patient education materials
- Formulary management
- Drug comparison analysis
Example Queries:
# Get full labeling for a brand-name drug
params = {
"api_key": api_key,
"search": "openfda.brand_name:Lipitor",
"limit": 1
}
response = requests.get("https://api.fda.gov/drug/label.json", params=params)
label_data = response.json()
# Extract specific sections
if "results" in label_data:
label = label_data["results"][0]
indications = label.get("indications_and_usage", ["Not available"])[0]
warnings = label.get("warnings", ["Not available"])[0]
# Search labels containing specific warnings
params = {
"api_key": api_key,
"search": "warnings:*hypertension*",
"limit": 10
}
3. National Drug Code (NDC) Directory
Endpoint: https://api.fda.gov/drug/ndc.json
Purpose: Access the NDC Directory containing information about drug products identified by National Drug Codes.
Data Source: FDA NDC Directory
Key Fields:
product_ndc- 10-digit NDC product identifiergeneric_name- Generic drug namelabeler_name- Company that manufactures/distributesbrand_name- Brand name if applicabledosage_form- Form (tablet, capsule, solution, etc.)route- Administration route (oral, injection, topical, etc.)product_type- Type of drug productmarketing_category- Regulatory pathway (NDA, ANDA, OTC, etc.)application_number- FDA application numberactive_ingredients- List of active ingredients with strengthspackaging- Package descriptions and NDC codeslisting_expiration_date- When listing expires
Common Use Cases:
- NDC lookup and validation
- Product identification
- Supply chain management
- Prescription processing
- Insurance claims processing
Example Queries:
# Look up drug by NDC code
params = {
"api_key": api_key,
"search": "product_ndc:0069-2110",
"limit": 1
}
response = requests.get("https://api.fda.gov/drug/ndc.json", params=params)
# Find all products from a specific manufacturer
params = {
"api_key": api_key,
"search": "labeler_name:Pfizer",
"limit": 100
}
# Get all oral tablets of a generic drug
params = {
"api_key": api_key,
"search": "generic_name:lisinopril+AND+dosage_form:TABLET",
"limit": 50
}
4. Drug Recall Enforcement Reports
Endpoint: https://api.fda.gov/drug/enforcement.json
Purpose: Access drug product recall enforcement reports issued by the FDA.
Data Source: FDA Enforcement Reports
Key Fields:
status- Current status (Ongoing, Completed, Terminated)recall_number- Unique recall identifierclassification- Class I, II, or III (severity)product_description- Description of recalled productreason_for_recall- Why product was recalledproduct_quantity- Amount of product recalledcode_info- Lot numbers, serial numbers, NDCsdistribution_pattern- Geographic distributionrecalling_firm- Company conducting recallrecall_initiation_date- When recall beganreport_date- When FDA received noticevoluntary_mandated- Type of recall
Classification Levels:
- Class I: Dangerous or defective products that could cause serious health problems or death
- Class II: Products that might cause temporary health problems or pose slight threat of serious nature
- Class III: Products unlikely to cause adverse health reaction but violate FDA labeling/manufacturing regulations
Common Use Cases:
- Quality assurance monitoring
- Supply chain risk management
- Patient safety alerts
- Regulatory compliance tracking
Example Queries:
# Find all Class I (most serious) drug recalls
params = {
"api_key": api_key,
"search": "classification:Class+I",
"limit": 20,
"sort": "report_date:desc"
}
response = requests.get("https://api.fda.gov/drug/enforcement.json", params=params)
# Search for recalls of a specific drug
params = {
"api_key": api_key,
"search": "product_description:*metformin*",
"limit": 10
}
# Find ongoing recalls
params = {
"api_key": api_key,
"search": "status:Ongoing",
"limit": 50
}
5. Drugs@FDA
Endpoint: https://api.fda.gov/drug/drugsfda.json
Purpose: Access comprehensive information about FDA-approved drug products from Drugs@FDA database, including approval history and regulatory information.
Data Source: Drugs@FDA Database (most drugs approved since 1939)
Key Fields:
application_number- NDA/ANDA/BLA numbersponsor_name- Company that submitted applicationopenfda.brand_name- Brand name(s)openfda.generic_name- Generic name(s)products- Array of approved products under this applicationproducts.active_ingredients- Active ingredients with strengthsproducts.dosage_form- Dosage formproducts.route- Route of administrationproducts.marketing_status- Current marketing statussubmissions- Array of regulatory submissionssubmissions.submission_type- Type of submissionsubmissions.submission_status- Status (approved, pending, etc.)submissions.submission_status_date- Status datesubmissions.review_priority- Priority or standard review
Common Use Cases:
- Drug approval research
- Regulatory pathway analysis
- Historical approval tracking
- Competitive intelligence
- Market access research
Example Queries:
# Find approval information for a specific drug
params = {
"api_key": api_key,
"search": "openfda.brand_name:Keytruda",
"limit": 1
}
response = requests.get("https://api.fda.gov/drug/drugsfda.json", params=params)
# Get all drugs approved by a specific sponsor
params = {
"api_key": api_key,
"search": "sponsor_name:Moderna",
"limit": 100
}
# Find drugs with priority review designation
params = {
"api_key": api_key,
"search": "submissions.review_priority:Priority",
"limit": 50
}
6. Drug Shortages
Endpoint: https://api.fda.gov/drug/drugshortages.json
Purpose: Access information about current and resolved drug shortages affecting the United States.
Data Source: FDA Drug Shortages Database
Key Fields:
product_name- Name of drug in shortagestatus- Current status (Currently in Shortage, Resolved, Discontinued)reason- Reason for shortageshortage_start_date- When shortage beganresolution_date- When shortage was resolved (if applicable)discontinuation_date- If product was discontinuedactive_ingredient- Active ingredientsmarketed_by- Companies marketing the productpresentation- Dosage form and strength
Common Use Cases:
- Formulary management
- Supply chain planning
- Patient care continuity
- Therapeutic alternative identification
- Procurement planning
Example Queries:
# Find current drug shortages
params = {
"api_key": api_key,
"search": "status:Currently+in+Shortage",
"limit": 100
}
response = requests.get("https://api.fda.gov/drug/drugshortages.json", params=params)
# Search for shortages of a specific drug
params = {
"api_key": api_key,
"search": "product_name:*amoxicillin*",
"limit": 10
}
# Get shortage history (both current and resolved)
params = {
"api_key": api_key,
"search": "active_ingredient:epinephrine",
"limit": 50
}
Integration Tips
Error Handling
import requests
import time
def query_fda_drug(endpoint, params, max_retries=3):
"""
Query FDA drug database with error handling and retry logic.
Args:
endpoint: Full URL endpoint (e.g., "https://api.fda.gov/drug/event.json")
params: Dictionary of query parameters
max_retries: Maximum number of retry attempts
Returns:
Response JSON data or None if error
"""
for attempt in range(max_retries):
try:
response = requests.get(endpoint, params=params, timeout=30)
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
if response.status_code == 404:
print(f"No results found for query")
return None
elif response.status_code == 429:
# Rate limit exceeded, wait and retry
wait_time = 60 * (attempt + 1)
print(f"Rate limit exceeded. Waiting {wait_time} seconds...")
time.sleep(wait_time)
else:
print(f"HTTP error occurred: {e}")
return None
except requests.exceptions.RequestException as e:
print(f"Request error: {e}")
if attempt < max_retries - 1:
time.sleep(5)
else:
return None
return None
Pagination for Large Result Sets
def get_all_results(endpoint, search_query, api_key, max_results=1000):
"""
Retrieve all results for a query using pagination.
Args:
endpoint: API endpoint URL
search_query: Search query string
api_key: FDA API key
max_results: Maximum total results to retrieve
Returns:
List of all result records
"""
all_results = []
skip = 0
limit = 100 # Max per request
while len(all_results) < max_results:
params = {
"api_key": api_key,
"search": search_query,
"limit": limit,
"skip": skip
}
data = query_fda_drug(endpoint, params)
if not data or "results" not in data:
break
results = data["results"]
all_results.extend(results)
# Check if we've retrieved all available results
if len(results) < limit:
break
skip += limit
time.sleep(0.25) # Rate limiting courtesy
return all_results[:max_results]
Best Practices
- Always use HTTPS - HTTP requests are not accepted
- Include API key - Provides higher rate limits (120,000/day vs 1,000/day)
- Use exact matching for aggregations - Add
.exactsuffix to field names in count queries - Implement rate limiting - Stay within 240 requests/minute
- Cache results - Avoid redundant queries for the same data
- Handle errors gracefully - Implement retry logic for transient failures
- Use specific field searches - More efficient than full-text searches
- Validate NDC codes - Use standard 11-digit format with hyphens removed
- Monitor API status - Check openFDA status page for outages
- Respect data limitations - OpenFDA contains public data only, not all FDA data
Additional Resources
- OpenFDA Drug API Documentation: https://open.fda.gov/apis/drug/
- API Basics: See
api_basics.mdin this references directory - Python examples: See
scripts/fda_drug_query.py - Field reference guides: Available at https://open.fda.gov/apis/drug/[endpoint]/searchable-fields/