375 lines
10 KiB
Markdown
375 lines
10 KiB
Markdown
# FDA Food Databases
|
|
|
|
This reference covers FDA food-related API endpoints accessible through openFDA.
|
|
|
|
## Overview
|
|
|
|
The FDA food databases provide access to information about food products, including adverse events and enforcement actions. These databases help track food safety issues, recalls, and consumer complaints.
|
|
|
|
## Available Endpoints
|
|
|
|
### 1. Food Adverse Events
|
|
|
|
**Endpoint**: `https://api.fda.gov/food/event.json`
|
|
|
|
**Purpose**: Access adverse event reports for food products, dietary supplements, and cosmetics.
|
|
|
|
**Data Source**: CAERS (CFSAN Adverse Event Reporting System)
|
|
|
|
**Key Fields**:
|
|
- `date_started` - When adverse event began
|
|
- `date_created` - When report was created
|
|
- `report_number` - Unique report identifier
|
|
- `outcomes` - Event outcomes (e.g., hospitalization, death)
|
|
- `reactions` - Adverse reactions/symptoms reported
|
|
- `consumer.age` - Consumer age
|
|
- `consumer.age_unit` - Age unit (years, months, etc.)
|
|
- `consumer.gender` - Consumer gender
|
|
- `products` - Array of products involved
|
|
- `products.name_brand` - Product brand name
|
|
- `products.industry_code` - Product category code
|
|
- `products.industry_name` - Product category name
|
|
- `products.role` - Product role (Suspect, Concomitant)
|
|
|
|
**Product Categories (industry_name)**:
|
|
- Bakery Products/Dough/Mixes/Icing
|
|
- Beverages (coffee, tea, soft drinks, etc.)
|
|
- Dietary Supplements
|
|
- Ice Cream Products
|
|
- Cosmetics
|
|
- Vitamins and nutritional supplements
|
|
- Many others
|
|
|
|
**Common Use Cases**:
|
|
- Food safety surveillance
|
|
- Dietary supplement monitoring
|
|
- Adverse event trend analysis
|
|
- Product safety assessment
|
|
- Consumer complaint tracking
|
|
|
|
**Example Queries**:
|
|
```python
|
|
import requests
|
|
|
|
api_key = "YOUR_API_KEY"
|
|
url = "https://api.fda.gov/food/event.json"
|
|
|
|
# Find adverse events for dietary supplements
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "products.industry_name:Dietary+Supplements",
|
|
"limit": 10
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
data = response.json()
|
|
```
|
|
|
|
```python
|
|
# Count most common reactions
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "products.industry_name:*Beverages*",
|
|
"count": "reactions.exact"
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Find serious outcomes (hospitalizations, deaths)
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "outcomes:Hospitalization",
|
|
"limit": 50,
|
|
"sort": "date_created:desc"
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Search by product brand name
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "products.name_brand:*protein+powder*",
|
|
"limit": 20
|
|
}
|
|
```
|
|
|
|
### 2. Food Enforcement Reports
|
|
|
|
**Endpoint**: `https://api.fda.gov/food/enforcement.json`
|
|
|
|
**Purpose**: Access food 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
|
|
- `product_description` - Description of recalled food product
|
|
- `reason_for_recall` - Why product was recalled
|
|
- `product_quantity` - Amount of product recalled
|
|
- `code_info` - Lot numbers, batch codes, UPCs
|
|
- `distribution_pattern` - Geographic distribution
|
|
- `recalling_firm` - Company conducting recall
|
|
- `recall_initiation_date` - When recall began
|
|
- `report_date` - When FDA received notice
|
|
- `voluntary_mandated` - Voluntary or FDA-mandated recall
|
|
- `city` - Recalling firm city
|
|
- `state` - Recalling firm state
|
|
- `country` - Recalling firm country
|
|
- `initial_firm_notification` - How firm was notified
|
|
|
|
**Classification Levels**:
|
|
- **Class I**: Dangerous or defective products that could cause serious health problems or death (e.g., undeclared allergens with severe risk, botulism contamination)
|
|
- **Class II**: Products that might cause temporary health problems or pose slight threat (e.g., minor allergen issues, quality defects)
|
|
- **Class III**: Products unlikely to cause adverse health reactions but violate FDA regulations (e.g., labeling errors, quality issues)
|
|
|
|
**Common Recall Reasons**:
|
|
- Undeclared allergens (milk, eggs, peanuts, tree nuts, soy, wheat, fish, shellfish, sesame)
|
|
- Microbial contamination (Listeria, Salmonella, E. coli, etc.)
|
|
- Foreign material contamination (metal, plastic, glass)
|
|
- Labeling errors
|
|
- Improper processing/packaging
|
|
- Chemical contamination
|
|
|
|
**Common Use Cases**:
|
|
- Food safety monitoring
|
|
- Supply chain risk management
|
|
- Allergen tracking
|
|
- Retailer recall coordination
|
|
- Consumer safety alerts
|
|
|
|
**Example Queries**:
|
|
```python
|
|
# Find all Class I food recalls (most serious)
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "classification:Class+I",
|
|
"limit": 20,
|
|
"sort": "report_date:desc"
|
|
}
|
|
|
|
response = requests.get("https://api.fda.gov/food/enforcement.json", params=params)
|
|
```
|
|
|
|
```python
|
|
# Search for allergen-related recalls
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "reason_for_recall:*undeclared+allergen*",
|
|
"limit": 50
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Find Listeria contamination recalls
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "reason_for_recall:*listeria*",
|
|
"limit": 30,
|
|
"sort": "recall_initiation_date:desc"
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Get recalls by specific company
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "recalling_firm:*General+Mills*",
|
|
"limit": 20
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Find ongoing recalls
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "status:Ongoing",
|
|
"limit": 100
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Search by product type
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": "product_description:*ice+cream*",
|
|
"limit": 25
|
|
}
|
|
```
|
|
|
|
## Integration Tips
|
|
|
|
### Allergen Monitoring System
|
|
|
|
```python
|
|
def monitor_allergen_recalls(allergens, api_key, days_back=30):
|
|
"""
|
|
Monitor food recalls for specific allergens.
|
|
|
|
Args:
|
|
allergens: List of allergens to monitor (e.g., ["peanut", "milk", "soy"])
|
|
api_key: FDA API key
|
|
days_back: Number of days to look back
|
|
|
|
Returns:
|
|
List of matching recalls
|
|
"""
|
|
import requests
|
|
from datetime import datetime, timedelta
|
|
|
|
# Calculate date range
|
|
end_date = datetime.now()
|
|
start_date = end_date - timedelta(days=days_back)
|
|
date_range = f"[{start_date.strftime('%Y%m%d')}+TO+{end_date.strftime('%Y%m%d')}]"
|
|
|
|
url = "https://api.fda.gov/food/enforcement.json"
|
|
all_recalls = []
|
|
|
|
for allergen in allergens:
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": f"reason_for_recall:*{allergen}*+AND+report_date:{date_range}",
|
|
"limit": 100
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
if "results" in data:
|
|
for result in data["results"]:
|
|
result["detected_allergen"] = allergen
|
|
all_recalls.append(result)
|
|
|
|
return all_recalls
|
|
```
|
|
|
|
### Adverse Event Analysis
|
|
|
|
```python
|
|
def analyze_product_adverse_events(product_name, api_key):
|
|
"""
|
|
Analyze adverse events for a specific food product.
|
|
|
|
Args:
|
|
product_name: Product name or partial name
|
|
api_key: FDA API key
|
|
|
|
Returns:
|
|
Dictionary with analysis results
|
|
"""
|
|
import requests
|
|
from collections import Counter
|
|
|
|
url = "https://api.fda.gov/food/event.json"
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": f"products.name_brand:*{product_name}*",
|
|
"limit": 1000
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
data = response.json()
|
|
|
|
if "results" not in data:
|
|
return {"error": "No results found"}
|
|
|
|
results = data["results"]
|
|
|
|
# Extract all reactions
|
|
all_reactions = []
|
|
all_outcomes = []
|
|
|
|
for event in results:
|
|
if "reactions" in event:
|
|
all_reactions.extend(event["reactions"])
|
|
if "outcomes" in event:
|
|
all_outcomes.extend(event["outcomes"])
|
|
|
|
# Count frequencies
|
|
reaction_counts = Counter(all_reactions)
|
|
outcome_counts = Counter(all_outcomes)
|
|
|
|
return {
|
|
"total_events": len(results),
|
|
"most_common_reactions": reaction_counts.most_common(10),
|
|
"outcome_distribution": dict(outcome_counts),
|
|
"serious_outcomes": sum(1 for o in all_outcomes if o in ["Hospitalization", "Death", "Disability"])
|
|
}
|
|
```
|
|
|
|
### Recall Alert System
|
|
|
|
```python
|
|
def get_recent_recalls_by_state(state_code, api_key, days=7):
|
|
"""
|
|
Get recent food recalls for products distributed in a specific state.
|
|
|
|
Args:
|
|
state_code: Two-letter state code (e.g., "CA", "NY")
|
|
api_key: FDA API key
|
|
days: Number of days to look back
|
|
|
|
Returns:
|
|
List of recent recalls affecting the state
|
|
"""
|
|
import requests
|
|
from datetime import datetime, timedelta
|
|
|
|
url = "https://api.fda.gov/food/enforcement.json"
|
|
|
|
# Calculate date range
|
|
end_date = datetime.now()
|
|
start_date = end_date - timedelta(days=days)
|
|
date_range = f"[{start_date.strftime('%Y%m%d')}+TO+{end_date.strftime('%Y%m%d')}]"
|
|
|
|
params = {
|
|
"api_key": api_key,
|
|
"search": f"distribution_pattern:*{state_code}*+AND+report_date:{date_range}",
|
|
"limit": 100,
|
|
"sort": "report_date:desc"
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
return data.get("results", [])
|
|
return []
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Monitor allergen recalls** - Critical for food service and retail
|
|
2. **Check distribution patterns** - Recalls may be regional or national
|
|
3. **Track recall status** - Status changes from "Ongoing" to "Completed"
|
|
4. **Filter by classification** - Prioritize Class I recalls for immediate action
|
|
5. **Use date ranges** - Focus on recent events for operational relevance
|
|
6. **Cross-reference products** - Same product may appear in both adverse events and enforcement
|
|
7. **Parse code_info carefully** - Lot numbers and UPCs vary in format
|
|
8. **Consider product categories** - Industry codes help categorize products
|
|
9. **Track serious outcomes** - Hospitalization and death require immediate attention
|
|
10. **Implement alert systems** - Automate monitoring for critical products/allergens
|
|
|
|
## Common Allergens to Monitor
|
|
|
|
The FDA recognizes 9 major food allergens that must be declared:
|
|
1. Milk
|
|
2. Eggs
|
|
3. Fish
|
|
4. Crustacean shellfish
|
|
5. Tree nuts
|
|
6. Peanuts
|
|
7. Wheat
|
|
8. Soybeans
|
|
9. Sesame
|
|
|
|
These account for over 90% of food allergies and are the most common reasons for Class I recalls.
|
|
|
|
## Additional Resources
|
|
|
|
- OpenFDA Food API Documentation: https://open.fda.gov/apis/food/
|
|
- CFSAN Adverse Event Reporting: https://www.fda.gov/food/compliance-enforcement-food/cfsan-adverse-event-reporting-system-caers
|
|
- Food Recalls: https://www.fda.gov/safety/recalls-market-withdrawals-safety-alerts
|
|
- API Basics: See `api_basics.md` in this references directory
|
|
- Python examples: See `scripts/fda_food_query.py`
|