openFDA Drug Labels & Ingredients Scraper avatar

openFDA Drug Labels & Ingredients Scraper

Pricing

from $6.15 / 1,000 results

Go to Apify Store
openFDA Drug Labels & Ingredients Scraper

openFDA Drug Labels & Ingredients Scraper

Extract structured drug labeling for US medicines: brand and generic name, manufacturer, product type (OTC or prescription), route, active ingredients and strengths, NDC and application numbers, plus label sections like indications, dosage, warnings and interactions. Export to JSON, CSV or Excel.

Pricing

from $6.15 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

20 hours ago

Last modified

Share

openFDA Drug Labels & Ingredients Scraper

openFDA Drug Labels & Ingredients Scraper

Here is one real result, with every field the actor returns. Long labeling sections are trimmed with a [trimmed] marker for readability; every value shown is real:

{
"setId": "00653b7c-7099-487e-9a01-e89781c21323",
"splId": "4bd1345d-d116-426e-825f-bbf29381746a",
"brandName": ["Ibuprofen Dye Free"],
"genericName": ["IBUPROFEN"],
"manufacturerName": ["CVS Pharmacy"],
"productType": "HUMAN OTC DRUG",
"route": ["ORAL"],
"substanceName": ["IBUPROFEN"],
"activeIngredient": "Active ingredient (in each white tablet) Ibuprofen USP, 200 mg (NSAID)* *nonsteroidal anti-inflammatory drug",
"inactiveIngredient": "Inactive ingredients colloidal silicon dioxide, corn starch, hypromellose, lactose anhydrous, magnesium stearate, microcrystalline cellulose, polydextrose, polyethylene glycol, povidone, sodium starch glycolate, stearic acid, triacetin",
"pharmClass": ["Nonsteroidal Anti-inflammatory Drug [EPC]", "Cyclooxygenase Inhibitors [MoA]", "Anti-Inflammatory Agents, Non-Steroidal [CS]"],
"productNdc": ["59779-438"],
"packageNdc": ["59779-438-12", "59779-438-15", "59779-438-13"],
"applicationNumber": ["ANDA075139"],
"rxcui": ["310965"],
"unii": ["WK2XYI10QM"],
"purpose": "Purpose Pain reliever/fever reducer",
"indicationsAndUsage": "Uses temporarily relieves minor aches and pains due to: headache toothache backache menstrual cramps the common cold muscular aches minor pain of arthritis temporarily reduces fever",
"dosageAndAdministration": "Directions do not take more than directed the smallest effective dose should be used adults and children 12 years and over: take 1 tablet every 4 to 6 hours while symptoms persist [trimmed]",
"dosageFormsAndStrengths": null,
"warnings": "Warnings Allergy alert: Ibuprofen may cause a severe allergic reaction, especially in people allergic to aspirin. [trimmed]",
"boxedWarning": null,
"warningsAndCautions": null,
"contraindications": null,
"adverseReactions": null,
"drugInteractions": null,
"overdosage": null,
"useInSpecificPopulations": null,
"pregnancy": null,
"pediatricUse": null,
"geriatricUse": null,
"mechanismOfAction": null,
"clinicalPharmacology": null,
"clinicalStudies": null,
"description": null,
"howSupplied": null,
"storageAndHandling": "Other information store between 20°-25°C (68°-77°F) avoid excessive heat 40°C (104°F) see end flap for expiration date and lot number",
"doNotUse": "Do not use if you have ever had an allergic reaction to any other pain reliever/fever reducer right before or after heart surgery",
"whenUsing": "When using this product take with food or milk if stomach upset occurs",
"stopUse": "Stop use and ask a doctor if you experience any of the following signs of stomach bleeding: feel faint have bloody or black stools vomit blood [trimmed]",
"keepOutOfReachOfChildren": "Keep out of reach of children. In case of overdose, get medical help or contact a Poison Control Center right away.",
"splSetId": ["00653b7c-7099-487e-9a01-e89781c21323"],
"upc": null,
"version": "17",
"labelUrl": "https://dailymed.nlm.nih.gov/dailymed/drugInfo.cfm?setid=00653b7c-7099-487e-9a01-e89781c21323",
"effectiveTime": "2026-04-29",
"observedAt": "2026-08-10T14:39:37.427Z",
"error": null
}

The most complete openFDA drug label scraper available. It returns every field the FDA Structured Product Labeling (SPL) dataset exposes for each drug, including active and inactive ingredients, all 30-plus labeling sections (indications, warnings, boxed warning, dosage, adverse reactions, drug interactions, clinical pharmacology and more), the full NDC and identifier set, and gives you a keyword search plus product type, route and manufacturer filters to target exactly the labels you need.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor queries the openFDA drug labeling (SPL) dataset, applies the filters you pass as input, paginates through the matching labels, and writes one normalized record per label to the run's dataset. A plain keyword is matched across brand name, generic name, active substance and manufacturer at once. Each multi-paragraph labeling section is joined into one clean text field, the four openFDA pharmacologic class facets are merged into a single deduped pharmClass list, empty source values are returned as null, and a ready-to-open DailyMed labelUrl is built from the SPL set ID.

Data covers US FDA drug product labels only. For adverse events and recalls see the openFDA Drug Adverse Events & Recalls Scraper.

Quickstart

Open the actor, paste this into the input, and press Run. It returns 10 ibuprofen labels.

{
"maxLabels": 10,
"query": "ibuprofen"
}

Leave query empty to pull the most recent labels with no keyword filter. Combine query with productType, route or manufacturer to narrow the set. Every input field is optional.

Input reference

FieldTypeRequiredDefaultDescription
maxLabelsintegerno10Maximum labels to collect. openFDA paginates with a skip offset up to 25000 per query; for larger pulls, narrow the search or add a filter.
querystringno(empty)A drug brand name, generic name, active ingredient or manufacturer, matched across all of them (for example ibuprofen, atorvastatin, Pfizer). OR a raw openFDA field expression such as openfda.manufacturer_name:Pfizer or openfda.route:OPHTHALMIC. A value containing field: is treated as a raw expression. Empty pulls the most recent labels.
productTypeenumno(any)Restrict to HUMAN OTC DRUG, HUMAN PRESCRIPTION DRUG, or CELLULAR THERAPY. Empty includes every product type.
routestringno(empty)Restrict to a route of administration, for example ORAL, TOPICAL, INTRAVENOUS, OPHTHALMIC, NASAL. Empty for all routes.
manufacturerstringno(empty)Restrict to labels from a specific manufacturer or labeler, for example Pfizer, Johnson & Johnson. Empty for all manufacturers.
proxyConfigurationobjectno(none)Standard Apify proxy configuration. Not required; the openFDA API is not bot protected.

Filters combine with logical AND.

Output reference

One dataset item per drug label. Array-valued openFDA identity fields (like brandName, route, productNdc) are returned as string arrays. Labeling section fields are single joined strings. null is returned when the source value is absent (most prescription-only sections are absent on OTC labels and vice versa).

FieldTypeDescription
setIdstringSPL set ID (stable identifier for the label across versions).
splIdstringSPL document ID for this specific version.
brandNamestring[]Brand / trade name(s).
genericNamestring[]Generic name(s).
manufacturerNamestring[]Manufacturer or labeler name(s).
productTypestringHUMAN OTC DRUG, HUMAN PRESCRIPTION DRUG, or CELLULAR THERAPY.
routestring[]Route(s) of administration.
substanceNamestring[]Active substance name(s).
activeIngredientstringActive ingredient section text.
inactiveIngredientstringInactive ingredient section text.
pharmClassstring[]Merged, deduped pharmacologic class list (EPC, MoA, CS, PE facets).
productNdcstring[]Product-level NDC code(s).
packageNdcstring[]Package-level NDC code(s).
applicationNumberstring[]FDA application number(s) (NDA / ANDA / BLA).
rxcuistring[]RxNorm concept unique identifier(s).
uniistring[]UNII substance identifier(s).
purposestringPurpose section (OTC).
indicationsAndUsagestringIndications and usage section.
dosageAndAdministrationstringDosage and administration / directions section.
dosageFormsAndStrengthsstringDosage forms and strengths section.
warningsstringWarnings section.
boxedWarningstringBoxed (black box) warning, or null.
warningsAndCautionsstringWarnings and cautions section (prescription).
contraindicationsstringContraindications section.
adverseReactionsstringAdverse reactions section.
drugInteractionsstringDrug interactions section.
overdosagestringOverdosage section.
useInSpecificPopulationsstringUse in specific populations section.
pregnancystringPregnancy subsection.
pediatricUsestringPediatric use subsection.
geriatricUsestringGeriatric use subsection.
mechanismOfActionstringMechanism of action section.
clinicalPharmacologystringClinical pharmacology section.
clinicalStudiesstringClinical studies section.
descriptionstringProduct description section.
howSuppliedstringHow supplied / storage section.
storageAndHandlingstringStorage and handling section.
doNotUsestringDo not use section (OTC).
whenUsingstringWhen using this product section (OTC).
stopUsestringStop use and ask a doctor section (OTC).
keepOutOfReachOfChildrenstringKeep out of reach of children section (OTC).
splSetIdstring[]openFDA SPL set ID.
upcstringUPC barcode(s), or null.
versionstringSPL document version number.
labelUrlstringReady-to-open DailyMed URL for the full label.
effectiveTimestringLabel effective date (YYYY-MM-DD).
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringnull on success. On a failed run, a single item with a populated error field is written instead.

Example output record

See the hero record at the top of this page. It is a real ibuprofen OTC label pulled from a live run (input {"query":"ibuprofen","maxLabels":10}), with long labeling sections trimmed and marked [trimmed]; every value shown is real and unedited otherwise.

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openfda-drug-labels-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"query":"atorvastatin","productType":"HUMAN PRESCRIPTION DRUG","maxLabels":25}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openfda-drug-labels-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"manufacturer":"Pfizer","route":"OPHTHALMIC","maxLabels":100}'

Apify CLI:

apify call scrapers_lat/openfda-drug-labels-scraper \
--input '{"query":"ibuprofen","maxLabels":10}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per label returned (result event). See the pricing tab for the current per-result price.
  • No charge on failure. If a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 labels per run. Upgrade for higher maxLabels.
  • Source pagination ceiling. openFDA allows a skip offset up to 25000 per query. For pulls beyond that, split the work with narrower filters.

FAQ and troubleshooting

A run returned 0 records. Why? The search combination matched nothing in the source. Loosen the keyword or remove a filter (for example drop route or productType). Zero-result runs are not charged.

Why are so many section fields null? OTC labels and prescription labels use different SPL sections. An OTC drug has purpose, doNotUse and stopUse, while a prescription drug has warningsAndCautions, clinicalStudies and adverseReactions. Absent sections are returned as null, never invented.

How does the keyword search work? A plain word is matched across brand name, generic name, active substance and manufacturer at the same time. A value containing field: (for example openfda.route:OPHTHALMIC) is passed through as a raw openFDA expression.

How do I open the full label? Use the labelUrl field. It points to the DailyMed page for the SPL set ID.

Is this an official FDA tool? No. This actor is independent and has no affiliation with the FDA or openFDA. It reads only data that is publicly available through the openFDA API. Use it in accordance with the openFDA terms of service.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with the FDA or openFDA. Accesses only publicly available openFDA data. Use in accordance with the openFDA terms of service.