<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ben</title>
    <description>The latest articles on DEV Community by Ben (@ben_feeney_f0074083491ec6).</description>
    <link>https://dev.to/ben_feeney_f0074083491ec6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3963610%2F18849467-a6ba-4b9f-b41b-3616571eb904.png</url>
      <title>DEV Community: Ben</title>
      <link>https://dev.to/ben_feeney_f0074083491ec6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ben_feeney_f0074083491ec6"/>
    <language>en</language>
    <item>
      <title>The NLM Drug Interaction API is gone — here's what to use instead</title>
      <dc:creator>Ben</dc:creator>
      <pubDate>Tue, 02 Jun 2026 02:18:40 +0000</pubDate>
      <link>https://dev.to/ben_feeney_f0074083491ec6/the-nlm-drug-interaction-api-is-gone-heres-what-to-use-instead-2ac7</link>
      <guid>https://dev.to/ben_feeney_f0074083491ec6/the-nlm-drug-interaction-api-is-gone-heres-what-to-use-instead-2ac7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcifhykw4h4i2rz2i3ht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcifhykw4h4i2rz2i3ht.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The NLM Drug Interaction API Was Discontinued in 2024 — Here's How to Replace It
&lt;/h1&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;If your code is calling &lt;code&gt;rxnav.nlm.nih.gov/REST/interaction&lt;/code&gt; and getting nothing back, that's why. It's not a temporary outage. It's gone.&lt;/p&gt;

&lt;p&gt;This post covers exactly what was discontinued, what's still alive, and how to build a working replacement.&lt;/p&gt;




&lt;h2&gt;
  
  
  What exactly was discontinued
&lt;/h2&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;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
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first checked interactions for a single drug. The second checked all interactions among a list of RxCUIs — the polypharmacy use case.&lt;/p&gt;

&lt;p&gt;The API drew from two sources: &lt;strong&gt;ONCHigh&lt;/strong&gt; (a curated expert panel list of high-priority DDIs, supplemented with CredibleMeds data on Torsades de Pointes risk) and &lt;strong&gt;DrugBank&lt;/strong&gt; (a broader dataset, but without severity information in the non-commercial version NLM used).&lt;/p&gt;

&lt;p&gt;Both are gone. The RxNav Interactions tab was removed at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still alive
&lt;/h2&gt;

&lt;p&gt;Importantly, only the interaction API was discontinued. The rest of RxNav is still operational:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RxNorm&lt;/strong&gt; endpoints for drug name normalization are still up&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;findRxcuiByString&lt;/code&gt; for mapping drug names to RxCUI still works&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getApproximateMatch&lt;/code&gt; for fuzzy name resolution still works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RxTerms&lt;/strong&gt;, &lt;strong&gt;RxClass&lt;/strong&gt;, and related terminology services are unaffected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if your app uses RxNav for drug lookup or name normalization, you're fine. It's only the interaction checking that's broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters clinically
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to replace it
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Understand RxCUI
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Know your data sources
&lt;/h3&gt;

&lt;p&gt;The NLM used ONCHigh and DrugBank (non-commercial). Better alternatives now exist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DDInter 2.0&lt;/strong&gt; — a curated DDI database with severity, mechanism, and evidence levels. More comprehensive than what NLM was providing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;openFDA&lt;/strong&gt; — FDA adverse event and drug interaction data, fully public&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ONC High Priority list&lt;/strong&gt; — still available independently, same expert-curated list NLM used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A replacement worth using should aggregate across all three.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: The actual migration
&lt;/h3&gt;

&lt;p&gt;I built &lt;a href="https://rxcheck.dev" rel="noopener noreferrer"&gt;RxCheck&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before (broken):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://rxnav.nlm.nih.gov/REST/interaction/list.json?rxcuis=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rxcuis&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After (working):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.rxcheck.dev/v1/interactions?drug1=warfarin&amp;amp;drug2=aspirin`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-API-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes what the NLM API never gave you — severity level, interaction mechanism, evidence quality, and source attribution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"interaction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"found"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"major"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"onc_high_priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mechanism"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Aspirin inhibits platelet aggregation and may displace warfarin from protein binding sites, increasing anticoagulant effect."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"evidence_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"DDInter 2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ONC"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For polypharmacy — checking a full medication list — use the batch endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.rxcheck.dev/v1/interactions/batch &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-API-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"pairs": [["warfarin", "aspirin"], ["metformin", "ibuprofen"]]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or the polypharmacy endpoint, which runs all n-choose-2 pairs automatically and returns a summary risk score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /v1/interactions/polypharmacy?drugs=warfarin,aspirin,metformin
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Migrating an EHR or open source project
&lt;/h3&gt;

&lt;p&gt;If you're maintaining an open source EHR or health app (OpenEMR, NOSH, or similar), the migration pattern is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the RxCheck API key to your config/globals system&lt;/li&gt;
&lt;li&gt;Replace the hardcoded NLM URL with a configurable endpoint&lt;/li&gt;
&lt;li&gt;Update the response parser — the JSON structure is similar but richer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The free tier (100 queries/month) is enough to validate the integration before committing to a paid plan. No credit card required.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader lesson
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;NLM (discontinued)&lt;/th&gt;
&lt;th&gt;RxCheck&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;❌ Gone since Jan 2024&lt;/td&gt;
&lt;td&gt;✅ Live&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query format&lt;/td&gt;
&lt;td&gt;RxCUI&lt;/td&gt;
&lt;td&gt;RxCUI, drug name, brand name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Severity data&lt;/td&gt;
&lt;td&gt;❌ No (DrugBank tier)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mechanism&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ONC High Priority&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polypharmacy endpoint&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth required&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;✅ Unlimited&lt;/td&gt;
&lt;td&gt;✅ 100 req/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLA&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;✅ 99-99.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Free tier at &lt;a href="https://rxcheck.dev" rel="noopener noreferrer"&gt;rxcheck.dev&lt;/a&gt; — no credit card required.&lt;/p&gt;

&lt;p&gt;Happy to answer questions in the comments if you're working through a migration.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>opensource</category>
      <category>healthtech</category>
    </item>
  </channel>
</rss>
