OpenFDA Scraper avatar

OpenFDA Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
OpenFDA Scraper

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

Crawler Bros

Maintained by Community

Actor stats

7

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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:

ModeUse it when you want…
searchLabelsFree-text search over drug labels (brand/generic/substance/manufacturer)
searchEventsSearch FAERS adverse-event reports for a drug, manufacturer or date range
searchRecallsSearch FDA drug-enforcement / recall actions by keyword, class or date
searchNdcsSearch the FDA NDC directory by name, manufacturer or dosage form
byBrandNamePull every dataset (labels + NDC + events + recalls) for one brand name
byGenericNameSame as byBrandName but keyed on the generic name
byNdcCodeResolve everything tied to a single National Drug Code
rxNormLookupResolve a drug name into an RxCUI plus brand/generic/ingredient equivalents
deviceEventsSearch device adverse-event reports (/device/event.json)
foodEnforcementSearch FDA food-enforcement / recall actions (/food/enforcement.json)

Inputs

FieldTypePurpose
modeenum (10 values)Endpoint to query
searchQuerystringFree-text query (used by all search* and lookup modes)
brandNamestringExact brand-name lookup
genericNamestringExact generic-name lookup
ndcCodestringNDC identifier (e.g. 0573-0164)
rxnormNamestringDrug name for RxNorm lookup
datasetmulti-select enumFor brand/generic modes — pick which datasets (labels, events, recalls, ndc, shortages, deviceEvents, foodEnforcement)
manufacturerNamestringFilter by labeler / manufacturer (substring match)
dosageFormmulti-select enumTablet, Capsule, Injection, Solution, Cream, … (18 values)
routemulti-select enumOral, IV, IM, SC, Topical, Ophthalmic, … (16 values)
marketingStatusmulti-select enumPrescription / OTC / NDA / ANDA / BLA / Monograph / Discontinued
dateFrom / dateToISO dateFilter events / recalls by receive / initiation date
seriousnessOnlybooleanLimit FAERS reports to those flagged "serious"
recallClassenum (ALL / I / II / III)FDA recall classification
voluntaryMandatedenumVoluntary firm-initiated vs FDA-mandated recalls
recallStatusenum (Ongoing / Completed / Terminated / Pending)
containsKeywordstringFinal post-filter substring match across any text field
apiKeystring (secret, optional)Optional openFDA API key to raise rate limits
maxItemsinteger (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.