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.
Quick start
Base URL:
https://interaction-checker.com/api/v1One call, three items, every pair:
curl "https://interaction-checker.com/api/v1/checks?items=lisinopril,ibuprofen,potassium"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);
}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.
| Method | Path | What you get |
|---|---|---|
| GET | /checks?items=a,b,c | Check every pair among 2 to 10 items. Names, brands, ids, or a question. |
| POST | /checks | Same, with a JSON body: { "items": [...] }. |
| GET | /interactions/{a}/{b} | One pair with all of its evidence. |
| GET | /substances?q=advil | Search by name, brand, alias, class, or plain language. Typo tolerant. limit up to 25. |
| GET | /substances | Every 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}/interactions | Everything it has documented evidence with, most severe first (filter with severity=). |
| GET | /substances/{id}/pills | Every tablet and capsule version in its labels, with rendered images where available. |
| GET | /substances/{id}/facts | Sourced facts, community claims with evidence status, misconceptions, FAQ. |
| GET | /openapi.json | The 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.
{
"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
429with aRetry-Afterheader. Responses carryCache-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
disclaimernext 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.