Drugs to
Biological insights.

Look up any drug name, synonym, or identifier and retrieve cross-references, annotations, and structures. Paste a drug list to run enrichment analysis across targets, mechanisms, indications, and pathways.

Try:
Gleevec Gleevec STI-571 STI-571 imatinib mesylate imatinib mesylate BRD-K92723945 BRD-K92723945 1 compound one parent structure
One molecule, harmonized from every name and identifier it carries across sources.

No match found

No compound matched this term. SynDRA covers 3M+ compounds — try a generic name, brand name, INN, research code, or a database ID (ChEMBL, DrugBank, PubChem CID, InChIKey, RxNorm RXCUI).

synonyms harmonized
drug names from 11 databases
canonical compounds
deduplicated by structure
with resolved structure
SMILES / InChIKey confirmed
name-only entries
biologics, mixtures & research
← Back
How to use

One search box, three ways in.

Paste a name, a list, or a ranked list - SynDRA resolves it, harmonizes it, and (for lists) runs enrichment automatically. Below: why odd names still resolve, a full worked example, and how to read what comes back.

🔎
One name

Generic, brand, research code, InChIKey, or any DB ID - Ibuprofen 400mg and NVP-SHP099 both resolve.

📋
A list

One name per line. Combinations split automatically; failures are reported, never silently dropped. Enrichment runs over whatever resolved.

📈
A ranked list

Name and score, best-first. Use it when the ordering itself carries information a yes/no set would throw away.

Why odd names still resolve

Every synonym from nine core databases (plus Wikidata and FDA Orange Book) anchors to one InChIKey-standardized structure, so brand names, vendor codes, and database IDs for the same molecule land on the same record. One real compound, sirolimus (rapamycin) SYN0000068, shown two ways below.

Same drug, nine names, one ID

Each database knows this molecule by a different string - a brand name, a vendor code, an internal accession. Click below to watch them all snap onto one structure-anchored node.

?
9 records.
Same molecule?
SYN0000068
Sirolimus
QFJCIRLUMZQUOT-
HPLJOQBZSA-N
ChEMBL CHEMBL413
PubChem CID 5284616
DrugBank DB00877
RxNorm RXCUI 35302
LINCS BRD-A79768653
UniChem PDB: RAP
TTD Rapamune
DrugCentral rapamycin
PRISM AY-22989

Nine databases, nine different strings for the same molecule — one InChIKey ties them together.

Real record from the current build (320 synonyms, 6 xref-contributing sources). DrugBank identifiers are cross-referenced through other sources here — its own name vocabulary is held out. LINCS profiles this compound on a not-yet-merged stereo-variant node — a real gap the reconciliation pipeline hasn't closed.

Follow one query, start to finish

A brand name, a research code, a database accession, or a typo — the same six-stage path lands on the same record.

⌨️
You type
"Rapamycin"
…or AY-22989, DB00877, CHEMBL413 — any name or ID lands here
🔡
Normalize
rapamycin
Unicode-fold → lowercase → hyphen/space merge
🧭
Resolve
exact → prefix → fallback
The same chain strips dose, salt-combo, and vendor-code suffixes:
LIPITOR 20mg
→ LIPITOR
DISULFIRAM+CU
→ DISULFIRAM
metoprolol succinate ER
→ metoprolol succinate
🧬
Canonical node
SYN0000068
320 synonyms · 6 sources collapse onto this one ID
🎯
Annotated
FKBP12 · MTOR
mTOR inhibitor — used to prevent kidney transplant rejection
One answer
same record
Whichever of the 320 synonyms you searched, you get the same JSON, SDF, or enrichment result

Worked example: a prioritised drug list

An upstream method - a signature-based prioritisation, a screen, a literature triage - hands you a list. Paste it in as-is.

📋
Paste
6 names, 1/line
Don't clean them up first - that's the resolver's job
Check resolution
what resolved
Failures are listed, not silently dropped - fix these before reading anything else
📊
Enrichment table
k/M, p, FDR q
Fisher's exact + Benjamini-Hochberg, in your browser. Sort by q, but read k/M first
🗂️
Curated vs. predicted
two evidence tiers
Predicted-library terms are model output - hypotheses, not evidence
🔍
Open a drug
verify the evidence
Click through to see which databases actually back a claim

Reading a compound page

Every colour, marker, and superscript below carries meaning. Hover any numbered badge for the full explanation.

Illustrative example - not a live search

Dexamethasone small molecule

5 ⬇ CSV ⬇ JSON ⬇ SDF
1 Targets
NR3C1 · agonist5 NOS2 · inhibitor2
2 Indications
Inflammation COVID-19 ◦
3 Predicted
IL6 signalling ↓
4 References
⬡ Cross-database identifiers (7 linked) ⬡ Harmonized synonyms (214)
← Back
Explore

Browse drugs

Filter the compound hub by target, mechanism of action, indication, ATC class, clinical development phase, FDA approval status, or first-approval country. Filters combine with AND — narrow by any combination to find candidates.

← Back
Programmatic access

REST API: integrate SynDRA into any pipeline

Query compounds, resolve drug lists, and retrieve cross-references programmatically. Deploy locally in one command from the open-source repo.

Live instance: api.syndrabio.org — no deployment needed. The examples below show self-hosting; swap localhost:8080 for api.syndrabio.org to query it directly.

# Resolve any drug name, synonym, or identifier curl "http://localhost:8080/search?q=imatinib" # Batch-resolve a list (up to 500 names in one request) curl -X POST "http://localhost:8080/batch" \ -H "Content-Type: application/json" \ -d '{"queries":["imatinib","aspirin","metformin"]}' # Resolve name to BRD accession(s) curl "http://localhost:8080/cmap?q=imatinib" # Add clue_key to also fetch CLUE compound metadata curl "http://localhost:8080/cmap?q=imatinib&clue_key=YOUR_KEY" # Download SDF structure curl "http://localhost:8080/compound/SYN0002705/sdf" -o imatinib.sdf # Property-filtered browse (Lipinski Ro5) curl "http://localhost:8080/compounds?mw_max=500&logp_max=5&hbd_max=5" # Find structurally similar compounds (Tanimoto over RDKit ECFP4 fingerprints) curl "http://localhost:8080/compound/SYN0002705/similar?limit=20&min_similarity=0.4" # Database statistics curl "http://localhost:8080/stats"
import requests # Single lookup r = requests.get("http://localhost:8080/search", params={"q": "imatinib"}) compound = r.json() print(compound["syndra_id"]) # SYN0002705 print(compound["xrefs"]["RXNORM_RXCUI"]) # ['282388'] print(compound["xrefs"]["BRD"]) # ['BRD-K92723993'] # Batch: check pipeline coverage before analysis drugs = ["imatinib", "DB00619", "CHEMBL941", "unknowndrug"] res = requests.post("http://localhost:8080/batch", json={"queries": drugs}).json() resolved = [r["syndra_id"] for r in res if r["resolved"]] print(f"{len(resolved)}/{len(drugs)} resolved") # Resolve name → BRD accession(s) cmap = requests.get("http://localhost:8080/cmap", params={"q": "imatinib"}).json() print(cmap["brd_ids"]) # ['BRD-K92723993'] # Property filter: Lipinski Ro5 hits = requests.get("http://localhost:8080/compounds", params={"mw_max": 500, "logp_max": 5, "hbd_max": 5, "limit": 50}).json() print(f"{hits['total']} Lipinski-compliant compounds")
// Single lookup const res = await fetch('http://localhost:8080/search?q=imatinib'); const compound = await res.json(); console.log(compound.syndra_id); // SYN0002705 console.log(compound.xrefs.RXNORM_RXCUI); // ['282388'] // Batch resolve const batch = await fetch('http://localhost:8080/batch', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({queries: ['imatinib', 'aspirin', 'unknowndrug']}) }); const results = await batch.json(); // [{query:'imatinib',syndra_id:'SYN0002705',resolved:true}, ...]
GET/search?q=<query>

Resolve any drug name, synonym, ChEMBL ID, DrugBank ID, PubChem CID, BRD accession, or RxNorm RXCUI. Returns the full compound record with all synonyms, cross-references, and pharmacological annotations.

GET/compound/{sid}

Retrieve a compound record by SynDRA canonical ID (e.g. SYN0002705). Returns synonyms, xrefs, structure, and metadata.

POST/batch

Resolve up to 500 drug names in one request. Returns syndra_id and resolved flag for each query. Useful for pipeline coverage checks.

GET/compound/{sid}/sdf

Download a compound's structure as an SDF file. Includes 2D coordinates by default; pass ?threed=true for ETKDG+MMFF94 3D. Returns HTTP 422 for name-only compounds.

GET/cmap

Resolve any drug name to its LINCS BRD accession(s). Add ?clue_key= to also fetch CLUE compound metadata (MOA, target, signature count) from the Connectivity Map API.

GET/compounds

Browse structure-resolved compounds with physicochemical filters: mw_max, logp_max, tpsa_max, hbd_max, hba_max. Useful for building Lipinski or CNS-penetrant screening sets.

GET/compound/{sid}/similar

Find structurally similar compounds by Tanimoto similarity over RDKit ECFP4 fingerprints (Morgan, radius=2, 2048-bit), searched against the annotated drug set. Tune with ?limit= and ?min_similarity=. Excludes salt/stereo variants of the same molecule.

GET/stats

Database statistics: compound count, synonym count, xref count, breakdown by source and identifier type.

Deploy in one command

The API reads from the Parquet outputs. No database required.
Median lookup latency <2 ms after startup.

pip install -r api/requirements.txt uvicorn api.syndra_api:app --port 8080 # API ready at http://localhost:8080 # Interactive docs at http://localhost:8080/docs
Open data

Download the data

All data files are released under CC BY-SA 4.0 and updated quarterly. Parquet files are recommended for large-scale use; CSV files work with any tool.

🧪
Compounds
3,072,483 canonical compound nodes: SynDRA ID, preferred name, InChIKey, SMILES, structure flag, and first source.
🏷
Synonyms
12,164,427 synonym entries: raw name, normalized key, source, and license per entry, linked to SynDRA ID.
🔗
Cross-references
20,311,929 identifier mappings across 25 types: ChEMBL, DrugBank, PubChem CID, RxNorm RXCUI, BindingDB, PDB ligand codes, and more.

Web portal data: the live portal streams syndra.sqlite3 directly from Cloudflare R2 via HTTP Range requests (sql.js-httpvfs) — no full-database download needed to search or browse. Enrichment library data is in enrichment_data.json.

Data files are released under CC BY-SA 4.0. There is a single build: DrugBank's name vocabulary is held out (its identifiers are cross-referenced through other sources), and RxNorm content is limited to NLM-authored names (SAB=RXNORM), which carry no additional UMLS restriction. The proprietary vocabularies bundled in the RxNorm release are not included, and redistributing those would require a UMLS license. See DATA_SOURCES.md for details.
← Back
Provenance

Source databases

SynDRA harmonizes nine core synonym/structure databases plus two enrich-only extensions. Every compound record links back to the original source below. See DATA_SOURCES.md for exact file versions and download dates.

DrugBank identifiers are cross-referenced through other sources — its own name vocabulary is held out of the build.

Annotation & enrichment sources (targets, mechanisms, indications, ATC, clinical phase):

Open resource

Built on the full SynDRA map

The complete resource, build pipeline, and structural validation are open on GitHub. Cite SynDRA if it supports your work.

Corbaci, T., Naderi Yeganeh, P. & Hide, W. SynDRA: a structure-anchored compound hub for drug repurposing that eliminates silent identifier loss. Preprint (2026). github.com/hidelab/SynDRA

Report a bug / give feedback

Spot something wrong, or have a suggestion? Let us know.