openFDA Scraper — FDA Recalls, 510(k), NDC & Adverse Events
Pricing
from $4.00 / 1,000 results
openFDA Scraper — FDA Recalls, 510(k), NDC & Adverse Events
Scrape the official openFDA API — drug/device/food recalls, device 510(k) clearances, the drug NDC directory and FAERS adverse events. Keyless, full Lucene search. For pharma and med-device intel, recall monitoring, pharmacovigilance and litigation research.
openFDA Scraper — FDA Recalls, 510(k) Clearances, Drug NDC & Adverse Events
Extract official, structured regulatory data from the US Food and Drug Administration's openFDA database. Retrieve clean, standardized records across drug, medical device, and food recalls (Enforcement Reports), 510(k) medical device premarket clearances, the National Drug Code (NDC) Directory, and FAERS post-marketing drug adverse event reports.
Execute full openFDA Lucene queries with Boolean filters, field scoping, and custom sorting. Every record is normalized into tidy columns with unified summary fields, unpacked nested clinical arrays, and standardized ISO dates.
No API keys needed, no browser overhead, and zero complex infrastructure. Built for life sciences regulatory analysts, medical device competitive intelligence teams, pharmacovigilance specialists, clinical researchers, mass-tort / product-liability legal teams, and pharmaceutical supply chain monitors.
⚡ At a glance
| Feature | Specification |
|---|---|
| Data Source | Official US FDA Public API (api.fda.gov) |
| Authentication | Keyless & public (optional free API key supported to increase rate limits) |
| Datasets Supported | Drug Recalls, Device Recalls, Food Recalls, 510(k) Clearances, NDC Directory, FAERS Adverse Events |
| Search Syntax | Full Apache Lucene search queries (field:value, AND, OR, NOT, wildcards) |
| Batch Efficiency | Up to 1,000 records per individual request (ultra-fast 2–5s execution) |
| Output Formats | Dataset (JSON, CSV, XML, Excel), Live API, Webhooks, Google Sheets |
| Scale & Pagination | Automated skip pagination supporting up to 25,000 records per query |
| Date Normalization | Automatic conversion from FDA YYYYMMDD strings to ISO YYYY-MM-DD |
| Proxy Requirement | Apify Datacenter Proxy with automated session rotation |
⚖️ Comparison: openFDA Scraper vs Alternatives
| Criteria | openFDA Scraper (This Actor) | Raw openFDA API | FDA FOIA Requests |
|---|---|---|---|
| Setup & Coding | 🟢 Zero code, web UI + direct API | 🔴 Complex custom REST integration | 🔴 Manual paperwork & legal filings |
| Data Normalization | 🟢 Tidy flat columns + unified summary | 🔴 Deeply nested JSON / arrays | 🔴 Scanned PDFs and paper copies |
| Date Formatting | 🟢 ISO standard (YYYY-MM-DD) | 🔴 Raw integer strings (YYYYMMDD) | 🟡 Varies by document |
| Pagination Handling | 🟢 Auto-paging up to 25,000 records | 🔴 Manual skip/limit looping | 🔴 Not applicable |
| Export Formats | 🟢 Instant CSV, Excel, JSON, XML | 🔴 JSON only | 🔴 Static PDFs / paper records |
| Turnaround Time | 🟢 Instant (seconds) | 🟢 Instant (seconds) | 🔴 Weeks to months |
🎯 Key Use Cases
1. Drug, Device & Food Recall Surveillance
Set up automated compliance pipelines to monitor urgent Class I (high risk of serious injury or death), Class II, and Class III recalls. Track specific pharmaceutical manufacturers (e.g. recalling_firm:Pfizer), therapeutic classes, or affected states to safeguard hospital supply chains and retail inventory.
2. Medical Device Competitive Intelligence & Clearance Tracking
Track competitor 510(k) premarket clearance submissions (e.g. applicant:Medtronic, applicant:Stryker) and clearance dates (decision_date:desc). Monitor medical device market entry timelines, product codes, predicate device classifications, and advisory committee reviews.
3. Pharmacovigilance & Adverse Event Analysis
Analyze real-world post-marketing safety data from the FDA Adverse Event Reporting System (FAERS). Query reported patient adverse reactions (MedDRA preferred terms), concomitant suspect medications, patient demographics, and seriousness indicators (hospitalization, life-threatening, death).
4. Pharmaceutical Directory & National Drug Code (NDC) Enrichment
Build or enrich master pharmaceutical catalogs using authoritative NDC directory records. Extract proprietary brand names, non-proprietary generic names, active ingredient strengths, dosage forms, administration routes, and labeler/distributor corporate details.
5. Product Liability & Legal Litigation Research
Construct authoritative evidence bases for medical device defect investigations, pharmaceutical mass-tort cases, and corporate regulatory compliance audits.
📊 Extracted Data Fields by Dataset
Every record includes standardized top-level fields: recordType, title, date, summary, and scrapedAt. Dataset-specific fields are detailed below:
🚨 1. Recall Enforcement Reports (drug-enforcement, device-enforcement, food-enforcement)
| Field | Type | Description | Coverage |
|---|---|---|---|
recallNumber | String | Official FDA recall tracking number (e.g. D-0084-2027) | 🟢 High (100%) |
classification | String | Recall hazard level (Class I, Class II, Class III) | 🟢 High (100%) |
status | String | Current status (Ongoing, Completed, Terminated) | 🟢 High (100%) |
recallingFirm | String | Full corporate name of the firm initiating the recall | 🟢 High (100%) |
productType | String | Regulated product category (Drugs, Devices, Food) | 🟢 High (100%) |
productDescription | String | Detailed description of the recalled product and packaging | 🟢 High (100%) |
reasonForRecall | String | Official medical/regulatory reason for the recall | 🟢 High (100%) |
distributionPattern | String | Geographic distribution territory (e.g. US Nationwide, CA, NY) | 🟢 High (95%) |
voluntaryMandated | String | Whether voluntary or FDA-mandated | 🟢 High (95%) |
city / state / country | String | Corporate headquarters location of the recalling firm | 🟢 High (95%) |
recallInitiationDate | String | Date the firm first initiated the recall (YYYY-MM-DD) | 🟢 High (95%) |
reportDate | String | Date the recall was officially published by the FDA (YYYY-MM-DD) | 🟢 High (100%) |
brandNames | Array | Brand name aliases extracted from the record | 🟡 Conditional (75%) |
🩺 2. Medical Device 510(k) Clearances (device-510k)
| Field | Type | Description | Coverage |
|---|---|---|---|
kNumber | String | Premarket 510(k) clearance number (e.g. K231450) | 🟢 High (100%) |
deviceName | String | Trade name of the medical device | 🟢 High (100%) |
applicant | String | Device sponsor / manufacturing company name | 🟢 High (100%) |
contact | String | Primary corporate contact person | 🟢 High (90%) |
productCode | String | Three-letter FDA product classification code | 🟢 High (98%) |
decisionCode | String | FDA review outcome (e.g. SESE - Substantially Equivalent) | 🟢 High (100%) |
decisionDate | String | Date the clearance decision was issued (YYYY-MM-DD) | 🟢 High (100%) |
dateReceived | String | Date the FDA originally received the 510(k) application | 🟢 High (98%) |
clearanceType | String | Application type (Traditional, Special, Abbreviated) | 🟢 High (95%) |
advisoryCommittee | String | Review panel (e.g. Cardiovascular, Orthopedic, General Hospital) | 🟢 High (95%) |
deviceClass | String | Regulatory risk classification (1, 2, 3) | 🟢 High (95%) |
💊 3. National Drug Code (NDC) Directory (drug-ndc)
| Field | Type | Description | Coverage |
|---|---|---|---|
productNdc | String | Standard National Drug Code identifier (e.g. 50580-449) | 🟢 High (100%) |
brandName | String | Proprietary commercial brand name (e.g. TYLENOL) | 🟢 High (95%) |
genericName | String | Active pharmaceutical ingredient generic name | 🟢 High (95%) |
labelerName | String | Name of the pharmaceutical distributor or manufacturer | 🟢 High (100%) |
dosageForm | String | Physical form (e.g. TABLET, CAPSULE, INJECTION) | 🟢 High (98%) |
route | Array | Administration route (e.g. ORAL, INTRAVENOUS) | 🟢 High (95%) |
marketingCategory | String | Regulatory pathway (NDA, ANDA, OTC MONOGRAPH FINAL) | 🟢 High (95%) |
activeIngredients | Array | Active substance ingredients with strength measurements | 🟢 High (95%) |
packaging | Array | Commercial packaging units and NDC package codes | 🟢 High (95%) |
⚠️ 4. FAERS Adverse Event Reports (drug-event)
| Field | Type | Description | Coverage |
|---|---|---|---|
safetyReportId | String | Unique FDA safety report identifier | 🟢 High (100%) |
serious | String | Seriousness code (1 = serious event, 2 = other) | 🟢 High (100%) |
seriousnessDeath | String | Indication if the adverse event resulted in patient death | 🟡 Conditional (when reported) |
receiveDate | String | Date report was logged into the FDA database (YYYY-MM-DD) | 🟢 High (100%) |
patientSex | String | Patient biological sex (1 = Male, 2 = Female) | 🟢 High (90%) |
patientOnsetAge | String | Numerical age at adverse event onset | 🟡 Conditional (75%) |
reactions | Array | MedDRA preferred terms for adverse reactions | 🟢 High (100%) |
drugs | Array | Suspect and concomitant medications administered | 🟢 High (100%) |
indications | Array | Medical indications for which suspect drugs were taken | 🟢 High (85%) |
primarySourceCountry | String | ISO country code of the reporting healthcare provider | 🟢 High (95%) |
⚙️ Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
dataset | String | "drug-enforcement" | Target endpoint: "drug-enforcement", "device-enforcement", "food-enforcement", "device-510k", "drug-ndc", or "drug-event". |
search | String | "" | openFDA Apache Lucene query string. Supports field qualifiers and Boolean operators. |
sort | String | "" | Sort expression (field:desc or field:asc), e.g. report_date:desc, decision_date:desc. |
maxItems | Integer | 0 (prefill: 100) | Maximum records to extract (up to 25,000 per query). Set 0 for default 100. |
apiKey | String | "" | Optional free openFDA API key to increase rate limits. Not required for standard runs. |
proxyConfiguration | Object | { "useApifyProxy": true } | Apify proxy settings. Standard datacenter proxy handles all endpoints cleanly. |
🔍 Proven Lucene Search Query Recipes
Use these high-impact query templates in the search input field:
| Objective | Dataset | Lucene Query Expression |
|---|---|---|
| Urgent Class I Drug Recalls | drug-enforcement | classification:"Class I" AND status:Ongoing |
| Recalls by Specific Pharma Firm | drug-enforcement | recalling_firm:Pfizer |
| Medical Device Clearances by Company | device-510k | applicant:Medtronic |
| Cardiovascular Device Clearances | device-510k | advisory_committee:CV |
| Drug Product Search by Brand Name | drug-ndc | brand_name:Tylenol |
| Prescription Only Injectable Drugs | drug-ndc | dosage_form:INJECTION AND marketing_category:NDA |
| Adverse Events for Specific Medication | drug-event | patient.drug.medicinalproduct:aspirin AND serious:1 |
| Pediatric Adverse Drug Reactions | drug-event | patient.patientonsetageunit:801 AND patient.patientonsetage:[1 TO 12] |
📦 Output Sample
Here is a representative JSON record output from the drug-enforcement dataset:
{"recordType": "drug-enforcement","title": "Greenwich Rx","date": "2026-10-28","summary": "Microbial Contamination of Sterile Products","recallNumber": "D-0084-2027","status": "Ongoing","classification": "Class I","recallingFirm": "Greenwich Rx","productType": "Drugs","productDescription": "Glutathione Injection, 200 mg/mL, 10 mL multi-dose vial, Rx only","reasonForRecall": "Microbial Contamination of Sterile Products identified during sterility audit","distributionPattern": "US Nationwide","voluntaryMandated": "Voluntary: Firm initiated","city": "Tomball","state": "TX","country": "United States","recallInitiationDate": "2026-10-01","reportDate": "2026-10-28","brandNames": ["Glutathione"],"eventId": "94812","scrapedAt": "2026-11-10T14:40:00.000Z"}
⚠️ Understanding FDA Recall Hazard Classifications
The FDA classifies recalls into three numeric classes based on the relative degree of health hazard:
| Hazard Classification | FDA Statutory Definition | Example Scenarios | Action Urgency |
|---|---|---|---|
| Class I | Dangerous or defective products that could cause serious adverse health consequences or death. | Non-sterile injectable drugs, endotoxin contamination, undeclared lethal allergens, defective life-supporting defibrillators. | 🚨 Urgent public warnings & immediate product removal |
| Class II | Products that might cause temporary or medically reversible adverse health consequences, or where the probability of serious injury is remote. | Subpotent prescription drugs, mislabeled dosage instructions, particulate matter in oral solutions. | 🟡 Standard commercial recall & patient notification |
| Class III | Products that violate FDA labeling or manufacturing regulations but are unlikely to cause adverse health consequences. | Minor container defects, minor labeling omissions, technical compliance issues without therapeutic compromise. | 🟢 Administrative product return or relabeling |
🏛️ Medical Device 510(k) Review Panels Reference
When filtering 510(k) medical device premarket clearances using advisory_committee: in your Lucene queries, use these standard two-letter panel codes:
| Panel Code | Advisory Committee Review Panel | Common Cleared Device Types |
|---|---|---|
AN | Anesthesiology | Ventilators, gas delivery systems, monitors |
CV | Cardiovascular | Vascular stents, heart valve catheters, ECG devices |
DE | Dental | Dental implants, orthodontic aligners, bone graft matrix |
GU | Gastroenterology & Urology | Endoscopes, hemodialysis machines, urinary catheters |
HO | General Hospital & Personal Use | Infusion pumps, hypodermic syringes, hospital beds |
NE | Neurological | Neurostimulators, cranioplasty plates, EEG monitors |
OP | Ophthalmic | Intraocular lenses, diagnostic lasers, contact lens solutions |
OR | Orthopedic | Spinal fusion cages, hip/knee prosthetic implants |
RA | Radiology | CT scanners, MRI systems, medical imaging PACS software |
💻 API & Integration Examples
Integrate live FDA regulatory data directly into your Python analytical pipelines, Node.js services, or automation webhooks.
Python Example (Pharma Compliance Monitor)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run_input = {"dataset": "drug-enforcement","search": "classification:\"Class I\" AND status:Ongoing","sort": "report_date:desc","maxItems": 100}run = client.actor("haketa/openfda-scraper").call(run_input=run_input)for recall in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"[{recall['classification']}] {recall['recallingFirm']} - {recall['title']}: {recall['reasonForRecall'][:80]}...")
Node.js Example (Device Clearance Tracker)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const input = {dataset: 'device-510k',search: 'decision_date:[20260101 TO 20261231]',sort: 'decision_date:desc',maxItems: 50};const run = await client.actor('haketa/openfda-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Retrieved ${items.length} 510(k) clearances.`);console.table(items.map(d => ({ kNumber: d.kNumber, device: d.deviceName, applicant: d.applicant, date: d.decisionDate })));
cURL Example
curl --request POST \--url "https://api.apify.com/v2/acts/haketa~openfda-scraper/runs?token=YOUR_APIFY_TOKEN" \--header "Content-Type: application/json" \--data '{"dataset": "drug-ndc","search": "brand_name:Amoxicillin","maxItems": 50}'
Webhook Alert Example for Compliance Teams
Set up an Apify webhook to instantly alert your regulatory affairs team on Slack, Microsoft Teams, or PagerDuty whenever a Class I recall is detected:
{"eventType": "ACTOR.RUN.SUCCEEDED","actorId": "haketa/openfda-scraper","datasetId": "YOUR_DATASET_ID","recordsCount": 100,"dataset": "drug-enforcement","alert": "Class I Recall Published","recallingFirm": "Greenwich Rx","hazardSummary": "Microbial Contamination of Sterile Products"}
🚀 Tips for High-Volume Extraction
- Instant 1,000-Record Pulls: The actor requests 1,000 items per batch. Standard pulls under 1,000 items complete in a single lightning-fast HTTP call.
- Sorting for Freshness: Always include
sort: "report_date:desc"(recalls) orsort: "decision_date:desc"(device clearances) to ensure your dataset prioritizes newly published actions. - Targeted Lucene Filtering: Use exact phrase quotes (e.g.
classification:"Class I") to avoid false positive term matching. - Handling openFDA Limits: openFDA limits standard skip-based pagination to 25,000 records per search expression. For corpora larger than 25,000 records, partition your queries by year or geographic state.
❓ Frequently Asked Questions (FAQ)
Do I need to obtain an official openFDA API key?
No. The openFDA API is publicly accessible without an API key. For high-frequency automated polling, you can optionally provide a free API key from open.fda.gov in the apiKey field to lift rate limits.
How frequently are FDA datasets refreshed?
The FDA typically updates recall enforcement reports weekly on Wednesdays, medical device 510(k) clearances monthly, and FAERS adverse events on a quarterly basis.
Can I export results to Excel, CSV, or Google Sheets?
Yes. Every dataset can be downloaded immediately as Excel (XLSX), CSV, JSON, or XML from the Apify Console or integrated automatically using live dataset API endpoints.
Why are some brandNames empty in recall records?
The FDA's underlying recall records originate from enforcement field reports. When an official product matches the NDC directory, openFDA attaches an openfda annotation block containing brand names. When not matched, this field remains null, which is expected behavior.
How do I load FDA recall data directly into pandas?
Use the Apify Python client or load the dataset CSV endpoint directly:
import pandas as pddf = pd.read_csv("https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items?format=csv")print(df[["classification", "recallingFirm", "reportDate"]].head())
Can I schedule weekly recall checks?
Yes. Create a scheduled task in the Apify Console with the cron expression 0 14 * * 3 (every Wednesday at 2:00 PM UTC) to align with the FDA's standard weekly enforcement report publishing cycle.
Does the scraper support wildcards in Lucene queries?
Yes. You can use standard Lucene single-character (?) and multiple-character (*) wildcards (e.g., brand_name:Amox* or recalling_firm:Pharma*).
📋 Regulatory Compliance & Legal Use Notes
-
Authoritative Primary Source: Data is directly queried from
api.fda.gov, reflecting official FDA database records without intermediary alteration. -
Audit Trail Compliance: Every extracted record contains an immutable ISO 8601 UTC timestamp (
scrapedAt), supporting regulatory audit trail requirements for life sciences quality management systems (QMS). -
Public Domain Information: FDA recall enforcement reports, premarket 510(k) summary decisions, and NDC directory filings reside in the public domain under US government open data statutes.
-
Data Freshness Guarantee: Live queries dynamically retrieve the most up-to-date entries in the FDA repositories at execution time.
-
Deduplication Safeguards: Output records feature natural composite keys (such as
recallNumber,kNumber,productNdc, orsafetyReportId) ensuring seamless database ingestion. -
Automated Field Normalization: Nested clinical objects are unpacked into tidy array strings, eliminating parsing overhead for data science pipelines.
-
Enterprise Cloud Scalability: Runs on resilient Apify cloud workers capable of streaming large historical cohorts into persistent datasets without timeouts.
🔗 Related Healthcare & Registry Scrapers
- ClinicalTrials.gov Scraper — Global clinical study protocols and trial results.
- NPPES NPI Registry Scraper — US National Provider Identifier doctor and clinic registry.
- Healthgrades Doctor Scraper — Physician ratings, patient reviews, and hospital affiliations.
- SEC EDGAR Scraper — Public biotech and pharmaceutical 10-K / 10-Q filing extractor.
- European Medicines Agency (EMA) Scraper — European drug regulatory decisions.
📋 Changelog
Version 1.2 (2026-11)
- Unlocked 1,000+ Deep Pagination: Removed restrictive pagination ceilings; streamlined skip-pagination engine to traverse up to 25,000 records per query cleanly.
- Fast Prefill Execution: Optimized default batch parameters to complete test runs in under 10 seconds while providing 100 rich sample records.
- Enhanced Clinical Array Parsing: Standardized flattening of FAERS adverse drug reactions, concomitant medication lists, and MedDRA clinical terms.
- Robust 429 Retry Engine: Integrated progressive exponential backoff on high-volume rate-limited requests.
Version 1.1 (2026-10)
- Added automatic ISO date formatting (
YYYY-MM-DD) from raw FDA integer timestamps. - Unified top-level
title,date, andsummaryschema across all six distinct endpoints.
Version 1.0 (2026-09)
- Initial release supporting drug, device, and food recalls, 510(k) clearances, NDC directory, and FAERS adverse events.