Open Targets Platform Database
Overview
Open Targets Platform integrates evidence from genetics, genomics, literature, and drug databases to systematically score target-disease associations for 60,000+ targets and 20,000+ diseases/phenotypes. The public GraphQL API (no authentication required) provides access to association scores, evidence from 20+ data sources (GWAS, ClinVar, ChEMBL, drugs, pathways, mouse models, expression), and detailed drug-target-disease triangles.
When to Use
- Ranking therapeutic targets for a disease by overall association score and evidence breakdown
- Finding all diseases associated with a gene of interest and their confidence scores
- Retrieving approved and investigational drugs for a target, with mechanism of action and clinical phase
- Assessing target druggability and tractability (small molecule, antibody, PROTAC likelihood)
- Pulling genetic association evidence (GWAS hits, variant-to-gene mappings) for a target-disease pair
- Exploring safety/adverse event data for a drug target from FAERS and literature
- For bioactivity IC50/Ki data use
chembl-database-bioactivity; for clinical trial details useclinicaltrials-database-search
Prerequisites
- Python packages:
requests - Data requirements: gene symbols (HGNC), Ensembl gene IDs, disease EFO IDs, or drug names
- Environment: internet connection; no authentication needed
- Rate limits: no hard limit stated; use reasonable delays for large queries (>100 targets)
pip install requests
Quick Start
import requests
OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"
def ot_query(gql, variables=None):
r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
r.raise_for_status()
return r.json()["data"]
# Top disease associations for BRCA1
query = """
query TargetDiseases($ensgId: String!) {
target(ensemblId: $ensgId) {
id
approvedSymbol
associatedDiseases(page: {index: 0, size: 5}) {
rows {
disease { id name }
score
}
}
}
}
"""
data = ot_query(query, {"ensgId": "ENSG00000012048"})
target = data["target"]
print(f"Target: {target['approvedSymbol']}")
for row in target["associatedDiseases"]["rows"]:
print(f" {row['disease']['name']}: {row['score']:.3f}")
Core API
Query 1: Target Lookup by Gene Symbol
Search for a target and retrieve basic metadata (Ensembl ID, biotype, description).
import requests
OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"
def ot_query(gql, variables=None):
r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
r.raise_for_status()
return r.json()["data"]
# Search by gene symbol
query = """
query SearchTarget($sym: String!) {
search(queryString: $sym, entityNames: ["target"]) {
hits {
id
name
entity
object {
... on Target {
approvedSymbol
approvedName
biotype
functionDescriptions
}
}
}
}
}
"""
data = ot_query(query, {"sym": "BRCA1"})
for hit in data["search"]["hits"][:3]:
obj = hit.get("object", {})
print(f"ID: {hit['id']} | {obj.get('approvedSymbol')} | {obj.get('biotype')}")
descs = obj.get("functionDescriptions", [])
if descs:
print(f" Function: {descs[0][:120]}")
# Direct lookup by Ensembl ID
query2 = """
query Target($ensgId: String!) {
target(ensemblId: $ensgId) {
id approvedSymbol approvedName biotype
tractability { label modality value }
}
}
"""
data2 = ot_query(query2, {"ensgId": "ENSG00000141510"}) # TP53
t = data2["target"]
print(f"\n{t['approvedSymbol']} ({t['id']}): {t['biotype']}")
print("Tractability:")
for tr in t.get("tractability", [])[:5]:
print(f" {tr['modality']} | {tr['label']}: {tr['value']}")
Query 2: Target-Disease Associations
Retrieve association scores for a target across all associated diseases.
import requests, pandas as pd
OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"
def ot_query(gql, variables=None):
r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
r.raise_for_status()
return r.json()["data"]
query = """
query Associations($ensgId: String!, $size: Int!) {
target(ensemblId: $ensgId) {
approvedSymbol
associatedDiseases(page: {index: 0, size: $size}, orderByScore: "score") {
count
rows {
disease { id name therapeuticAreas { name } }
score
datatypeScores { id score }
}
}
}
}
"""
data = ot_query(query, {"ensgId": "ENSG00000012048", "size": 20})
target = data["target"]
assoc = target["associatedDiseases"]
print(f"{target['approvedSymbol']}: {assoc['count']} associated diseases")
rows = []
for r in assoc["rows"]:
scores = {d["id"]: d["score"] for d in r.get("datatypeScores", [])}
rows.append({
"disease": r["disease"]["name"],
"disease_id": r["disease"]["id"],
"overall_score": round(r["score"], 4),
"genetics": round(scores.get("genetic_association", 0), 3),
"drugs": round(scores.get("known_drug", 0), 3),
"literature": round(scores.get("literature", 0), 3),
})
df = pd.DataFrame(rows)
print(df.head(10).to_string(index=False))
Query 3: Disease-Target Associations
Given a disease, retrieve all associated targets ranked by score.
import requests, pandas as pd
OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"
def ot_query(gql, variables=None):
r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
r.raise_for_status()
return r.json()["data"]
query = """
query DiseaseTargets($efoId: String!, $size: Int!) {
disease(efoId: $efoId) {
id name
associatedTargets(page: {index: 0, size: $size}, orderByScore: "score") {
count
rows {
target { id approvedSymbol biotype }
score
datatypeScores { id score }
}
}
}
}
"""
# EFO_0000305 = breast carcinoma
data = ot_query(query, {"efoId": "EFO_0000305", "size": 10})
disease = data["disease"]
print(f"Disease: {disease['name']}")
print(f"Total associated targets: {disease['associatedTargets']['count']}")
for row in disease["associatedTargets"]["rows"][:5]:
t = row["target"]
print(f" {t['approvedSymbol']:12s} score={row['score']:.3f} biotype={t['biotype']}")
Query 4: Known Drugs for a Target
Retrieve approved and investigational drugs, their mechanism, and clinical phase.
import requests, pandas as pd
OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"
def ot_query(gql, variables=None):
r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
r.raise_for_status()
return r.json()["data"]
query = """
query KnownDrugs($ensgId: String!) {
target(ensemblId: $ensgId) {
approvedSymbol
drugAndClinicalCandidates {
count
rows {
maxClinicalStage
drug { id name drugType maximumClinicalStage mechanismsOfAction { rows { mechanismOfAction } } }
diseases { disease { id name } }
}
}
}
}
"""
data = ot_query(query, {"ensgId": "ENSG00000146648"}) # EGFR
target = data["target"]
drugs_data = target["drugAndClinicalCandidates"]
print(f"{target['approvedSymbol']}: {drugs_data['count']} drug-indication pairs")
rows = []
for r in drugs_data["rows"]:
drug = r["drug"]
moa = drug.get("mechanismsOfAction") or {}
moa_first = (moa.get("rows") or [{}])[0].get("mechanismOfAction")
first_disease = (r.get("diseases") or [{}])[0].get("disease") or {}
rows.append({
"drug": drug["name"],
"type": drug["drugType"],
"maxClinicalStage": r["maxClinicalStage"],
"approved": drug["maximumClinicalStage"] == "PHASE_4",
"indication": first_disease.get("name", "n/a"),
"mechanism": moa_first,
})
df = pd.DataFrame(rows).drop_duplicates(su