OpenFDA Scraper
Pricing
from $3.00 / 1,000 results
OpenFDA Scraper
Scrape the FDA's openFDA API with drug labels, adverse events (FAERS), drug recalls, NDC directory, drugs@FDA, device events, and food enforcement. Layers in RxNorm (RxNav) drug-equivalence lookups and DailyMed label URLs.
Pricing
from $3.00 / 1,000 results
Rating
5.0
(7)
Developer
Crawler Bros
Maintained by CommunityActor stats
7
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape the U.S. Food and Drug Administration's openFDA open-data APIs for drug labels (Structured Product Labeling), adverse-event reports (FAERS), drug recalls, the NDC directory, drug approvals, device adverse events, and food enforcement actions. Layered with RxNorm / RxNav for drug-equivalence lookups (brand ↔ generic ↔ ingredient) and DailyMed for canonical label URLs.
The actor talks directly to the public FDA, NLM/RxNav and DailyMed APIs — no login, no cookies, no proxy, no third-party API key required. An optional openFDA apiKey can be passed in to raise the anonymous 240 requests/minute / 1,000 requests/day cap.
Data Source
- openFDA:
https://api.fda.gov/— the FDA's public, open, JSON REST APIs covering drugs, devices and food. - RxNorm / RxNav:
https://rxnav.nlm.nih.gov/REST/— the U.S. National Library of Medicine's open drug-concept service. - DailyMed:
https://dailymed.nlm.nih.gov/— the NIH/NLM authoritative Structured Product Labeling repository.
All three sources are freely accessible from any IP without registration.
What you can do
Pick a mode and feed it the matching filters:
| Mode | Use it when you want… |
|---|---|
searchLabels | Free-text search over drug labels (brand/generic/substance/manufacturer) |
searchEvents | Search FAERS adverse-event reports for a drug, manufacturer or date range |
searchRecalls | Search FDA drug-enforcement / recall actions by keyword, class or date |
searchNdcs | Search the FDA NDC directory by name, manufacturer or dosage form |
byBrandName | Pull every dataset (labels + NDC + events + recalls) for one brand name |
byGenericName | Same as byBrandName but keyed on the generic name |
byNdcCode | Resolve everything tied to a single National Drug Code |
rxNormLookup | Resolve a drug name into an RxCUI plus brand/generic/ingredient equivalents |
deviceEvents | Search device adverse-event reports (/device/event.json) |
foodEnforcement | Search FDA food-enforcement / recall actions (/food/enforcement.json) |
Inputs
| Field | Type | Purpose |
|---|---|---|
mode | enum (10 values) | Endpoint to query |
searchQuery | string | Free-text query (used by all search* and lookup modes) |
brandName | string | Exact brand-name lookup |
genericName | string | Exact generic-name lookup |
ndcCode | string | NDC identifier (e.g. 0573-0164) |
rxnormName | string | Drug name for RxNorm lookup |
dataset | multi-select enum | For brand/generic modes — pick which datasets (labels, events, recalls, ndc, shortages, deviceEvents, foodEnforcement) |
manufacturerName | string | Filter by labeler / manufacturer (substring match) |
dosageForm | multi-select enum | Tablet, Capsule, Injection, Solution, Cream, … (18 values) |
route | multi-select enum | Oral, IV, IM, SC, Topical, Ophthalmic, … (16 values) |
marketingStatus | multi-select enum | Prescription / OTC / NDA / ANDA / BLA / Monograph / Discontinued |
dateFrom / dateTo | ISO date | Filter events / recalls by receive / initiation date |
seriousnessOnly | boolean | Limit FAERS reports to those flagged "serious" |
recallClass | enum (ALL / I / II / III) | FDA recall classification |
voluntaryMandated | enum | Voluntary firm-initiated vs FDA-mandated recalls |
recallStatus | enum (Ongoing / Completed / Terminated / Pending) | |
containsKeyword | string | Final post-filter substring match across any text field |
apiKey | string (secret, optional) | Optional openFDA API key to raise rate limits |
maxItems | integer (1–1000) | Hard cap on emitted records |
Output
Records are pushed into the actor's default dataset. Each record has a recordType (drugLabel, adverseEvent, drugRecall, ndc, drugApproval, deviceEvent, foodRecall, or rxNorm) and a scrapedAt ISO timestamp. Empty/null fields are stripped — every key that appears carries real data.
Drug label fields
setId, splId, brandName, genericName, manufacturer, productType, route[], dosageForm[], substanceName[], ndc[], rxCui, nui[], pharmClass[], description, indicationsAndUsage, contraindications, warningsAndCautions, adverseReactions, dosageAndAdministration, packagingDescription, purpose, activeIngredient, effectiveDate, labelUrl (DailyMed canonical lookup), recordType, scrapedAt.
Adverse-event fields
reportId, receiveDate, serious, seriousnessCodes[], reactions[], outcomes[], drugs[] (with name, role, dose, indication), patient (age, sex, weightKg), reporter (country, qualification), recordType, scrapedAt.
Recall fields
recallNumber, status, classification, productDescription, productType, codeInfo, reasonForRecall, voluntaryMandated, initialFirmNotification, distributionPattern, recallingFirm, city, state, country, productQuantity, recallInitiationDate, reportDate, centerClassificationDate, terminationDate, brandName, genericName, ndc[], recordType, scrapedAt.
NDC fields
productNdc, productId, brandName, genericName, labelerName, productType, dosageForm, marketingCategory, marketingStatus, applicationNumber, marketingStartDate, marketingEndDate, listingExpirationDate, route[], activeIngredients[], packaging[], pharmClass[], splId, labelUrl, recordType, scrapedAt.
RxNorm fields
queryName, rxCui, ingredients[], preciseIngredients[], multiIngredients[], brandNames[], clinicalDrugs[], brandedDrugs[], dosageForm[], dosageFormGroup[], recordType, scrapedAt.
Example input
{"mode": "searchLabels","searchQuery": "ibuprofen","maxItems": 15}
{"mode": "byBrandName","brandName": "Tylenol","dataset": ["labels", "recalls"],"maxItems": 30}
{"mode": "searchEvents","searchQuery": "lipitor","seriousnessOnly": true,"dateFrom": "2020-01-01","maxItems": 50}
{"mode": "rxNormLookup","rxnormName": "metformin"}
FAQ
Q: Do I need an API key?
No. The openFDA API is completely open. An optional apiKey field is exposed only to lift the 240 req/min / 1,000 req/day anonymous quota; you can register for one for free at https://open.fda.gov/apis/authentication/.
Q: Do I need a proxy? No. All three upstream APIs (openFDA, RxNav, DailyMed) serve any IP without bot detection.
Q: How fresh is the data? openFDA refreshes weekly for FAERS, monthly for NDC and SPL labels, weekly for enforcement reports. The actor always queries live — no caching layer.
Q: Why are some drug-event fields missing on certain records? FAERS reports are voluntary and patient-completed; data quality varies. The actor strips every empty/null key from each record so you only ever see fields with real values.
Q: How does pagination work?
openFDA supports skip up to 25,000 records per query. The actor handles this transparently — set maxItems up to 1,000 per run; for larger pulls, narrow the query with date or manufacturer filters.
Q: What is RxNorm used for?
RxNorm gives you a canonical drug identifier (RxCUI) plus the full equivalence map: brand names, generic ingredients, branded vs. clinical drugs, dosage forms. Useful for cross-referencing brand-to-generic and finding all formulations of a substance.
Q: Where do the labelUrl links go?
DailyMed is the NIH's official public copy of the FDA Structured Product Labeling. Each label URL resolves to the human-readable label page on dailymed.nlm.nih.gov.
Q: Can I filter by route and dosage form simultaneously?
Yes. route and dosageForm are multi-select; any selected value matches (OR across the selection). The two filters compose with AND.