FDA Drug Approvals Scraper — Drugs@FDA Approval History avatar

FDA Drug Approvals Scraper — Drugs@FDA Approval History

Pricing

from $1.60 / 1,000 fda approval actions

Go to Apify Store
FDA Drug Approvals Scraper — Drugs@FDA Approval History

FDA Drug Approvals Scraper — Drugs@FDA Approval History

Export FDA drug approvals from Drugs@FDA by drug, sponsor, NDA/ANDA/BLA number or date, with review priority and label links. USD 2 per 1,000.

Pricing

from $1.60 / 1,000 fda approval actions

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

FDA Drug Approvals Scraper exports FDA drug approvals from the official Drugs@FDA dataset as one clean record per approval action, with application number, sponsor, approval date, review priority, submission class, products, strengths and links to the approval letter, label and review documents. It is built for regulatory, pharma competitive-intelligence and research teams, and it costs USD 2.00 per 1,000 approval records on the FREE tier (USD 1.60 per 1,000 on GOLD).

The data comes from the FDA's own public openFDA Drugs@FDA endpoint, which the FDA refreshes on business days. Each run records the source's sourceLastUpdated date (2026-10-23 on the most recent check).

What data does the FDA drug approvals scraper return?

Each dataset row is one approved submission: the original approval or one approved supplement. Optional FDA fields come back as null or empty arrays, never invented.

FieldWhat it contains
approvalIdStable ID: application, submission type, number and date
applicationNumber, applicationTypeFor example NDA213051, and NDA, ANDA or BLA
sponsorNameApplication sponsor as FDA lists it, for example NOVO
submissionType, submissionNumberORIG (original) or SUPPL (supplement) and its number
approvalStatus, approvalStatusLabel, approvalDateAP Approved or TA Tentatively approved, and the status date
reviewPrioritySTANDARD or PRIORITY when FDA supplies it
submissionClassCode, submissionClassDescriptionFor example TYPE 1 / "Type 1 - New Molecular Entity"
productsBrand, active ingredients with strength, dosage form, route, marketing status, reference-drug flags, TE code
brandNames, genericNames, substanceNamesHarmonized names
manufacturerNames, productNdcs, routes, rxcuisHarmonized identifiers (often empty for older or discontinued products)
applicationDocumentsLabel, approval letter and review links with type and date
applicationUrl, apiUrlDrugs@FDA application page and the matching API query
sourceLastUpdated, fetchedAtSource refresh date and retrieval time

A SUMMARY record in the key-value store lists delivered records, matched applications, requests, warnings and whether a charge limit stopped the run.

How do I search FDA drug approvals by drug, sponsor or application number?

Type a brand, ingredient, sponsor or application number into Drug search query, or use the dedicated filters. The default input searches Ozempic and returns its original approvals in about 3 seconds.

{
"query": "semaglutide",
"approvalType": "original",
"sortBy": "newest",
"maxResults": 25
}

For exact applications with their full supplement history, clear query and list the numbers (NDA, ANDA or BLA plus digits, not NDC codes):

{
"query": "",
"applicationNumbers": ["NDA209637", "NDA213051"],
"approvalType": "all",
"maxResults": 250
}

brandName, activeIngredient and sponsorName match one field each, applicationType limits to NDA, ANDA or BLA, and includeTentativeApprovals adds TA records. At least one criterion is required. Text filters must be plain ASCII (for example Ozempic, not accented spellings).

How do I get a list of new FDA drug approvals?

Clear the query and set a date window. This returns original approvals in that window, newest first:

{
"query": "",
"approvalDateFrom": "2026-01-01",
"approvalDateTo": "2026-10-26",
"approvalType": "original",
"applicationType": "NDA",
"sortBy": "newest",
"maxResults": 500
}

The FDA's "novel drug approvals" list is not a separate filter. Novel drugs are the rows whose submissionClassCode is TYPE 1 (new molecular entity) in NDA results, and new biologics appear as BLA rows when Drugs@FDA covers them. For a complete list in a window, set maxResults above the count you expect so the run does not stop early.

When should I use this Actor, and when not?

Use it when you need approval history as data: tracking competitors' approvals and supplements, building a drug or sponsor approval timeline, pulling approval letters and labels for a set of applications, or feeding FDA approvals into a spreadsheet, database or AI agent.

Use something else when:

  • You need drug monographs, side effects or dosing text: RxList Drug Information Scraper.
  • You need retail drug prices: PharmacyChecker Scraper.
  • You need company filings such as 8-Ks announcing approvals: SEC EDGAR Scraper.
  • You need adverse events, recalls, patents and exclusivity, full label text, or a complete list of vaccines, blood products and cell or gene therapies. Those are outside Drugs@FDA coverage and this Actor.

This data is regulatory information, not medical advice.

Use it from an AI assistant

FDA Drug Approvals Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add it with https://mcp.apify.com/?tools=muhammadafzal/fda-drug-approvals-scraper, then ask, for example: "List every original NDA approval since January 2026 with priority review and give me the approval letter links."

Run it with the API

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/fda-drug-approvals-scraper').call({
query: 'Keytruda',
approvalType: 'all',
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]?.approvalDate, items[0]?.submissionType);

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("muhammadafzal/fda-drug-approvals-scraper").call(
run_input={"query": "", "approvalDateFrom": "2026-01-01", "approvalType": "original", "maxResults": 200}
)
for a in client.dataset(run.default_dataset_id).iterate_items():
print(a["approvalDate"], a["applicationNumber"], a["sponsorName"], a["brandNames"])

What does the output look like?

Two records from the default Ozempic run on 2026-10-26 (products and identifier lists shortened):

[
{
"approvalId": "NDA213051:ORIG:1:2019-09-20",
"applicationNumber": "NDA213051",
"applicationType": "NDA",
"sponsorName": "NOVO",
"submissionType": "ORIG",
"submissionNumber": "1",
"approvalStatus": "AP",
"approvalStatusLabel": "Approved",
"approvalDate": "2019-09-20",
"reviewPriority": "PRIORITY",
"submissionClassCode": "TYPE 3",
"submissionClassDescription": "Type 3 - New Dosage Form",
"products": [
{
"productNumber": "001",
"brandName": "RYBELSUS",
"activeIngredients": [{ "name": "SEMAGLUTIDE", "strength": "3MG" }],
"dosageForm": "TABLET",
"route": "ORAL",
"marketingStatus": "Prescription",
"referenceDrug": "Yes",
"referenceStandard": "Yes",
"therapeuticEquivalenceCode": null
}
],
"brandNames": ["OZEMPIC", "RYBELSUS"],
"genericNames": ["ORAL SEMAGLUTIDE"],
"manufacturerNames": ["Novo Nordisk Pharmaceutical Industries, LP"],
"productNdcs": ["0169-1704", "0169-4303"],
"applicationDocuments": [
{ "id": "60094", "title": null, "type": "Letter", "date": "2019-09-24", "url": "https://www.accessdata.fda.gov/drugsatfda_docs/appletter/2019/213051Orig1s000ltr.pdf" }
],
"applicationUrl": "https://www.accessdata.fda.gov/scripts/cder/daf/index.cfm?event=overview.process&ApplNo=213051",
"sourceLastUpdated": "2026-10-23",
"fetchedAt": "2026-10-26T06:51:50.130Z"
},
{
"approvalId": "NDA209637:ORIG:1:2017-12-05",
"applicationNumber": "NDA209637",
"applicationType": "NDA",
"sponsorName": "NOVO",
"submissionType": "ORIG",
"approvalStatus": "AP",
"approvalDate": "2017-12-05",
"reviewPriority": "STANDARD",
"submissionClassCode": "TYPE 1",
"submissionClassDescription": "Type 1 - New Molecular Entity",
"brandNames": ["OZEMPIC"],
"genericNames": [],
"productNdcs": [],
"applicationDocuments": [
{ "id": "50622", "title": null, "type": "Label", "date": "2017-12-06", "url": "https://www.accessdata.fda.gov/drugsatfda_docs/label/2017/209637lbl.pdf" }
],
"sourceLastUpdated": "2026-10-23",
"fetchedAt": "2026-10-26T06:51:50.129Z"
}
]

Pricing: how much does FDA approval data cost?

FDA Drug Approvals Scraper uses pay-per-event pricing. Platform usage is included in the event prices.

EventFREEBRONZESILVERGOLDPLATINUM / DIAMOND
FDA approval action (one dataset row)USD 0.002001USD 0.00195USD 0.0019USD 0.0016USD 0.0016
Actor start (per started GB of allocated memory)USD 0.006251USD 0.006094USD 0.005938USD 0.005USD 0.005

Worked totals on the FREE tier at the default 256 MB memory (one start event):

  • Default run, 2 Ozempic approval records: 2 × USD 0.002001 + USD 0.006251 = USD 0.0103
  • 1,000 approval records: 1,000 × USD 0.002001 + USD 0.006251 = USD 2.0073

A search with no matches charges only the start fee. Set a maximum cost per run in Apify Console to cap spending; the run stops before a record that would exceed it.

What are the limits?

  • Up to 5,000 records per run (maxResults, default 25).
  • Deep paging stops at 25,000 source applications. The FDA endpoint returns at most 99 applications per request; the Actor pages automatically and adds a warning when it reaches the limit. Narrow the filters for larger studies.
  • Local re-filtering. The FDA returns whole applications; the Actor keeps only the submissions that match your type, status and dates.
  • Optional API key. The default run works without one. A free openFDA key raises the FDA's request limits for frequent or large runs.
  • Retries. HTTP 429, 5xx and timeouts are retried up to maxRequestRetries times (default 2) with backoff.
  • The run's status message and the SUMMARY cost estimate use the live record price for your pricing tier.

FAQ

Is this official FDA data?

Yes. Every record comes from the FDA's public Drugs@FDA data through the openFDA endpoint, and each row links back to the Drugs@FDA application page.

How current are the approvals?

The FDA refreshes the source on business days. Each record carries sourceLastUpdated; on 2026-10-26 it was 2026-10-23.

Does one row equal one drug?

No. One row is one approval action. An application with ten approved supplements produces eleven rows when approvalType is all, so dates and documents stay attached to the action they describe.

Can I get approval letters and labels?

Yes, when the FDA has published them. applicationDocuments lists each document's type (Label, Letter, Review and others), date and PDF or HTML link.

Does it cover biologics and generics?

It covers NDA, ANDA (generics) and the BLA applications present in Drugs@FDA. Many CBER-regulated biologics, such as vaccines and blood products, are not in this dataset.

Do I need an openFDA API key?

No. The Actor runs without one. Add your own key in apiKey only if you run it often or at large volume.

Public data from the same developer:

This Actor reads public U.S. government data and does not log in or bypass access controls. It is independent of and not endorsed by the FDA. Keep source links when you redistribute records, follow the openFDA terms, and do not use the data alone for medical decisions; verify material conclusions against the linked FDA documents.

Last verified: 2026-10-27