Fda Recalls Scraper
Pricing
Pay per event
Fda Recalls Scraper
Search FDA enforcement database for drug, food, and medical device recalls. Get recall classifications, reasons, product descriptions, and distribution data.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Search the FDA enforcement database for drug, food, and medical device recalls. Get recall classifications, reasons, affected products, distribution patterns, and regulatory details from all three FDA enforcement endpoints.
What does FDA Recalls Scraper do?
This actor searches the openFDA Enforcement API to extract recall data across three product categories:
- Drugs — prescription and OTC medication recalls
- Food — food and dietary supplement recalls
- Medical Devices — device and equipment recalls
Each recall includes the company name, classification severity (Class I/II/III), product description, reason for recall, distribution pattern, initiation date, and regulatory status.
Why use FDA Recalls Scraper?
The FDA's openFDA API is powerful but requires manual URL construction, pagination handling, and response parsing. This actor handles all of that automatically:
- Searches all three enforcement endpoints (drug, food, device) in one run
- Handles pagination to retrieve up to 500 results
- Formats raw 8-digit dates (YYYYMMDD) into readable ISO format
- Filters by product type and recall classification
- Returns clean, structured JSON ready for analysis
How to scrape FDA recall data
- Go to the FDA Recalls Scraper page on Apify Store.
- Enter a search query (e.g., "salmonella", "aspirin", or a company name).
- Optionally filter by product type (drug, food, or device) and classification (Class I/II/III).
- Set the maximum number of results (1-500).
- Click Start and wait for the run to finish.
- Download your data in JSON, CSV, or Excel format.
How much does it cost to scrape FDA recalls?
FDA Recalls Scraper uses the pay-per-event pricing model:
| Event | Price |
|---|---|
| Actor start | $0.001 |
| Per recall extracted | $0.001 |
Cost examples:
| Scenario | Recalls | Estimated cost |
|---|---|---|
| Quick search | 10 | ~$0.011 |
| Medium search | 50 | ~$0.051 |
| Full search | 500 | ~$0.501 |
Platform costs (compute and memory) are additional but minimal — a typical run uses under $0.001 in platform costs.
Input parameters
| Parameter | Type | Description | Default |
|---|---|---|---|
searchQuery | string | Search term (e.g., "salmonella", "aspirin", company name) | Required |
productType | string | Filter by category: drug, food, device, or empty for all | All types |
classification | string | Filter by severity: Class I, Class II, Class III, or empty for all | All classes |
maxResults | integer | Maximum recalls to extract (1–500) | 50 |
Output example
Each recall in the dataset looks like this:
{"recallNumber": "F-0123-2026","recallingFirm": "Example Foods Inc","city": "Chicago","state": "IL","country": "US","classification": "Class I","status": "Ongoing","productType": "food","productDescription": "Frozen chicken nuggets, 12 oz packages","reasonForRecall": "Product may contain undeclared milk allergen","distributionPattern": "Nationwide distribution in retail stores","productQuantity": "15,000 cases","voluntaryMandated": "Voluntary: Firm initiated","recallInitiationDate": "2026-01-15","centerClassificationDate": "2026-01-20","terminationDate": "","reportDate": "2026-02-01","codeInfo": "Best by dates 03/2026 through 06/2026, lot codes A1234-A5678","initialFirmNotification": "Press Release","searchQuery": "chicken allergen","scrapedAt": "2026-03-03T06:45:00.000Z"}
Using the Apify API
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('automation-lab/fda-recalls-scraper').call({searchQuery: 'salmonella',productType: 'food',classification: 'Class I',maxResults: 25,});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((recall) => {console.log(`${recall.recallingFirm} — ${recall.classification}: ${recall.reasonForRecall}`);});
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("automation-lab/fda-recalls-scraper").call(run_input={"searchQuery": "salmonella","productType": "food","classification": "Class I","maxResults": 25,})for recall in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{recall['recallingFirm']} — {recall['classification']}: {recall['reasonForRecall']}")
cURL
curl "https://api.apify.com/v2/acts/automation-lab~fda-recalls-scraper/runs" \-X POST \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "salmonella", "productType": "food", "classification": "Class I", "maxResults": 25}'
Use cases
- Food safety monitoring — Track salmonella, listeria, and allergen recalls across the food supply
- Pharmaceutical compliance — Monitor drug recalls by classification severity for regulatory reporting
- Medical device tracking — Stay informed about device safety issues and recall status
- Supply chain risk — Identify companies with recurring recalls across product categories
- Research and journalism — Analyze recall trends, geographic patterns, and enforcement actions
- Consumer safety alerts — Build notification systems for product recalls in specific categories
Recall classifications explained
The FDA classifies recalls by severity:
| Class | Risk Level | Description |
|---|---|---|
| Class I | Most serious | Reasonable probability of serious health consequences or death |
| Class II | Moderate | May cause temporary or reversible health problems; slight probability of serious consequences |
| Class III | Least serious | Not likely to cause adverse health consequences |
Use with AI agents via MCP
FDA Recalls Scraper is available as a tool for AI assistants via the Model Context Protocol (MCP).
Setup for Claude Code
$claude mcp add --transport http apify "https://mcp.apify.com"
Setup for Claude Desktop, Cursor, or VS Code
{"mcpServers": {"apify": {"url": "https://mcp.apify.com"}}}
Example prompts
- "Get recent FDA food recalls"
- "Search FDA recalls for contamination issues"
Learn more in the Apify MCP documentation.
Integrations
Connect FDA Recalls Scraper with other tools using Apify integrations:
- Slack/Email — Get notified when new Class I recalls match your search
- Google Sheets — Automatically export recall data for tracking and analysis
- Webhooks — Trigger downstream workflows when new recalls are found
- Zapier/Make — Connect recall data to 5,000+ apps for automated workflows
- API — Schedule daily/weekly recall monitoring runs via the Apify API
Tips for best results
- Use specific search terms — "salmonella peanut butter" works better than just "food"
- Filter by product type — Searching a specific endpoint (drug/food/device) is faster than searching all three
- Class I recalls first — Filter by Class I to focus on the most serious safety issues
- Company monitoring — Search by company name (e.g., "Abbott" or "Pfizer") to track specific firms
- Combine with OpenFDA Drug Events — Pair recall data with adverse event reports for comprehensive safety monitoring
Data source
All data comes from the openFDA Enforcement API, a public API maintained by the U.S. Food and Drug Administration. The API is free, requires no authentication, and is updated regularly with new enforcement actions.
Legality
Scraping publicly available data is generally legal according to the US Court of Appeals ruling (HiQ Labs v. LinkedIn). This actor only accesses publicly available information and does not require authentication. Always review and comply with the target website's Terms of Service before scraping. For personal data, ensure compliance with GDPR, CCPA, and other applicable privacy regulations.
FAQ
My search returns 0 results -- what should I try? Try broader search terms. The openFDA API searches across all text fields, so specific product names or lot numbers may not match. Use general terms like "salmonella", "listeria", "allergen", or company names for better results.
Why do some recalls have empty terminationDate fields?
A recall's termination date is only set when the FDA has officially closed the enforcement action. Ongoing recalls will have an empty termination date. Check the status field to see if the recall is still active.
Limitations
- Maximum 500 results per run (API pagination limit)
- The openFDA API may have slight delays between when a recall is announced and when it appears in the database
- Search is text-based across all fields; the API does not support exact field-specific queries for all fields
- Rate limits apply to the openFDA API (approximately 240 requests per minute without an API key)
Other data scrapers
- Eventbrite Scraper — search Eventbrite for events, conferences, and meetups by keyword and location
- Exchange Rate Scraper — get live currency exchange rates for 150+ currencies
- Goodreads Scraper — extract book data, ratings, and reviews from Goodreads