openFDA Scraper
Pricing
from $2.50 / 1,000 results
openFDA Scraper
Scrape openFDA: drug, device and food recalls, FAERS and MAUDE adverse-event reports, drug labels with boxed warnings, Drugs@FDA approvals and 510(k) clearances. Search by keyword, query or date and get one clean row per record. No login, no proxy, API key optional.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
Anyx Solutions
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Share

openFDA Scraper
FDA recalls, adverse-event reports, drug labels, drug approvals and 510(k) clearances from openFDA, searchable by keyword and date, as clean JSON.
openFDA is the US Food and Drug Administration's public data service: millions of records on the drugs, medical devices and foods sold in the United States. This Actor turns it into a dataset. Pick one of nine FDA datasets, type search terms such as a drug, device, firm or ingredient, add a date range or an openFDA query, and get one row per record, newest first: drug, device and food recalls with their class, status, reason, firm and distribution; drug adverse-event reports (FAERS) with seriousness, patient age and sex, the drugs involved and each reaction's outcome; medical-device reports (MAUDE) with the devices, problems and event narrative; food, supplement and cosmetic adverse-event reports (CAERS); drug labels with the boxed warning, indications, dosage, contraindications, warnings, adverse reactions and interactions; Drugs@FDA applications with their products, approval date and every submission with its letters and labels; and 510(k) device clearances with their decision. Every row keeps the full FDA record too. No login and no proxy; an API key is optional. Built for pharmacovigilance and drug-safety teams, regulatory affairs and quality, medical-device and food-safety compliance, competitive intelligence on products and manufacturers, healthcare analysts, journalists and researchers.
β‘ Quick start
{"dataset": "drug/enforcement","searchTerms": ["metformin"],"maxItems": 5}
Or every serious Ozempic adverse-event report received in 2025:
{"dataset": "drug/event","searchTerms": ["ozempic"],"searchQuery": "serious:1","dateFrom": "2025-01-01","dateTo": "2025-12-31","maxItems": 1000}
π§© Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
dataset | string | no | "drug/enforcement" | The FDA dataset to search (see the table below). |
searchTerms | array | no | β | Words to look for, one search per line, such as metformin or insulin pump. Each is matched as a phrase in the dataset's main text (see the table below). |
searchQuery | string | no | β | Optional openFDA query syntax, combined with every search term, such as classification:"Class I" AND state:CA. Without search terms it runs as a search of its own. |
dateFrom | string | no | β | Only records on or after this date (YYYY-MM-DD), on the dataset's main date. |
dateTo | string | no | β | Only records on or before this date (YYYY-MM-DD), on the dataset's main date. |
maxItems | integer | no | β | Maximum number of records per search term, query or start URL, newest first. The input form starts at 5; leave it empty to get every match. |
startUrls | array | no | β | Public FDA pages to look up: a device recall, 510(k), MAUDE report or Drugs@FDA application on accessdata.fda.gov, or a DailyMed label or search page. Each record page returns that one record. |
apiKey | string | no | β | Optional free openFDA API key. Raises openFDA's daily limit from 1,000 to 120,000 requests. |
proxyConfiguration | object | no | { "useApifyProxy": false } | Proxy settings. openFDA needs no proxy. |
With no search terms, query or start URL, the Actor returns the newest records of the whole dataset, narrowed by the date range if you set one.
Datasets. Each search term is matched as a phrase in the fields listed here, and the date range applies to the date shown:
dataset | Records | Search terms match | Dates filter on |
|---|---|---|---|
drug/enforcement | Drug recalls (FDA enforcement reports) | Product description, reason for recall, recalling firm | Report date |
drug/event | Drug adverse-event reports (FAERS) | Drug name, brand and generic names, reaction terms | Date FDA received it |
drug/label | Drug labels (structured product labels) | Brand, generic and substance names, manufacturer, indications | Effective date |
drug/drugsfda | Drug approvals (Drugs@FDA applications) | Brand names, active ingredients, sponsor | Submission date |
device/event | Medical-device adverse-event reports (MAUDE) | Device brand and generic names, manufacturer | Date FDA received it |
device/recall | Medical-device recalls | Product description, reason for recall, firm, device name | Date posted |
device/510k | 510(k) premarket clearances | Device name, applicant | Decision date |
food/enforcement | Food recalls (FDA enforcement reports) | Product description, reason for recall, recalling firm | Report date |
food/event | Food, dietary supplement and cosmetic adverse events (CAERS) | Product name, industry, reaction terms | Date created |
openFDA queries. searchQuery takes openFDA's own syntax, field by field, so any field of a
record can be filtered, for example classification:"Class I" and status:Ongoing for recalls,
patient.patientsex:2 or occurcountry:US for drug reports, openfda.product_type:"HUMAN OTC DRUG"
for labels, or decision_code:SESE for 510(k)s. Join conditions with AND, OR and NOT.
π€ Output
Each FDA record is one dataset row. Every row has dataset, id, url, title, date and
raw; the other fields depend on the dataset, as listed below. Fields a record does not have are
null (or an empty list), and raw always holds the complete FDA record with every field.
Fields
| Field | Type | Description |
|---|---|---|
dataset | string | The dataset the record comes from, such as drug/enforcement. |
id | string | The record's FDA identifier: recall number, report ID, label set ID, application number or K number. |
url | string | The record's public FDA page (device recall, MAUDE report, DailyMed label, Drugs@FDA or 510(k) page), or the dataset's openFDA page when FDA has none per record. |
title | string | A short label: the product, drug or device and, for reports, what happened. |
date | string | The record's main date (the one dateFrom and dateTo filter on), YYYY-MM-DD. |
raw | object | The full openFDA record, unchanged. |
recallNumber | string | Recalls: FDA recall number, such as D-0657-2026. |
eventId | string | Recalls: the recall event the product belongs to. |
status | string | Recalls: Ongoing, Terminated, Completed, or a device recall's status. |
classification | string | Drug and food recalls: Class I, Class II or Class III. |
productType | string | Recalls: Drugs, Food, Devices. Labels: such as HUMAN PRESCRIPTION DRUG. |
productDescription | string | Recalls: the recalled product as FDA describes it. |
productCode | string | Device recalls and 510(k)s: FDA product code. |
productQuantity | string | Recalls: quantity recalled. |
codeInfo | string | Recalls: lots, serial numbers and expiry dates affected. |
reasonForRecall | string | Recalls: why the product was recalled. |
rootCause | string | Device recalls: the firm's root cause. |
action | string | Device recalls: what the firm told customers to do. |
recallingFirm | string | Recalls: the firm recalling the product. |
city | string | Recalls and 510(k)s: the firm's city. |
state | string | Recalls and 510(k)s: the firm's state. |
country | string | Recalls and 510(k)s: the firm's country. |
distributionPattern | string | Recalls: where the product was distributed. |
voluntaryMandated | string | Drug and food recalls: whether the recall was voluntary or FDA-mandated. |
recallInitiationDate | string | Recalls: when the recall started, YYYY-MM-DD. |
reportDate | string | Recalls: when FDA published it (device recalls: date posted), YYYY-MM-DD. |
terminationDate | string | Recalls: when the recall was closed, YYYY-MM-DD. |
brandNames | array | Brand names (labels, approvals, and recalls FDA has linked to a product). |
genericNames | array | Generic names (labels, approvals, and linked recalls). |
deviceName | string | Device recalls and 510(k)s: the device's name. |
deviceClass | string | Device recalls and 510(k)s: FDA device class, 1, 2 or 3. |
kNumbers | array | Device recalls: the 510(k) clearances of the recalled device. |
safetyReportId | string | Drug reports: the FAERS safety report ID. |
receiveDate | string | Reports and 510(k)s: when FDA received it, YYYY-MM-DD. |
serious | boolean | Drug reports: whether the report is serious. |
seriousOutcomes | array | Drug reports: Death, Life threatening, Hospitalization, Disability, Congenital anomaly, Other serious. |
reporterQualification | string | Drug reports: who reported it, such as Physician or Consumer or non-health professional. |
reporterCountry | string | Drug reports: the reporter's country code. |
occurCountry | string | Drug reports: where the event happened, as a country code. |
patientSex | string | Reports: the patient's sex. |
patientAge | number | Reports: the patient's age, in patientAgeUnit. |
patientAgeUnit | string | Reports: years, months, weeks, days, hours or decades. |
patientWeightKg | number | Drug reports: the patient's weight in kilograms. |
drugs | array | Drug reports: each drug with name, role (Suspect, Concomitant, Interacting), indication, activeSubstance, dosage, brandNames, genericNames, manufacturers. |
reactions | array | Drug and food reports: each reaction with its MedDRA term and, for drug reports, its outcome (such as Recovered/resolved or Fatal). |
eventDate | string | Food and device reports: when the event happened, YYYY-MM-DD. |
outcomes | array | Food and device reports: outcomes such as Hospitalization or Required Intervention. |
products | array | Food reports: each product with name, role, industryCode, industryName. Approvals: each product with productNumber, brandName, activeIngredients (name, strength), dosageForm, route, marketingStatus, referenceDrug, teCode. |
reportNumber | string | Device reports: the MDR report number. |
eventType | string | Device reports: Malfunction, Injury, Death or Other. |
reportSource | string | Device reports: who filed it, such as Manufacturer report. |
eventLocation | string | Device reports: where it happened, such as HOSPITAL. |
manufacturer | string | Device reports, labels and approvals: the manufacturer. |
productProblems | array | Device reports: device problems, such as Incorrect Measurement. |
devices | array | Device reports: each device with brandName, genericName, manufacturer, modelNumber, catalogNumber, lotNumber, productCode, deviceName, deviceClass, udi. |
eventDescription | string | Device reports: the description of the event or problem. |
manufacturerNarrative | string | Device reports: the manufacturer's narrative. |
version | string | Labels: the label version. |
effectiveDate | string | Labels: the label's effective date, YYYY-MM-DD. |
routes | array | Labels: routes of administration, such as ORAL. |
substanceNames | array | Labels: active substances. |
pharmacologicClasses | array | Labels: established pharmacologic classes, such as GLP-1 Receptor Agonist [EPC]. |
productNdcs | array | Labels: product NDC codes. |
applicationNumbers | array | Labels: the NDA, ANDA or BLA numbers the label belongs to. |
boxedWarning | string | Labels: the boxed ("black box") warning. |
indications | string | Labels: indications and usage. |
dosage | string | Labels: dosage and administration. |
contraindications | string | Labels: contraindications. |
warnings | string | Labels: warnings and precautions. |
adverseReactions | string | Labels: adverse reactions. |
drugInteractions | string | Labels: drug interactions. |
applicationNumber | string | Approvals: NDA, ANDA or BLA number, such as NDA209637. |
sponsorName | string | Approvals: the application's sponsor. |
approvalDate | string | Approvals: when the original application was approved, YYYY-MM-DD. |
latestSubmissionDate | string | Approvals: the latest submission's status date, YYYY-MM-DD. |
submissions | array | Approvals: submissions newest first, each with type, number, status, statusDate, classCode, classDescription, reviewPriority and documents (letters, labels, reviews with type, date, url). |
kNumber | string | 510(k)s: the K number, such as K253470. |
applicant | string | 510(k)s: the company that applied. |
contact | string | 510(k)s: the applicant's contact person. |
decisionDate | string | 510(k)s: decision date, YYYY-MM-DD. |
decisionCode | string | 510(k)s: decision code, such as SESE. |
decisionDescription | string | 510(k)s: the decision, such as Substantially Equivalent. |
clearanceType | string | 510(k)s: Traditional, Special or Abbreviated. |
advisoryCommittee | string | 510(k)s: the reviewing panel, such as Clinical Chemistry. |
regulationNumber | string | 510(k)s: the device regulation number, such as 880.5730. |
π‘ Use cases
- Pharmacovigilance and drug safety β pull every FAERS report on your products or a competitor's, with seriousness, reactions and outcomes, for signal detection.
- Recall monitoring β a daily feed of new Class I drug, device and food recalls, by product, firm or ingredient, for quality, supply-chain and retail compliance.
- Medical-device surveillance β track MAUDE malfunction and injury reports and device recalls for a product code or manufacturer.
- Regulatory and competitive intelligence β follow Drugs@FDA approvals, label changes, new boxed warnings and 510(k) clearances in a therapy area.
- Label analysis β compare indications, dosing, contraindications and warnings across every label of an ingredient.
- Research and journalism β build datasets on drug safety, recalls and approvals, and feed FDA text into search, RAG and LLM pipelines.
β FAQ
- Is this data reliable enough for medical decisions? No. openFDA states that its data must not be relied on to make decisions about medical care: treat every record as unvalidated. An adverse-event report does not prove that a product caused the event, and report counts cannot be used to estimate how often an event happens.
- Do I need an openFDA account or API key? No. Without a key, openFDA allows 1,000 requests a day per IP address; each request returns up to 1,000 recalls, approvals or 510(k)s, or 50 to 100 labels and reports. For larger runs, get a free key at open.fda.gov and enter it in
apiKeyto raise the limit to 120,000 a day. - Do I need a proxy? No. It runs without one by default.
- How are results ordered? Newest first, by the dataset's main date, so
maxItemskeeps the most recent records. - Why is
urlthe same for every recall or drug report? FDA publishes no public page per drug or food recall, FAERS report or CAERS report, so those rows link to the dataset's openFDA page. Device recalls, MAUDE reports, labels, approvals and 510(k)s link to their own FDA or DailyMed page. - Can I search one field only? Yes. Leave
searchTermsempty and write the condition insearchQuery, for examplerecalling_firm:"Pfizer"orpatient.drug.openfda.generic_name:"semaglutide". - Can I paste FDA recall announcements? No. FDA press releases do not map to a record. Search the recalled product or firm instead, or paste the record page of a device recall, 510(k), MAUDE report, Drugs@FDA application or DailyMed label.
- Why are brand and generic names empty on some recalls? FDA links only some recalls to a product listing. The product is always in
productDescription.
π More scrapers by Anyx
π€ Anyx Solutions
We build custom scrapers and data-extraction pipelines.
- Email: tantosthor@gmail.com
πΌ Image credit
Image credit: open.fda.gov