--- name: fda-database description: "Query openFDA API for drugs, devices, adverse events, recalls, regulatory submissions (510k, PMA), substance identification (UNII), for FDA regulatory data analysis and safety research." --- # FDA Database Access ## Overview Access comprehensive FDA regulatory data through openFDA, the FDA's initiative to provide open APIs for public datasets. Query information about drugs, medical devices, foods, animal/veterinary products, and substances using Python with standardized interfaces. **Key capabilities:** - Query adverse events for drugs, devices, foods, and veterinary products - Access product labeling, approvals, and regulatory submissions - Monitor recalls and enforcement actions - Look up National Drug Codes (NDC) and substance identifiers (UNII) - Analyze device classifications and clearances (510k, PMA) - Track drug shortages and supply issues - Research chemical structures and substance relationships ## When to Use This Skill This skill should be used when working with: - **Drug research**: Safety profiles, adverse events, labeling, approvals, shortages - **Medical device surveillance**: Adverse events, recalls, 510(k) clearances, PMA approvals - **Food safety**: Recalls, allergen tracking, adverse events, dietary supplements - **Veterinary medicine**: Animal drug adverse events by species and breed - **Chemical/substance data**: UNII lookup, CAS number mapping, molecular structures - **Regulatory analysis**: Approval pathways, enforcement actions, compliance tracking - **Pharmacovigilance**: Post-market surveillance, safety signal detection - **Scientific research**: Drug interactions, comparative safety, epidemiological studies ## Quick Start ### 1. Basic Setup ```python from scripts.fda_query import FDAQuery # Initialize (API key optional but recommended) fda = FDAQuery(api_key="YOUR_API_KEY") # Query drug adverse events events = fda.query_drug_events("aspirin", limit=100) # Get drug labeling label = fda.query_drug_label("Lipitor", brand=True) # Search device recalls recalls = fda.query("device", "enforcement", search="classification:Class+I", limit=50) ``` ### 2. API Key Setup While the API works without a key, registering provides higher rate limits: - **Without key**: 240 requests/min, 1,000/day - **With key**: 240 requests/min, 120,000/day Register at: https://open.fda.gov/apis/authentication/ Set as environment variable: ```bash export FDA_API_KEY="your_key_here" ``` ### 3. Running Examples ```bash # Run comprehensive examples python scripts/fda_examples.py # This demonstrates: # - Drug safety profiles # - Device surveillance # - Food recall monitoring # - Substance lookup # - Comparative drug analysis # - Veterinary drug analysis ``` ## FDA Database Categories ### Drugs Access 6 drug-related endpoints covering the full drug lifecycle from approval to post-market surveillance. **Endpoints:** 1. **Adverse Events** - Reports of side effects, errors, and therapeutic failures 2. **Product Labeling** - Prescribing information, warnings, indications 3. **NDC Directory** - National Drug Code product information 4. **Enforcement Reports** - Drug recalls and safety actions 5. **Drugs@FDA** - Historical approval data since 1939 6. **Drug Shortages** - Current and resolved supply issues **Common use cases:** ```python # Safety signal detection fda.count_by_field("drug", "event", search="patient.drug.medicinalproduct:metformin", field="patient.reaction.reactionmeddrapt") # Get prescribing information label = fda.query_drug_label("Keytruda", brand=True) # Check for recalls recalls = fda.query_drug_recalls(drug_name="metformin") # Monitor shortages shortages = fda.query("drug", "drugshortages", search="status:Currently+in+Shortage") ``` **Reference:** See `references/drugs.md` for detailed documentation ### Devices Access 9 device-related endpoints covering medical device safety, approvals, and registrations. **Endpoints:** 1. **Adverse Events** - Device malfunctions, injuries, deaths 2. **510(k) Clearances** - Premarket notifications 3. **Classification** - Device categories and risk classes 4. **Enforcement Reports** - Device recalls 5. **Recalls** - Detailed recall information 6. **PMA** - Premarket approval data for Class III devices 7. **Registrations & Listings** - Manufacturing facility data 8. **UDI** - Unique Device Identification database 9. **COVID-19 Serology** - Antibody test performance data **Common use cases:** ```python # Monitor device safety events = fda.query_device_events("pacemaker", limit=100) # Look up device classification classification = fda.query_device_classification("DQY") # Find 510(k) clearances clearances = fda.query_device_510k(applicant="Medtronic") # Search by UDI device_info = fda.query("device", "udi", search="identifiers.id:00884838003019") ``` **Reference:** See `references/devices.md` for detailed documentation ### Foods Access 2 food-related endpoints for safety monitoring and recalls. **Endpoints:** 1. **Adverse Events** - Food, dietary supplement, and cosmetic events 2. **Enforcement Reports** - Food product recalls **Common use cases:** ```python # Monitor allergen recalls recalls = fda.query_food_recalls(reason="undeclared peanut") # Track dietary supplement events events = fda.query_food_events( industry="Dietary Supplements") # Find contamination recalls listeria = fda.query_food_recalls( reason="listeria", classification="I") ``` **Reference:** See `references/foods.md` for detailed documentation ### Animal & Veterinary Access veterinary drug adverse event data with species-specific information. **Endpoint:** 1. **Adverse Events** - Animal drug side effects by species, breed, and product **Common use cases:** ```python # Species-specific events dog_events = fda.query_animal_events( species="Dog", drug_name="flea collar") # Breed predisposition analysis breed_query = fda.query("animalandveterinary", "event", search="reaction.veddra_term_name:*seizure*+AND+" "animal.breed.breed_component:*Labrador*") ``` **Reference:** See `references/animal_veterinary.md` for detailed documentation ### Substances & Other Access molecular-level substance data with UNII codes, chemical structures, and relationships. **Endpoints:** 1. **Substance Data** - UNII, CAS, chemical structures, relationships 2. **NSDE** - Historical substance data (legacy) **Common use cases:** ```python # UNII to CAS mapping substance = fda.query_substance_by_unii("R16CO5Y76E") # Search by name results = fda.query_substance_by_name("acetaminophen") # Get chemical structure structure = fda.query("other", "substance", search="names.name:ibuprofen+AND+substanceClass:chemical") ``` **Reference:** See `references/other.md` for detailed documentation ## Common Query Patterns ### Pattern 1: Safety Profile Analysis Create comprehensive safety profiles combining multiple data sources: ```python def drug_safety_profile(fda, drug_name): """Generate complete safety profile.""" # 1. Total adverse events events = fda.query_drug_events(drug_name, limit=1) total = events["meta"]["results"]["total"] # 2. Most common reactions reactions = fda.count_by_field( "drug", "event", search=f"patient.drug.medicinalproduct:*{drug_name}*", field="patient.reaction.reactionmeddrapt", exact=True ) # 3. Serious events serious = fda.query("drug", "event", search=f"patient.drug.medicinalproduct:*{drug_name}*+AND+serious:1", limit=1) # 4. Recent recalls recalls = fda.query_drug_recalls(drug_name=drug_name) return { "total_events": total, "top_reactions": reactions["results"][:10], "serious_events": serious["meta"]["results"]["total"], "recalls": recalls["results"] } ``` ### Pattern 2: Temporal Trend Analysis Analyze trends over time using date ranges: ```python from datetime import datetime, timedelta def get_monthly_trends(fda, drug_name, months=12): """Get monthly adverse event trends.""" trends = [] for i in range(months): end = datetime.now() - timedelta(days=30*i) start = end - timedelta(days=30) date_range = f"[{start.strftime('%Y%m%d')}+TO+{end.strftime('%Y%m%d')}]" search = f"patient.drug.medicinalproduct:*{drug_name}*+AND+receivedate:{date_range}" result = fda.query("drug", "event", search=search, limit=1) count = result["meta"]["results"]["total"] if "meta" in result else 0 trends.append({ "month": start.strftime("%Y-%m"), "events": count }) return trends ``` ### Pattern 3: Comparative Analysis Compare multiple products side-by-side: ```python def compare_drugs(fda, drug_list): """Compare safety profiles of multiple drugs.""" comparison = {} for drug in drug_list: # Total events events = fda.query_drug_events(drug, limit=1) total = events["meta"]["results"]["total"] if "meta" in events else 0 # Serious events serious = fda.query("drug", "event", search=f"patient.drug.medicinalproduct:*{drug}*+AND+serious:1", limit=1) serious_count = serious["meta"]["results"]["total"] if "meta" in serious else 0 comparison[drug] = { "total_events": total, "serious_events": serious_count, "serious_rate": (serious_count/total*100) if total > 0 else 0 } return comparison ``` ### Pattern 4: Cross-Database Lookup Link data across multiple endpoints: ```python def comprehensive_device_lookup(fda, device_name): """Look up device across all relevant databases.""" return { "adverse_events": fda.query_device_events(device_name, limit=10), "510k_clearances": fda.query_device_510k(device_name=device_name), "recalls": fda.query("device", "enforcement", search=f"product_description:*{device_name}*"), "udi_info": fda.query("device", "udi", search=f"brand_name:*{device_name}*") } ``` ## Working with Results ### Response Structure All API responses follow this structure: ```python { "meta": { "disclaimer": "...", "results": { "skip": 0, "limit": 100, "total": 15234 } }, "results": [ # Array of result objects ] } ``` ### Error Handling Always handle potential errors: ```python result = fda.query_drug_events("aspirin", limit=10) if "error" in result: print(f"Error: {result['error']}") elif "results" not in result or len(result["results"]) == 0: print("No results found") else: # Process results for event in result["results"]: # Handle event data pass ``` ### Pagination For large result sets, use pagination: ```python # Automatic pagination all_results = fda.query_all( "drug", "event", search="patient.drug.medicinalproduct:aspirin", max_results=5000 ) # Manual pagination for skip in range(0, 1000, 100): batch = fda.query("drug", "event", search="...", limit=100, skip=skip) # Process batch ``` ## Best Practices ### 1. Use Specific Searches **DO:** ```python # Specific field search search="patient.drug.medicinalproduct:aspirin" ``` **DON'T:** ```python # Overly broad wildcard search="*aspirin*" ``` ### 2. Implement Rate Limiting The `FDAQuery` class handles rate limiting automatically, but be aware of limits: - 240 requests per minute - 120,000 requests per day (with API key) ### 3. Cache Frequently Accessed Data The `FDAQuery` class includes built-in caching (enabled by default): ```python # Caching is automatic fda = FDAQuery(api_key=api_key, use_cache=True, cache_ttl=3600) ``` ### 4. Use Exact Matching for Counting When counting/aggregating, use `.exact` suffix: ```python # Count exact phrases fda.count_by_field("drug", "event", search="...", field="patient.reaction.reactionmeddrapt", exact=True) # Adds .exact automatically ``` ### 5. Validate Input Data Clean and validate search terms: ```python def clean_drug_name(name): """Clean drug name for query.""" return name.strip().replace('"', '\\"') drug_name = clean_drug_name(user_input) ``` ## API Reference For detailed information about: - **Authentication and rate limits** → See `references/api_basics.md` - **Drug databases** → See `references/drugs.md` - **Device databases** → See `references/devices.md` - **Food databases** → See `references/foods.md` - **Animal/veterinary databases** → See `references/animal_veterinary.md` - **Substance databases** → See `references/other.md` ## Scripts ### `scripts/fda_query.py` Main query module with `FDAQuery` class providing: - Unified interface to all FDA endpoints - Automatic rate limiting and caching - Error handling and retry logic - Common query patterns ### `scripts/fda_examples.py` Comprehensive examples demonstrating: - Drug safety profile analysis - Device surveillance monitoring - Food recall tracking - Substance lookup - Comparative drug analysis - Veterinary drug analysis Run examples: ```bash python scripts/fda_examples.py ``` ## Additional Resources - **openFDA Homepage**: https://open.fda.gov/ - **API Documentation**: https://open.fda.gov/apis/ - **Interactive API Explorer**: https://open.fda.gov/apis/try-the-api/ - **GitHub Repository**: https://github.com/FDA/openfda - **Terms of Service**: https://open.fda.gov/terms/ ## Support and Troubleshooting ### Common Issues **Issue**: Rate limit exceeded - **Solution**: Use API key, implement delays, or reduce request frequency **Issue**: No results found - **Solution**: Try broader search terms, check spelling, use wildcards **Issue**: Invalid query syntax - **Solution**: Review query syntax in `references/api_basics.md` **Issue**: Missing fields in results - **Solution**: Not all records contain all fields; always check field existence ### Getting Help - **GitHub Issues**: https://github.com/FDA/openfda/issues - **Email**: open-fda@fda.hhs.gov