# 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 name - `patient.drug.drugindication` - Reason for taking the drug - `patient.reaction.reactionmeddrapt` - Adverse reaction description - `receivedate` - Date report was received - `serious` - Whether the event was serious (1 = serious, 2 = not serious) - `seriousnessdeath` - Whether the event resulted in death - `primarysource.qualification` - Reporter qualification (physician, pharmacist, etc.) **Common Use Cases**: - Safety signal detection - Post-market surveillance - Drug interaction analysis - Comparative safety research **Example Queries**: ```python # 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() ``` ```python # 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 drug - `openfda.generic_name` - Generic name(s) - `indications_and_usage` - Approved uses - `warnings` - Important safety warnings - `adverse_reactions` - Known adverse reactions - `dosage_and_administration` - How to use the drug - `description` - Chemical and physical description - `pharmacodynamics` - How the drug works - `contraindications` - When not to use the drug - `drug_interactions` - Known drug interactions - `active_ingredient` - Active ingredients - `inactive_ingredient` - Inactive ingredients **Common Use Cases**: - Clinical decision support - Drug information lookup - Patient education materials - Formulary management - Drug comparison analysis **Example Queries**: ```python # 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] ``` ```python # 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 identifier - `generic_name` - Generic drug name - `labeler_name` - Company that manufactures/distributes - `brand_name` - Brand name if applicable - `dosage_form` - Form (tablet, capsule, solution, etc.) - `route` - Administration route (oral, injection, topical, etc.) - `product_type` - Type of drug product - `marketing_category` - Regulatory pathway (NDA, ANDA, OTC, etc.) - `application_number` - FDA application number - `active_ingredients` - List of active ingredients with strengths - `packaging` - Package descriptions and NDC codes - `listing_expiration_date` - When listing expires **Common Use Cases**: - NDC lookup and validation - Product identification - Supply chain management - Prescription processing - Insurance claims processing **Example Queries**: ```python # 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) ``` ```python # Find all products from a specific manufacturer params = { "api_key": api_key, "search": "labeler_name:Pfizer", "limit": 100 } ``` ```python # 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 identifier - `classification` - Class I, II, or III (severity) - `product_description` - Description of recalled product - `reason_for_recall` - Why product was recalled - `product_quantity` - Amount of product recalled - `code_info` - Lot numbers, serial numbers, NDCs - `distribution_pattern` - Geographic distribution - `recalling_firm` - Company conducting recall - `recall_initiation_date` - When recall began - `report_date` - When FDA received notice - `voluntary_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**: ```python # 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) ``` ```python # Search for recalls of a specific drug params = { "api_key": api_key, "search": "product_description:*metformin*", "limit": 10 } ``` ```python # 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 number - `sponsor_name` - Company that submitted application - `openfda.brand_name` - Brand name(s) - `openfda.generic_name` - Generic name(s) - `products` - Array of approved products under this application - `products.active_ingredients` - Active ingredients with strengths - `products.dosage_form` - Dosage form - `products.route` - Route of administration - `products.marketing_status` - Current marketing status - `submissions` - Array of regulatory submissions - `submissions.submission_type` - Type of submission - `submissions.submission_status` - Status (approved, pending, etc.) - `submissions.submission_status_date` - Status date - `submissions.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**: ```python # 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) ``` ```python # Get all drugs approved by a specific sponsor params = { "api_key": api_key, "search": "sponsor_name:Moderna", "limit": 100 } ``` ```python # 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 shortage - `status` - Current status (Currently in Shortage, Resolved, Discontinued) - `reason` - Reason for shortage - `shortage_start_date` - When shortage began - `resolution_date` - When shortage was resolved (if applicable) - `discontinuation_date` - If product was discontinued - `active_ingredient` - Active ingredients - `marketed_by` - Companies marketing the product - `presentation` - Dosage form and strength **Common Use Cases**: - Formulary management - Supply chain planning - Patient care continuity - Therapeutic alternative identification - Procurement planning **Example Queries**: ```python # 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) ``` ```python # Search for shortages of a specific drug params = { "api_key": api_key, "search": "product_name:*amoxicillin*", "limit": 10 } ``` ```python # Get shortage history (both current and resolved) params = { "api_key": api_key, "search": "active_ingredient:epinephrine", "limit": 50 } ``` ## Integration Tips ### Error Handling ```python 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 ```python 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 1. **Always use HTTPS** - HTTP requests are not accepted 2. **Include API key** - Provides higher rate limits (120,000/day vs 1,000/day) 3. **Use exact matching for aggregations** - Add `.exact` suffix to field names in count queries 4. **Implement rate limiting** - Stay within 240 requests/minute 5. **Cache results** - Avoid redundant queries for the same data 6. **Handle errors gracefully** - Implement retry logic for transient failures 7. **Use specific field searches** - More efficient than full-text searches 8. **Validate NDC codes** - Use standard 11-digit format with hyphens removed 9. **Monitor API status** - Check openFDA status page for outages 10. **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.md` in 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/