Drug Shortage Data History: Where to Find It and How to Track It Over Time
Pharmacy buyers, hospital supply teams, analysts and journalists all ask the same thing: how long has this drug been in shortage, and how often does it come back? Current shortage lists are easy to find. History is harder. Here's what's available and how to build a time series.
The main public sources
1. FDA Drug Shortages Database. FDA lists current and resolved shortages it has confirmed, with status, presentation (strength, package), reason, and manufacturer updates. It's the authoritative federal list.
2. openFDA drug shortages endpoint. openFDA exposes FDA's shortage data as JSON at https://api.fda.gov/drug/shortages.json, with bulk downloads at https://open.fda.gov/data/downloads/. Fields include generic name, presentation, status, availability, shortage reason, company, initial posting date and update date, plus an openfda block with identifiers such as RxCUI where they map.
3. ASHP drug shortage lists. The American Society of Health-System Pharmacists runs its own list, which often counts more shortages because its definition is broader. Check ASHP's terms before reusing its data; it isn't a public-domain federal source.
This article focuses on the FDA data, which is CC0 via openFDA.
The history problem
The FDA list is a current-state view. When a shortage status changes, the record changes. You can see initial_posting_date and the latest update_date, but not:
- how many times status flipped between Current and Resolved,
- when a particular presentation was added or dropped,
- what the availability text said three months ago.
If you want history, you need repeated snapshots.
Building your own shortage history
Step 1: Snapshot weekly
import requests, zipfile, io, json, pandas as pd, datetime as dt
m = requests.get("https://api.fda.gov/download.json").json()
part = m["results"]["drug"]["shortages"]["partitions"][0]["file"]
z = zipfile.ZipFile(io.BytesIO(requests.get(part).content))
rows = json.load(z.open(z.namelist()[0]))["results"]
snap = pd.json_normalize(rows)
snap["snapshot_date"] = dt.date.today().isoformat()
snap.to_parquet(f"shortages_{snap.snapshot_date[0]}.parquet")
(Check the manifest key names; they can differ slightly from this example.)
Step 2: Pick a stable key
There's no single ID guaranteed to be stable across the shortage records. A practical composite key is generic name + presentation + company. Normalise case and whitespace first. Test your key: in any one snapshot it should be unique.
Step 3: Diff consecutive snapshots
key = ["generic_name", "presentation", "company_name"]
a = pd.read_parquet("shortages_2026-10-28.parquet").set_index(key)
b = pd.read_parquet("shortages_2026-11-04.parquet").set_index(key)
added = b.index.difference(a.index)
removed = a.index.difference(b.index)
common = a.index.intersection(b.index)
changed = []
for col in ["status", "availability", "shortage_reason"]:
diff = common[a.loc[common, col].ne(b.loc[common, col])]
for k in diff:
changed.append({"key": k, "field": col,
"old": a.at[k, col], "new": b.at[k, col]})
Store added, removed and changed with the week. Over months, this becomes your history.
Step 4: Analyse
With a change log you can measure:
- Shortage duration: first week seen as Current to first week seen as Resolved.
- Recurrence: how many times a product re-entered Current status.
- Reason trends: counts by
shortage_reasonper quarter. - Joins: use RxCUI to link to other drug datasets (RxCUIs come from the U.S. National Library of Medicine and are public domain).
Caveats
- FDA's list reflects shortages FDA has confirmed. It isn't a measure of every local supply problem.
- Free-text fields like availability can change wording without a real change in supply. Look at status changes first.
- Don't use the data to tell patients whether a drug is available. Point them to their pharmacist.
If you'd rather not maintain snapshots
Weekly snapshotting is simple until you need years of it, consistent keys across format changes, and joins to enforcement data. The Apex US Regulatory Events Feed keeps a weekly snapshot and a weekly_changes table for drug shortages, alongside drug, device and food enforcement reports and 510(k)/PMA decisions. It's delivered as CSV or through Delta Sharing (pandas, Spark, Power BI).
Note: our history begins at the date we started snapshotting. We don't invent changes from before that. The data dictionary states the start date.
Free samples: https://apex-feed.pages.dev/#samples. Full feed: https://apex-feed.pages.dev ($50 snapshot, $39/month, $390/year).
Source: U.S. FDA via openFDA. Apex is not affiliated with or endorsed by the U.S. Food and Drug Administration. Not medical advice.