API Reference
Quickstart Authentication Rate limits
Endpoints
POST /score POST /details GET /proteins POST /dock POST /generate
Examples
Python cURL R Pipeline

VectaBind API

The VectaBind REST API lets you score compound libraries against 473 disease targets programmatically. Integrate binding affinity predictions directly into your drug discovery pipeline — no web app needed.

Base URL: https://api.vectabind.com  ·  Model: Stage6 SE(3)-EGNN + ESM2-3B  ·  MAE: 0.20 pKd

Quickstart

Get your first prediction in under a minute. Email [email protected] for a free API key, then:

BASH
# Score a compound against EGFR
curl -X POST https://api.vectabind.com/score \
     -H "Content-Type: application/json" \
     -H "X-API-Key: vb_your_key_here" \
     -d '{"smiles": ["CC(=O)Nc1ccc(O)cc1"], "protein_id": "egfr"}'
RESPONSE
{
  "protein_id": "egfr",
  "results": [
    {
      "rank": 1,
      "smiles": "CC(=O)Nc1ccc(O)cc1",
      "affinity": 6.84,
      "bind_prob": 0.73
    }
  ],
  "n_valid": 1,
  "n_total": 1
}

affinity is the predicted pKd value (higher = tighter binding). bind_prob is the probability the compound is an active binder (0–1).

Authentication

All requests require an API key passed in the X-API-Key header:

BASH
-H "X-API-Key: vb_your_key_here"

# Or as a Bearer token
-H "Authorization: Bearer vb_your_key_here"

API keys are prefixed with vb_. Keep your key secret — it controls your monthly quota. Email us to rotate a compromised key.

Rate limits

TierMonthly limitTargetsDockingBatch size
Free500 scores10 targets10
Pro50,000 scoresAll 4731,000
EnterpriseUnlimitedAll 473 + custom10,000

When you exceed your limit you'll receive a 429 response with your current usage and limit. Usage resets on the 1st of each month.

POST /score

Score one or more compounds against a protein target. Returns predicted pKd and binding probability for each valid SMILES.

POST /score Core scoring endpoint
ParameterTypeRequiredDescription
smilesstring[]requiredArray of SMILES strings to score
protein_idstringoptionalTarget protein ID (default: 10gs). Use GET /proteins for full list.
PYTHON
import requests

response = requests.post(
    "https://api.vectabind.com/score",
    headers={"X-API-Key": "vb_your_key"},
    json={
        "smiles": [
            "CCCOc1cc(N2CCC(Oc3ccc(C(C)NC(=O)c4cnn(C)c4)cc3)C2)ccn1",
            "COC1=CC=C(CC2=CN=C(NC3=NC=C(F)C=C3)S2)C=C1",
        ],
        "protein_id": "egfr"
    }
)

for result in response.json()["results"]:
    print(f"pKd: {result['affinity']:.2f}  Bind: {result['bind_prob']:.0%}  {result['smiles'][:40]}")

POST /details

Get full drug-like properties, VectaBind scoring, and ChEMBL similarity for a single compound.

POST /details Full compound analysis
ParameterTypeRequiredDescription
smilesstringrequiredSingle SMILES string
protein_idstringoptionalTarget protein ID
chembl_lookupbooleanoptionalInclude ChEMBL similarity search (default: true)

GET /proteins

Returns the full list of available protein targets with their IDs.

GET /proteins List all 473+ targets
BASH
curl https://api.vectabind.com/proteins \
  -H "X-API-Key: vb_your_key"

# Response
{"proteins": ["10gs", "11gs", "egfr", ...], "count": 19509}

POST /dock

Run GNINA docking to get a 3D binding pose and CNN-scored affinity. Pro/Enterprise only.

POST /dock 3D docking — Pro/Enterprise
ParameterTypeRequiredDescription
smilesstringrequiredSMILES of compound to dock
protein_idstringrequiredTarget protein ID

POST /generate

Launch a REINVENT4 generative chemistry job to design novel molecules optimized for a target. Returns a job ID for polling.

POST /generate AI molecule generation
ParameterTypeRequiredDescription
protein_idstringrequiredTarget to optimize for
n_stepsintegeroptionalRL steps (default: 100, max: 500)

Python examples

Screen a compound library

PYTHON
import requests
import pandas as pd

API_KEY = "vb_your_key"
BASE_URL = "https://api.vectabind.com"

# Load your compound library
df = pd.read_csv("compounds.csv")
smiles_list = df["smiles"].tolist()

# Score in batches of 100
results = []
for i in range(0, len(smiles_list), 100):
    batch = smiles_list[i:i+100]
    r = requests.post(
        f"{BASE_URL}/score",
        headers={"X-API-Key": API_KEY},
        json={"smiles": batch, "protein_id": "egfr"}
    )
    results.extend(r.json()["results"])
    print(f"Scored {i+len(batch)}/{len(smiles_list)}")

# Sort by affinity and save top hits
results_df = pd.DataFrame(results)
top_hits = results_df.sort_values("affinity", ascending=False).head(50)
top_hits.to_csv("top_hits.csv", index=False)
print(f"Top hit: pKd {top_hits.iloc[0]['affinity']:.2f}")

Multi-target panel screen

PYTHON
import requests

API_KEY = "vb_your_key"
TARGETS = ["egfr", "bace1", "jak2", "kras"]
SMILES = "CCCOc1cc(N2CCC(Oc3ccc(C(C)NC(=O)c4cnn(C)c4)cc3)C2)ccn1"

for target in TARGETS:
    r = requests.post(
        "https://api.vectabind.com/score",
        headers={"X-API-Key": API_KEY},
        json={"smiles": [SMILES], "protein_id": target}
    )
    result = r.json()["results"][0]
    print(f"{target.upper():8s}  pKd: {result['affinity']:.2f}  Bind: {result['bind_prob']:.0%}")

cURL examples

BASH
# Score a single compound
curl -X POST https://api.vectabind.com/score \
  -H "Content-Type: application/json" \
  -H "X-API-Key: vb_your_key" \
  -d '{"smiles":["CCO"],"protein_id":"egfr"}'

# Get all available proteins
curl https://api.vectabind.com/proteins \
  -H "X-API-Key: vb_your_key"

# Full compound details + ChEMBL lookup
curl -X POST https://api.vectabind.com/details \
  -H "Content-Type: application/json" \
  -H "X-API-Key: vb_your_key" \
  -d '{"smiles":"CCO","protein_id":"egfr","chembl_lookup":true}'

R examples

R
library(httr)
library(jsonlite)

api_key <- "vb_your_key"

response <- POST(
  "https://api.vectabind.com/score",
  add_headers("X-API-Key" = api_key),
  content_type_json(),
  body = toJSON(list(
    smiles = c("CC(=O)Nc1ccc(O)cc1", "CCO"),
    protein_id = "egfr"
  ), auto_unbox = TRUE)
)

results <- fromJSON(content(response, "text"))$results
print(results[, c("smiles", "affinity", "bind_prob")])

Pipeline integration

VectaBind works best as a fast filter early in your pipeline — before expensive docking or synthesis:

PYTHON
import requests

def vectabind_filter(smiles_list, target, min_pkd=6.0, min_bind=0.6, api_key=""):
    """Filter compounds by predicted binding affinity."""
    r = requests.post(
        "https://api.vectabind.com/score",
        headers={"X-API-Key": api_key},
        json={"smiles": smiles_list, "protein_id": target}
    )
    results = r.json()["results"]
    
    # Keep only predicted binders above threshold
    hits = [
        res for res in results
        if res["affinity"] >= min_pkd
        and res["bind_prob"] >= min_bind
    ]
    
    print(f"Filtered {len(smiles_list)} → {len(hits)} compounds")
    return [h["smiles"] for h in hits]

# Example: filter 10k compounds to top predicted binders
# before sending to expensive docking
library = load_your_library()           # 10,000 compounds
hits = vectabind_filter(               # → ~200-500 hits
    library, "egfr",
    min_pkd=7.0, min_bind=0.75,
    api_key="vb_your_key"
)
# Now dock only the top hits
run_gnina_docking(hits)

Ready to get started?

Get a free API key and score your first 500 compounds today. No credit card required.

Get free API key →