L logiover
developer-tools · May 22, 2026 · 6 min read

How to Scrape FDA Drug & Device Data in 2026

Pull drug and device recalls, 20M+ adverse events, drug labels and 510(k) clearances from the official openFDA API — no key, no blocking, tens of thousands per run.

The U.S. Food and Drug Administration publishes one of the richest open regulatory datasets in the world through openFDA — drug and device recalls, more than 20 million adverse-event reports, drug labels, and 510(k) device clearances. Unlike most “scraping” targets, this isn’t a defended website you have to fight. It’s an official, public REST API with no login and no key. The challenge isn’t access; it’s volume, query syntax, and keeping a feed fresh. This guide covers what openFDA exposes, how to extract it at scale, and what schema decisions matter for compliance and research workflows.

What’s worth extracting

openFDA spans several distinct datasets, each with its own fields. The actor covers the most-used ones:

  • Drug recalls (enforcement) — recalling firm, product description, recall reason, classification (Class I/II/III), status, distribution pattern, initiation and report dates.
  • Device recalls — analogous enforcement records for medical devices, plus product codes.
  • Food recalls — firm, product, reason, classification, geographic scope.
  • Adverse events — drug, device, food, and animal/veterinary reports; 20M+ records across datasets, including reaction terms, seriousness flags, patient demographics, and reporter type.
  • Drug labels — structured product labeling: indications, warnings, dosage, active ingredients.
  • 510(k) clearances — device clearance records: applicant, device name, product code, decision date, clearance type.

Each record comes back as flat, structured JSON with firm and product identifiers, descriptions, reasons, classifications, status, location, dates, product type, and a scrape timestamp — ready for ingestion without a parsing layer.

The extraction reality: API rate limits, not anti-bot

There’s no bot-detection stack here. openFDA is designed to be queried programmatically. What you manage instead is throughput and freshness:

  • No API key needed for the volumes this actor targets, though openFDA offers higher limits with a free key. Without a key, you get a per-IP request budget that’s generous but real.
  • Pagination via skip/limit. openFDA caps limit per request (1,000) and historically caps the skip window, so large pulls require careful paging and, for very deep result sets, splitting queries by date or field value.
  • Search syntax matters. openFDA uses a Lucene-style query language. You filter with field qualifiers and ranges — for example classification:"Class I", a report_date range, or a firm name match. Getting the syntax right is the difference between 50 relevant rows and a timeout.
  • Dataset freshness varies. Enforcement (recall) data updates on a regular cadence (roughly weekly); adverse-event data lags more. Don’t assume “today’s” recall is in the API today.

This is where a managed actor earns its keep: it wraps the search syntax, handles pagination up to the API ceiling, retries on transient errors, and is built for scheduled runs so your enforcement and safety feeds stay current without you babysitting the rate limiter.

Run the FDA Data Scraper — drug, device and food recalls, 20M+ adverse events, drug labels and 510(k) clearances straight from openFDA. No API key, no blocking, tens of thousands of records per run.

How querying works

The core inputs map directly onto openFDA’s query model:

dataset:        drug-recall | device-recall | food-recall
                | drug-event | device-event | drug-label | device-510k
search:         openFDA Lucene query, e.g.
                classification:"Class I" AND report_date:[20260101 TO 20260603]
firm:           recalling firm name match
date_range:     start / end
limit:          target record count (paged under the hood)

A practical pattern for monitoring: scope to one dataset, pin a rolling date window (e.g. the last 30 days), and schedule daily. Each run returns only what’s new in that window, which you diff against your store. For a one-time research backfill, widen the date range and raise the limit — the actor pages through up to the API’s ceiling, splitting where openFDA’s skip window would otherwise block you.

Schema design for downstream use

A normalized recall row that’s easy to query and join:

{
  "dataset": "drug-recall",
  "recall_number": "D-0123-2026",
  "firm_name": "Acme Pharmaceuticals Inc.",
  "product_description": "Lisinopril Tablets USP, 10 mg, 1000-count bottle",
  "reason_for_recall": "CGMP deviations: subpotent results at expiry",
  "classification": "Class II",
  "status": "Ongoing",
  "distribution_pattern": "Nationwide US",
  "product_type": "Drug",
  "city": "Trenton",
  "state": "NJ",
  "country": "United States",
  "recall_initiation_date": "2026-04-18",
  "report_date": "2026-05-02",
  "scraped_at": "2026-05-22T11:00:00Z"
}

Schema choices that pay off:

  • Always store dataset and recall_number together. Recall numbers are unique within a dataset, not globally; the pair is your stable key.
  • Normalize classification to the three FDA tiers (I/II/III). It’s the single most important severity signal for liability and risk work.
  • Keep both recall_initiation_date and report_date. The gap between them — how long before a recall was publicly reported — is itself an analytical signal.
  • Stamp scraped_at. Records get amended (status flips from “Ongoing” to “Completed”); you need to know when you captured a given state.
  • For adverse events, don’t flatten the reaction array. A single report can list many reactions; keep them as an array if you care about co-occurrence analysis.

Typical use cases

  • Product-liability and drug-injury law firms monitoring recalls and adverse events to source and qualify cases as they’re reported.
  • Pharma and medical-device safety teams tracking competitor recalls and adverse-event signals.
  • Compliance and regulatory teams maintaining live enforcement feeds scoped to their product categories.
  • Health-tech companies and researchers building research datasets and training corpora from FDA open data.
  • Insurers and risk analysts quantifying recall frequency and severity by firm, product type, and classification.
  • Journalists and watchdogs surfacing high-severity (Class I) recalls and emerging safety trends.

The common thread is that the value compounds with freshness and completeness. A monthly snapshot is fine for research; a daily-refreshed enforcement feed is operational infrastructure for legal and compliance teams.

Cost math

The actor is pay-per-event with a negligible per-run start fee and no per-result charge, so your real cost is Apify compute. Because openFDA is a plain API with no browser and no proxy, runs are fast and inexpensive — tens of thousands of records per run sit comfortably within Apify’s free monthly credit for most monitoring use cases. A daily scheduled enforcement feed across a few datasets typically lands in the low single digits of dollars per month.

Building it yourself is doable — openFDA is well documented — but you’d own the Lucene query layer, the pagination-and-skip-ceiling workaround, retry handling, and the scheduler. For a research backfill that’s a weekend; for an ongoing feed it’s recurring maintenance the actor absorbs.

Common pitfalls

  • The skip ceiling. openFDA limits how deep you can paginate with skip. Naive “skip += 1000 forever” loops silently truncate large result sets. Split deep queries by date or another high-cardinality field.
  • Date formats. openFDA dates are often YYYYMMDD strings in queries (report_date:[20260101 TO 20260603]). Mismatched formats return zero rows with no error.
  • Freshness assumptions. Don’t equate “recall announced in the news today” with “in openFDA today.” Enforcement data has a publication cadence; adverse events lag further.
  • Adverse-event volume. The 20M+ figure is real. Always scope adverse-event pulls by drug/device and date, or you’ll request far more than you can use.
  • Field availability differs by dataset. A field present in drug-recall may be absent in device-510k. Don’t assume a uniform schema across datasets — key your logic on the dataset value.

Wrapping up

openFDA is a gift: authoritative U.S. regulatory data, free, keyless, and structured. The work isn’t getting in — it’s mastering the query syntax, surviving the pagination ceiling, and keeping a feed fresh on a schedule. If you need a one-time research dataset, the API is friendly enough to hit directly. If you need a daily enforcement and safety feed for legal, compliance, or safety work, a managed actor that already handles the syntax, paging, and scheduling gets you to clean, current data immediately.

Open the FDA Data Scraper on Apify — recalls, adverse events, labels and 510(k) clearances, filterable by firm, classification and date. Pay-per-event, free monthly credit to start.

Related guides