FDA Orange Book Scraper
Pricing
from $3.00 / 1,000 results
FDA Orange Book Scraper
Scrape FDA's Orange Book - Approved Drug Products with Therapeutic Equivalence Evaluations. Search by drug name, active ingredient, applicant, or application number; browse by approval date; look up patents and marketing exclusivities. Sourced from FDA's official monthly bulk data files.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape the FDA's Orange Book — "Approved Drug Products with Therapeutic Equivalence Evaluations" — the official register of every FDA-approved prescription and over-the-counter drug, along with the patents and marketing exclusivities that protect them. Search by drug name, active ingredient, applicant, or application number; browse approvals by date; or pull patent/exclusivity data directly. Sourced from FDA's official monthly bulk data files — no login, no API key, no cookies.
What this actor does
- Five modes:
search,byApplicationNumbers,byApprovalDateRange,patentExclusivityLookup,findEquivalents - Search axes: drug/brand name, active ingredient, applicant (manufacturer), application number, dosage form, route of administration, strength — each independently filterable and combinable
- Filters: application type (NDA/ANDA), drug type (Rx/OTC/Discontinued), therapeutic equivalence (TE) code, Reference Listed Drug / Reference Standard flags, has-patents / has-exclusivity, approval date range
- Sorting: approval date (newest/oldest), ingredient/applicant/trade name (A-Z), patent/exclusivity expiration date (soonest/latest)
- Generic/brand equivalence lookup:
findEquivalentsfinds every product sharing the same ingredient + dosage form + route + strength as a reference application number — the same logic pharmacists use to identify substitutable generics - Patents & exclusivities: nested on every product record, or pulled standalone via
patentExclusivityLookup(filterable by patent number, exclusivity code, expiration date) - Empty fields are omitted — every field in the output is real FDA data
Data source
FDA publishes the entire Orange Book every month as a single bulk download (tilde-delimited products.txt, patent.txt, exclusivity.txt) from the Orange Book Data Files page. The actor downloads and parses this file directly — this is the same underlying data that powers the legacy accessdata.fda.gov search UI, but far more reliable to consume programmatically (no session-bound form posts, no CAPTCHA, no rate limiting).
Output per record
Products (recordType: "orangeBookProduct"):
applicationNumber(e.g.NDA020610,ANDA018613),applicationType,applicationTypeFull,productNumberingredient,dosageForm,route,tradeName,applicant,applicantFullName,strengthteCodes[],teCodeDescription— therapeutic equivalence ratingapprovalDate(ISO),approvalDateRaw(original FDA text, including legacy "Approved Prior to Jan 1, 1982")referenceListedDrug,referenceStandard(booleans)drugType(RX/OTC/DISCN),drugTypeFullpatents[]— nested:patentNumber,expirationDate,drugSubstancePatent,drugProductPatent,patentUseCode,delisted,submissionDate,hasPediatricExtension,isReissuePatentexclusivities[]— nested:exclusivityCode,description,expirationDatepatentCount,exclusivityCountsourceUrl— direct link to the product's FDA Orange Book pagerecordType,scrapedAt
Patents / exclusivities (patentExclusivityLookup mode; recordType: "orangeBookPatent" / "orangeBookExclusivity"):
- Same patent/exclusivity fields as above, flattened, plus
applicationNumber,productNumber,ingredient,tradeName,applicant(joined from the product),sourceUrl
Generic/brand equivalents (findEquivalents mode; recordType: "orangeBookProduct"):
- Same product fields as above, plus
isReferenceProduct(truefor the application number you searched,falsefor its equivalents)
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | select | search | search / byApplicationNumbers / byApprovalDateRange / patentExclusivityLookup / findEquivalents |
searchQuery | string | ibuprofen | Free-text match across ingredient, trade name, applicant, application number (mode=search) |
activeIngredient | string | – | Substring match on active ingredient |
tradeName | string | – | Substring match on brand/trade name |
applicantName | string | – | Substring match on applicant |
applicationNumberQuery | string | – | Substring/suffix match on application number |
applicationNumbers | array | ["NDA020699"] | Exact application numbers (mode=byApplicationNumbers); exactly one reference number (mode=findEquivalents) |
applicationType | select | Any | NDA / ANDA |
drugType | select | Any | RX / OTC / DISCN |
teCode | select | Any | Therapeutic equivalence code (AB, AB1-4, AA, AN, AO, AP, AP1-3, AT, AT1-3, BC, BD, BP, BS, BX) |
dosageFormQuery | string | – | Substring match on dosage form (e.g. TABLET) |
routeQuery | string | – | Substring match on route of administration (e.g. ORAL) |
strengthQuery | string | – | Substring match on labeled strength (e.g. 200MG) |
referenceListedDrugOnly | boolean | false | Only RLD products |
referenceStandardOnly | boolean | false | Only Reference Standard products |
hasPatentsOnly | boolean | false | Only products with at least one listed patent |
hasExclusivityOnly | boolean | false | Only products with at least one active exclusivity |
excludeReferenceProduct | boolean | false | mode=findEquivalents: omit the reference product itself from results |
sortBy | select | default | approvalDateDesc / approvalDateAsc / ingredientAsc / applicantAsc / tradeNameAsc / expirationDateAsc / expirationDateDesc |
approvalDateFrom / approvalDateTo | string | – | ISO YYYY-MM-DD; required (either) for mode=byApprovalDateRange |
recordKind | select | both | patents / exclusivities / both (mode=patentExclusivityLookup) |
patentNumberQuery | string | – | Substring match on US patent number |
exclusivityCodeQuery | string | – | Substring match on exclusivity code |
includeDelisted | boolean | true | Include patents FDA flagged as delisted |
expirationDateFrom / expirationDateTo | string | – | ISO YYYY-MM-DD patent/exclusivity expiration range |
maxItems | integer | 100 | Hard cap (1–5000) |
proxyConfiguration | proxy | {useApifyProxy: true} | Optional fallback if FDA ever blocks the direct connection |
Example: search by ingredient + drug type
{"mode": "search","activeIngredient": "metformin","drugType": "RX","applicationType": "ANDA","maxItems": 50}
Example: lookup by application number
{"mode": "byApplicationNumbers","applicationNumbers": ["NDA020610", "ANDA018613"]}
Example: browse recent approvals
{"mode": "byApprovalDateRange","approvalDateFrom": "2024-01-01","approvalDateTo": "2024-12-31","maxItems": 100}
Example: patents expiring soon for a given application
{"mode": "patentExclusivityLookup","applicationNumbers": ["NDA214070"],"recordKind": "patents","sortBy": "expirationDateAsc"}
Example: find generic equivalents of a brand-name drug
{"mode": "findEquivalents","applicationNumbers": ["NDA020402"],"excludeReferenceProduct": true}
Use cases
- Generics/pharma competitive intelligence — track patent and exclusivity expiration dates ahead of generic entry
- Regulatory research — verify therapeutic equivalence ratings before substitution
- Legal/IP due diligence — enumerate every patent covering a given NDA
- Market access — identify Rx-to-OTC switches and new approvals by date
- Academic/health-policy research — bulk export of approved-drug metadata
FAQ
What's the Orange Book? FDA's official list of approved drug products with their therapeutic equivalence evaluations, patents, and exclusivities — the reference generics manufacturers use to identify bioequivalent substitutes and patent challenges.
How fresh is the data? FDA republishes the bulk data files monthly (typically the second week of each month, covering the prior month's changes). The actor always fetches the latest file at run time.
Why not scrape accessdata.fda.gov directly? That legacy ColdFusion search UI is session-bound and only supports one query at a time; the monthly bulk file contains the complete dataset and is far more reliable to consume at scale.
What does teCodeDescription mean? A-prefixed codes (AB, AA, AT, ...) indicate FDA considers the product therapeutically equivalent to the reference; B-prefixed codes (BX, BC, ...) indicate it is not (yet) rated equivalent.
What if my application number isn't found? byApplicationNumbers reports which numbers matched and which didn't via the run's status message — double check the type prefix (NDA vs ANDA) or try the bare digits.
Are discontinued drugs included? Yes — drugType: "DISCN" marks products FDA has moved to the discontinued section; filter with drugType to include/exclude them.
How does findEquivalents decide what's a match? It matches on identical ingredient + dosage form + route of administration + strength (FDA's own basis for bioequivalence grouping). It does not require the same TE code, so review teCodes/teCodeDescription on each result before treating a match as an approved substitute.
Why are dosageFormQuery / routeQuery free-text instead of dropdowns? FDA's Orange Book stores dosage form and route as combined, often multi-value strings (e.g. TABLET, EXTENDED RELEASE or INTRAMUSCULAR, INTRAVENOUS, SUBCUTANEOUS) — there are 117+ distinct dosage-form strings and 79+ route strings, most of which are combinations. A substring match lets you match the atomic term (ORAL) regardless of which combination it appears in.