Free. No key. CORS open.

A free drug interaction API, sourced from FDA labels

The same engine behind the checker, as JSON. Send a list of medicines, supplements, foods, or habits and get every pair back with a severity and the exact label sentence behind it, with a DailyMed link so anyone can verify the claim.

60 requests/min per IP10 items per checkJSON, camelCaseCacheable for an hourAttribution requested

Quick start

Base URL:

https://interaction-checker.com/api/v1

One call, three items, every pair:

curl
curl "https://interaction-checker.com/api/v1/checks?items=lisinopril,ibuprofen,potassium"
JavaScript
const res = await fetch("https://interaction-checker.com/api/v1/checks", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ items: ["Zoloft", "tramadol", "St. John's wort"] }),
});
const { pairs, unresolved } = await res.json();
for (const p of pairs) {
  console.log(`${p.a.name} + ${p.b.name}: ${p.severityLabel}`);
  for (const e of p.evidence) console.log("  ", e.quote, "->", e.source.url);
}
Python
import requests

r = requests.get("https://interaction-checker.com/api/v1/checks", params={"items": "warfarin,aspirin,fish oil"})
r.raise_for_status()
for pair in r.json()["pairs"]:
    print(pair["a"]["name"], "+", pair["b"]["name"], "->", pair["severityLabel"])
    for ev in pair["evidence"]:
        print("   ", ev["sectionLabel"] + ":", ev["quote"])

Endpoints

All paths are relative to https://interaction-checker.com/api/v1. Every response is JSON; errors use { "error": { "code", "message" } } with the matching HTTP status.

MethodPathWhat you get
GET/checks?items=a,b,cCheck every pair among 2 to 10 items. Names, brands, ids, or a question.
POST/checksSame, with a JSON body: { "items": [...] }.
GET/interactions/{a}/{b}One pair with all of its evidence.
GET/substances?q=advilSearch by name, brand, alias, class, or plain language. Typo tolerant. limit up to 25.
GET/substancesEvery substance in the index (add kind=drug or kind=other).
GET/substances/{id}Names, classes, the FDA label it is read from, interaction counts by severity.
GET/substances/{id}/interactionsEverything it has documented evidence with, most severe first (filter with severity=).
GET/substances/{id}/pillsEvery tablet and capsule version in its labels, with rendered images where available.
GET/substances/{id}/factsSourced facts, community claims with evidence status, misconceptions, FAQ.
GET/openapi.jsonThe OpenAPI 3.1 description of all of the above.

What a check returns

items are the inputs that resolved (with matchedOn when a brand or alias did the matching), unresolved lists the ones that did not, with suggestions, and pairs holds every combination among the resolved items, most severe first. Each pair's evidence is the list of verbatim label sentences that produced the grade: which label it came from (from), which item it is about (about), the label section, the term that matched, and the source with its DailyMed link.

JSON (trimmed)
{
  "items": [
    { "id": "lisinopril", "name": "Lisinopril", "kind": "drug", "query": "lisinopril",
      "url": "https://interaction-checker.com/drugs/lisinopril" },
    { "id": "ibuprofen", "name": "Ibuprofen", "kind": "drug", "query": "Advil", "matchedOn": "Advil",
      "url": "https://interaction-checker.com/drugs/ibuprofen" }
  ],
  "unresolved": [],
  "pairs": [
    {
      "a": { "id": "lisinopril", "name": "Lisinopril", "kind": "drug", "url": "..." },
      "b": { "id": "ibuprofen", "name": "Ibuprofen", "kind": "drug", "url": "..." },
      "severity": "moderate",
      "severityLabel": "Moderate",
      "url": "https://interaction-checker.com/?d=lisinopril,ibuprofen",
      "page": "https://interaction-checker.com/interactions/ibuprofen-and-lisinopril",
      "evidence": [
        {
          "from": "lisinopril", "about": "ibuprofen",
          "section": "drug_interactions", "sectionLabel": "Drug interactions",
          "severity": "moderate",
          "quote": "In patients who are elderly, volume-depleted (including those on diuretic therapy), or with compromised renal function, coadministration of NSAIDs ... may result in deterioration of renal function ...",
          "matchedTerm": "nsaids", "matchKind": "class",
          "source": { "type": "fda_label", "name": "Zestril prescribing label (...)",
                      "url": "https://dailymed.nlm.nih.gov/dailymed/lookup.cfm?setid=...", "effectiveDate": "2025-01-02" }
        }
      ]
    }
  ],
  "summary": { "major": 0, "moderate": 1, "minor": 0, "none": 0, "unknown": 0 },
  "data": { "labelExportDate": "2026-09-03", "generatedAt": "2026-09-07" },
  "disclaimer": "Not medical advice. ...",
  "attribution": { "text": "Data from Interaction Checker (https://interaction-checker.com) ...", "url": "https://interaction-checker.com", "license": "..." }
}

severity is one of major, moderate, minor, none (the label explicitly reports no clinically significant interaction), or unknown (neither label mentions the other). The about page explains how each grade is decided.

Limits and fair use

  • 60 requests per minute per IP. Over that you get 429 with a Retry-After header. Responses carry Cache-Control: max-age=3600; the data changes about monthly, so cache freely.
  • 10 items per check, 45 pairs. Split longer lists into overlapping calls.
  • Attribution. Link to https://interaction-checker.com wherever you show results and keep the disclaimer next to them. Label text is public domain; the arrangement and grading are ours and free to use with a link.
  • Not medical advice. Severity reflects label wording, not a patient. Do not present the output as clinical decision support. See the terms and disclaimer.
  • Stability. The path is versioned (/v1). Fields are only added, never renamed, within a version.

Questions

Is the API really free? Do I need a key?
Yes, and no. There is no key, no account, and no paid tier. The only limit is 60 requests per minute per IP address, which is enough for an app, an agent, or a research script. If you need more, cache responses (they are cacheable for an hour) or get in touch through the address on the terms page.
Where does the data come from?
FDA prescribing labels published through openFDA and DailyMed, refreshed monthly, plus a small set of curated supplement, food, and alcohol rules from NIH and FDA fact sheets. Every quote is verbatim label text with a link to the label on DailyMed, so you can verify it.
What does the severity mean?
It reflects the wording of the label, graded by rule: a boxed warning, contraindication, or words like contraindicated and avoid are major; monitor, adjust, or dose wording is moderate; a plain mention is minor; none means the label explicitly reports no clinically significant interaction; unknown means neither label mentions the other. It is not a clinical assessment, and unknown is not proof of safety.
Can I send brand names or a question?
Yes. Items can be ids, generic names, brand names like Advil or Zoloft, aliases, or a plain question such as "can I take advil with lisinopril". Anything that does not resolve comes back in an unresolved list with suggestions.
Can I use it from a browser or an AI agent?
Yes. CORS is open, every response is JSON, and the same data is available as an MCP server at /mcp for Claude, ChatGPT, Cursor, and other MCP clients. The OpenAPI document at /api/v1/openapi.json works with code generators and agent tool loaders.
What do you ask in return?
A link back to https://interaction-checker.com wherever you show results, the disclaimer next to them, and no reselling of the data as a clinical decision-support product. The full terms are on the terms page.