The NLM Drug Interaction API Was Discontinued in 2024 — Here's How to Replace It
On January 2, 2024, the National Library of Medicine quietly killed its Drug-Drug Interaction API. No replacement. No migration path. Just a notice on the docs page and a broken endpoint for every app that depended on it.
If your code is calling rxnav.nlm.nih.gov/REST/interaction and getting nothing back, that's why. It's not a temporary outage. It's gone.
This post covers exactly what was discontinued, what's still alive, and how to build a working replacement.
What exactly was discontinued
The NLM's RxNav suite offered a Drug-Drug Interaction API that let you check interactions between drugs identified by RxCUI — the standard public drug identifier. Two endpoints were the workhorses:
GET https://rxnav.nlm.nih.gov/REST/interaction/interaction.json?rxcui=88014
GET https://rxnav.nlm.nih.gov/REST/interaction/list.json?rxcuis=207106+656659
The first checked interactions for a single drug. The second checked all interactions among a list of RxCUIs — the polypharmacy use case.
The API drew from two sources: ONCHigh (a curated expert panel list of high-priority DDIs, supplemented with CredibleMeds data on Torsades de Pointes risk) and DrugBank (a broader dataset, but without severity information in the non-commercial version NLM used).
Both are gone. The RxNav Interactions tab was removed at the same time.
What's still alive
Importantly, only the interaction API was discontinued. The rest of RxNav is still operational:
- RxNorm endpoints for drug name normalization are still up
-
findRxcuiByStringfor mapping drug names to RxCUI still works -
getApproximateMatchfor fuzzy name resolution still works - RxTerms, RxClass, and related terminology services are unaffected
So if your app uses RxNav for drug lookup or name normalization, you're fine. It's only the interaction checking that's broken.
Why this matters clinically
Drug-drug interaction checking isn't a nice-to-have. It's a core safety function in any application that touches medication management. The ONC High Priority list that NLM used exists specifically because these interactions cause preventable patient harm.
Apps that were silently calling the NLM endpoint and getting empty responses back since January 2024 have been running without interaction checking for over two years — and in many cases, nobody noticed because the failure mode was silent, not loud.
How to replace it
You need three things: a source of interaction data, a way to resolve drug names to canonical identifiers, and an API that does both reliably.
Step 1: Understand RxCUI
RxCUI (RxNorm Concept Unique Identifier) is the standard public identifier for drugs in the US. It's what the NLM API used, and it's what any replacement needs to support. The key thing to understand is that RxCUI operates at the ingredient level — "warfarin" has an RxCUI, and so does "Coumadin" (the brand name), and they resolve to the same ingredient.
Your existing code probably already passes RxCUIs to the NLM endpoint. A good replacement accepts the same identifiers, so the swap is a one-liner.
Step 2: Know your data sources
The NLM used ONCHigh and DrugBank (non-commercial). Better alternatives now exist:
- DDInter 2.0 — a curated DDI database with severity, mechanism, and evidence levels. More comprehensive than what NLM was providing.
- openFDA — FDA adverse event and drug interaction data, fully public
- ONC High Priority list — still available independently, same expert-curated list NLM used
A replacement worth using should aggregate across all three.
Step 3: The actual migration
I built RxCheck specifically as a drop-in replacement for the discontinued NLM endpoint. Same RxCUI-based query structure, 500K+ interaction pairs from DDInter 2.0, openFDA, and the ONC High Priority list, with severity, mechanism, and evidence level in every response.
Before (broken):
const res = await axios.get(
`https://rxnav.nlm.nih.gov/REST/interaction/list.json?rxcuis=${rxcuis}`
)
After (working):
const res = await axios.get(
`https://api.rxcheck.dev/v1/interactions?drug1=warfarin&drug2=aspirin`,
{ headers: { 'X-API-Key': 'YOUR_KEY' } }
)
The response includes what the NLM API never gave you — severity level, interaction mechanism, evidence quality, and source attribution:
{
"interaction": {
"found": true,
"severity": "major",
"onc_high_priority": true,
"mechanism": "Aspirin inhibits platelet aggregation and may displace warfarin from protein binding sites, increasing anticoagulant effect.",
"evidence_level": "A",
"sources": ["DDInter 2.0", "ONC"]
}
}
For polypharmacy — checking a full medication list — use the batch endpoint:
curl -X POST https://api.rxcheck.dev/v1/interactions/batch \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"pairs": [["warfarin", "aspirin"], ["metformin", "ibuprofen"]]}'
Or the polypharmacy endpoint, which runs all n-choose-2 pairs automatically and returns a summary risk score:
GET /v1/interactions/polypharmacy?drugs=warfarin,aspirin,metformin
Migrating an EHR or open source project
If you're maintaining an open source EHR or health app (OpenEMR, NOSH, or similar), the migration pattern is:
- Add the RxCheck API key to your config/globals system
- Replace the hardcoded NLM URL with a configurable endpoint
- Update the response parser — the JSON structure is similar but richer
The free tier (100 queries/month) is enough to validate the integration before committing to a paid plan. No credit card required.
The broader lesson
The NLM DDI API was free, no-auth, and widely used — which made it easy to build on and easy to forget about. When it disappeared, most apps failed silently. If you're building health software, any dependency on a free public API with no SLA is a risk. The NLM gave notice, but plenty of developers missed it.
For anything clinical, it's worth paying for reliability. A $19/month API with a 99% SLA is a better foundation than a free endpoint that can disappear without warning.
Quick reference
| NLM (discontinued) | RxCheck | |
|---|---|---|
| Status | ❌ Gone since Jan 2024 | ✅ Live |
| Query format | RxCUI | RxCUI, drug name, brand name |
| Severity data | ❌ No (DrugBank tier) | ✅ Yes |
| Mechanism | ❌ No | ✅ Yes |
| ONC High Priority | ✅ Yes | ✅ Yes |
| Polypharmacy endpoint | ✅ Yes | ✅ Yes |
| Auth required | ❌ No | ✅ API key |
| Free tier | ✅ Unlimited | ✅ 100 req/mo |
| SLA | ❌ None | ✅ 99-99.9% |
Free tier at rxcheck.dev — no credit card required.
Happy to answer questions in the comments if you're working through a migration.

Top comments (0)