On this page

Methodology

Every number on this site is the output of a deterministic transformation of a public archive. This page documents those transformations, including the parts where the data is imperfect and the joins are approximate.

The pipeline

  1. Fetch. Each source is downloaded, resumable, verified against the size the server advertised, and hashed with SHA-256. The hash, resolved URL, byte count and dataset version are written to a provenance ledger.
  2. Extract. Archives are streamed rather than loaded whole — the labelling corpus alone is 1.7 GB across fourteen partitions. Structured Product Labeling markup is flattened to plain text; no HTML from an external source reaches a rendered page.
  3. Resolve. Drug entities are formed by grouping NDC product records on a normalised brand-or-generic name plus dosage form. Names are Unicode NFKC-normalised and whitespace-collapsed; salt and hydrate suffixes are recognised separately from the base moiety.
  4. Join. Applications, therapeutic equivalence, patents, exclusivity, biologics and labelling are attached using the identifiers documented below.
  5. Score. Each entity is given a data-completeness score from the evidence actually present, which drives which entities receive a prerendered detail page.

What counts as a medication

The FDA's NDC Directory contains 392,074 package records. A package is a specific bottle, blister or syringe — far too fine a grain for a reference site. OpenRx collapses them into 47,843 medication entities by grouping on the normalised brand-or-generic name together with the dosage form.

This means Tylenol Extra Strength 500 mg tablet and the same product marketed by a repackager collapse into one entity, while the same brand in a liquid form stays distinct. The grouping key is deliberately conservative: it never merges across dosage forms, because a tablet and an injection are not interchangeable in any practical sense.

Page coverage and the asset budget

Cloudflare Workers Static Assets allows a fixed number of files per deployment — 20,000 on the free plan, 100,000 on paid — and the search index consumes part of that. A site covering 47,843 medications plus 7,734 ingredients, biologics, veterinary products and browse views does not fit inside the free tier if every medication gets its own page.

The build therefore ranks entities by evidence and prerenders detail pages for the top set that the budget allows — currently 4,790 of them, prioritising medications with a real FDA application and a meaningful package footprint. Nothing is omitted from the site. Every remaining record is listed in full on the complete A–Z index with its generic name, dosage form, package count and regulatory classification, and every one is findable through search.

Raising the budget (--budget 100000, paired with a Workers Paid plan) generates a detail page for all 47,843 entities with no other change.

How sources are joined

Join keys by source pair.
From To Key Reliability
NDC DirectoryDrugs@FDA application_number (zero-padded to 6) Exact
NDC DirectoryOrange Book appl_no + product_no Exact where the ANDA/NDA number is present
Orange Book flat filesOrange Book JSON appl_no + product_no Both editions ingested and retained separately for audit
Drugs@FDAReview documents appl_no + submission_type + submission_no Exact
Purple BookDrug entity normalised proprietary / proper name Approximate — brand naming differs between sources
openFDA labellingDrug entity spl_set_id Exact via the NDC Directory's set identifier
RecallsDrug entity product_ndc Exact where the recall names an NDC
VeDDRA eventsAnimal drug normalised brand name Approximate — see below

Therapeutic equivalence codes

The Orange Book assigns a two-letter code to each generic product relative to its reference listed drug. A product is therapeutically equivalent only if it is pharmaceutically equivalent — identical amounts of the same active ingredient in the same dosage form and route — and bioequivalent, meaning an equivalent rate and extent of systemic absorption.

“A” ratings mean the FDA considers the product therapeutically equivalent. AB is the common case: bioequivalence demonstrated by comparative testing. Variants distinguish dosage forms where equivalence rests on dissolution or physical testing rather than pharmacokinetics — AA conventional forms, AN aerosols, AO injectable oil solutions, AP parenteral aqueous solutions, AT topical dermatologicals.

“B” ratings mean bioequivalence has not been established — unresolved delivery variation or a pharmacokinetic profile that precludes automatic substitution. BC controlled-release, BD documented bioequivalence problems, BE enteric-coated, BN narrow therapeutic index, BP potential problems, BR extended-release, BS drug-standard issues, BT topical products, BX insufficient data.

RLD marks the Reference Listed Drug against which others are measured; RS marks the Reference Standard, the specific product an applicant must use in its bioequivalence study. A product can be one, both or neither.

Adverse event report counts

The figure shown on a medication page is the total number of U.S. adverse event reports naming that drug's active ingredients in the FDA Adverse Event Reporting System. It is obtained by querying the openFDA API per ingredient and summing contributions across a multi-ingredient product.

This number must not be read as a risk measure. FAERS is a spontaneous reporting system. Reports are submitted voluntarily by clinicians, patients and manufacturers, and they are accepted without establishing that the drug caused the event — FDA's own guidance states that reports “do not prove that the drug caused the event”. Counts are driven by how many people take a drug, how long it has been marketed, how the manufacturer promotes it, and how much attention the drug receives. Comparing raw totals across drugs compares exposure and reporting behaviour, not hazard. A valid comparison requires denominators (patient-years of exposure) and a disproportionality analysis such as a Proportional Reporting Ratio — neither of which OpenRx performs.

Report counts are drawn from the FDA Adverse Event Reporting System and are dated to the openFDA release they came from.

How the figure is attributed. The API answers per active ingredient, so the number shown for a product is the count belonging to its single most-reported active ingredient, and the page names that ingredient. Two things are deliberately avoided: a sum across ingredients, which would add unrelated products' reports together for a multi-ingredient medicine, and attribution for combination products with more than six active ingredients, where the ingredient list is long enough that any total measures the list rather than the medicine. Products with no attribution simply omit the section.

Veterinary data

Veterinary safety data is not patient-shaped. A single report may describe one dog or a commercial broiler house, so records carry counts of animals treated and animals affected rather than an individual. They also carry report categories with no human analogue: lack of expected efficacy, which is the earliest public signal of anthelmintic or antimicrobial resistance, and human operator exposure from needle-sticks and splash incidents during administration.

Adverse events are coded in the VICH VeDDRA hierarchy rather than the human MedDRA hierarchy. The two vocabularies do not map onto each other cleanly, which is why the veterinary and human sides of this site do not share a safety section.

Attribution between a Green Book proprietary name and a VeDDRA brand name is approximate. Where the names agree exactly the aggregates are exact; where they do not, attribution is by normalised prefix and is labelled as approximate on the page. Treat the veterinary report counts as indicative, not authoritative.

Known limitations

  • United States only. The EMA Union Product Database, the UK VMD Product Information Database and Health Canada's Drug Product Database are documented in the source report but not ingested. Nothing here reflects authorisation outside the U.S.
  • Pricing is absent. None of the ingested datasets carries price, reimbursement or supply-chain cost information.
  • Labelling is truncated. Where a prescribing-information section runs long it is truncated on the page; the linked source label is always authoritative and complete.
  • Not every label is present. Labelling is attached by spl_set_id, and only for entities that receive a detail page. A medication listed without a label may still have one on file with the FDA.
  • OTC monograph products carry pseudo-application numbers. Products marketed under an OTC monograph rather than an approved application record identifiers such as M004. These are not approvals, and OpenRx does not treat them as such — the completeness score only counts an application when it resolves to a Drugs@FDA or Orange Book record.
  • Snapshot, not a live feed. The site is a build-time snapshot. Every source page records the dataset version it came from, and the changelog records when the build ran.

Joined schema currently holds 47,843 medication entities, 392,074 packages, 29,347 applications, 22,303 patents and 89,073 labelling sections.