API Documentation
Integrate MolForge into your workflow with our REST API
Integrate MolForge into your workflow with our REST API
Deploy MoLFormer-XL, Uni-Mol, and ChemCrow + Llama-3 as a managed pipeline. Fine-tune on your proprietary HTS data with full IP ownership. Pharma-tier pricing with VPC isolation and SOC 2 / HIPAA compliance.
Get up and running with the MolForge API in two simple steps.
Navigate to your Settings page and generate a new API key. Keys are prefixed with mf_ for easy identification.
Use the API key in the X-API-Key header to authenticate your requests.
curl -X POST https://api.molforge.ai/v1/molecules/analyze \
-H "X-API-Key: mf_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"smiles": "CC(=O)Oc1ccccc1C(=O)O"}'
{
"molecule_id": "mol_a1b2c3d4e5f6g7h8",
"smiles": "CC(=O)Oc1ccccc1C(=O)O",
"name": "Aspirin",
"properties": {
"molecular_weight": 180.16,
"logP": 1.31,
"hbd": 1,
"hba": 4,
"tpsa": 63.60,
"lipinski_violations": 0
},
"admet": {
"absorption": "High",
"bbb_permeation": false,
"cyp_inhibition": false,
"hepatotoxicity": "Low",
"ld50": 200
},
"credits_used": 1
}
All API requests require authentication. Choose the method that fits your workflow.
Pass your API key in the X-API-Key header. Recommended for server-to-server calls.
X-API-Key: mf_your_api_key_here
Alternatively, use the standard Authorization header with a Bearer prefix.
Authorization: Bearer mf_your_api_key_here
Generate and manage your API keys on the Settings page.
Generate detailed molecular analysis PDFs from the dashboard. Each report includes 12 sections: executive summary, physicochemical properties, drug-likeness analysis, structural alerts, bioactivity predictions, synthesis feasibility, commercial availability, literature references, and more.
How to use: Analyze any molecule on the Dashboard, then click the PDF Report button.
Limits: Academic — 10/mo | Pro — 100/mo | Team — Unlimited | API — 50 credits/report ($1)
| Tier | Requests / min | Requests / day |
|---|---|---|
| Free | — | — |
| Academic | 30 | 1,000 |
| Pro | 60 | 10,000 |
| Team | 120 | 50,000 |
| Enterprise | Custom | Custom |
Complete reference for all available endpoints. Click any endpoint to see parameters and examples.
| Parameter | Type | Required | Description |
|---|---|---|---|
smiles | string | Required | SMILES string of the molecule |
properties | array | Optional | List of properties to compute (default: all) |
POST /v1/molecules/analyze
{
"smiles": "CC(=O)Oc1ccccc1C(=O)O",
"properties": ["logP", "tpsa", "admet"]
}
| Parameter | Type | Required | Description |
|---|---|---|---|
smiles | string | Required | Query SMILES string |
threshold | float | Optional | Tanimoto similarity threshold (default: 0.7) |
limit | integer | Optional | Max results to return (default: 50) |
POST /v1/molecules/find-similar
{
"smiles": "CC(=O)Oc1ccccc1C(=O)O",
"threshold": 0.8,
"limit": 20
}
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string (path) | Required | Molecule ID (e.g. mol_a1b2c3d4e5f6g7h8) |
GET /v1/molecules/mol_a1b2c3d4e5f6g7h8
| Parameter | Type | Required | Description |
|---|---|---|---|
smiles_list | array | Required | Array of SMILES strings (max 100) |
properties | array | Optional | Properties to compute |
POST /v1/molecules/batch
{
"smiles_list": [
"CC(=O)Oc1ccccc1C(=O)O",
"CC(C)Cc1ccc(cc1)C(C)C(=O)O"
]
}
| Parameter | Type | Required | Description |
|---|---|---|---|
protein_pdb | string | Required | PDB ID or uploaded protein structure |
ligand_smiles | string | Required | SMILES of ligand to dock |
center | object | Optional | Binding site center {x, y, z} |
box_size | object | Optional | Search box dimensions {x, y, z} |
exhaustiveness | integer | Optional | Docking exhaustiveness (default: 8) |
POST /v1/docking/run
{
"protein_pdb": "6LU7",
"ligand_smiles": "CC(=O)Oc1ccccc1C(=O)O",
"exhaustiveness": 16
}
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string (path) | Required | Docking job ID returned from submit |
{
"job_id": "dock_x7y8z9",
"status": "completed",
"best_score": -8.4,
"num_poses": 9,
"runtime_seconds": 42
}
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string (path) | Required | Docking job ID |
format | string (query) | Optional | Output format: pdb, sdf, mol2 (default: pdb) |
GET /v1/docking/dock_x7y8z9/poses?format=sdf
| Parameter | Type | Required | Description |
|---|---|---|---|
training_data | array | Required | Array of {smiles, activity} objects |
model_type | string | Optional | random_forest, gradient_boost, neural_net |
fingerprint | string | Optional | Fingerprint type: morgan, maccs, rdkit |
name | string | Optional | Model name for future reference |
POST /v1/qsar/train
{
"training_data": [
{"smiles": "CCO", "activity": 5.2},
{"smiles": "CCCO", "activity": 4.8}
],
"model_type": "gradient_boost",
"fingerprint": "morgan",
"name": "hERG_model_v1"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
model_id | string | Required | Trained model ID |
smiles_list | array | Required | SMILES strings to predict |
POST /v1/qsar/predict
{
"model_id": "qsar_m1n2o3",
"smiles_list": ["c1ccccc1", "CC(=O)O"]
}
| Parameter | Type | Required | Description |
|---|---|---|---|
page | integer (query) | Optional | Page number (default: 1) |
limit | integer (query) | Optional | Results per page (default: 20) |
GET /v1/qsar/models?page=1&limit=10
| Parameter | Type | Required | Description |
|---|---|---|---|
protein_pdb | string | Required | PDB ID or structure data |
ligand_smiles | string | Optional | SMILES of bound ligand |
duration_ns | float | Optional | Simulation duration in nanoseconds (default: 10) |
force_field | string | Optional | amber99sb, charmm36, opls-aa |
temperature | float | Optional | Temperature in Kelvin (default: 300) |
POST /v1/dynamics/run
{
"protein_pdb": "6LU7",
"ligand_smiles": "CC(=O)Oc1ccccc1C(=O)O",
"duration_ns": 10,
"force_field": "amber99sb"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string (path) | Required | MD simulation job ID |
{
"job_id": "md_p1q2r3",
"status": "running",
"progress": 0.45,
"elapsed_seconds": 3420,
"estimated_remaining": 4180
}
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string (path) | Required | MD simulation job ID |
format | string (query) | Optional | xtc, trr, pdb (default: xtc) |
frames | string (query) | Optional | Frame range, e.g. 0-100 |
GET /v1/dynamics/md_p1q2r3/trajectory?format=xtc&frames=0-100
| Parameter | Type | Required | Description |
|---|---|---|---|
scaffold | string | Optional | Scaffold SMILES to build upon |
objectives | object | Required | Optimization objectives (e.g. logP range, QED) |
num_molecules | integer | Optional | Number of candidates to generate (default: 100) |
diversity_filter | float | Optional | Minimum Tanimoto distance between results (default: 0.3) |
POST /v1/rl/train
{
"scaffold": "c1ccc2[nH]ccc2c1",
"objectives": {
"logP": [1.0, 3.0],
"qed": {"min": 0.6}
},
"num_molecules": 100
}
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string (path) | Required | Generation job ID |
{
"job_id": "gen_s4t5u6",
"status": "completed",
"molecules": [
{"smiles": "c1ccc2c(c1)cc(n2)CCN", "qed": 0.72, "logP": 1.85},
{"smiles": "c1ccc2c(c1)cc(n2)CCCO", "qed": 0.68, "logP": 2.11}
],
"total_generated": 100
}
| Parameter | Type | Required | Description |
|---|---|---|---|
protein_pdb | string | Required | Protein structure (PDB ID or data) |
ligand_a | string | Required | SMILES of reference ligand |
ligand_b | string | Required | SMILES of target ligand |
num_lambda | integer | Optional | Number of lambda windows (default: 12) |
POST /v1/fep/run
{
"protein_pdb": "6LU7",
"ligand_a": "CC(=O)Oc1ccccc1C(=O)O",
"ligand_b": "CC(C)Cc1ccc(cc1)C(C)C(=O)O",
"num_lambda": 16
}
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string (path) | Required | FEP job ID |
{
"job_id": "fep_v7w8x9",
"status": "completed",
"ddG": -2.34,
"ddG_error": 0.42,
"convergence": "good"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string (query) | Optional | Search query (name, SMILES, or property filter) |
depth | integer (query) | Optional | Traversal depth (default: 1, max: 3) |
limit | integer (query) | Optional | Max results (default: 50) |
GET /v1/graph/molecules?query=aspirin&depth=2&limit=25
| Parameter | Type | Required | Description |
|---|---|---|---|
from_id | string | Required | Source node ID |
to_id | string | Required | Target node ID |
type | string | Required | Relationship type (e.g. similar_to, targets) |
properties | object | Optional | Edge metadata |
POST /v1/graph/relationships
{
"from_id": "mol_a1b2c3d4e5f6g7h8",
"to_id": "mol_i9j0k1l2m3n4o5p6",
"type": "similar_to",
"properties": {"tanimoto": 0.85}
}
| Parameter | Type | Required | Description |
|---|---|---|---|
format | string (query) | Optional | json, csv, graphml (default: json) |
include_edges | boolean (query) | Optional | Include edges in export (default: true) |
GET /v1/graph/export?format=graphml&include_edges=true
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string (path) | Required | Task ID from any async operation |
{
"task_id": "task_abc123",
"type": "docking",
"status": "completed",
"created_at": "2026-03-05T10:30:00Z",
"completed_at": "2026-03-05T10:31:42Z",
"result_url": "/v1/docking/dock_x7y8z9"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string (query) | Optional | Filter: pending, running, completed, failed |
type | string (query) | Optional | Filter by task type |
page | integer (query) | Optional | Page number (default: 1) |
GET /v1/tasks?status=running&type=docking&page=1
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string (path) | Required | Task ID to cancel |
DELETE /v1/tasks/task_abc123
{
"task_id": "task_abc123",
"status": "cancelled",
"message": "Task cancelled successfully"
}
Searches global patent databases and uses MolForge AI to categorize claims, identify white spaces, and generate an IP landscape report.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Drug name, CAS number, or SMILES |
max_patents | integer | Optional | Max patents to analyze (default: 25, max: 100) |
POST /v1/patents/search
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"query": "Ticagrelor",
"max_patents": 50
}
{
"query": "Ticagrelor",
"stats": { "total_patents": 23, "by_category": {...} },
"patents": [{ "patent_id": "US20210123456A1", ... }],
"white_spaces": [{ "domain": "Polymorphism", ... }],
"executive_summary": "...",
"freedom_to_operate_assessment": "..."
}
Each API operation consumes credits based on computational complexity. Monitor your usage on the dashboard.
| Operation | Credits | Example |
|---|---|---|
| Property Lookup | 1 | Single SMILES → ADMET |
| Similarity Search | 5 | Find top-50 similar |
| Docking Job | 50 | Single protein-ligand dock |
| QSAR Training | 200 | Train custom model |
| MD Simulation | 100/ns | 10ns simulation = 1,000 cr |
| RL Generation | 1,000 | Generate 100 candidates |
| FEP Calculation | 500 | Single FEP run |
| Graph Query | 1 | Single graph traversal |
| IP Radar Scan | 25 | Patent landscape for one molecule |
Get started quickly with examples in your preferred language.
import requests
API_KEY = "mf_your_api_key"
BASE_URL = "https://api.molforge.ai/v1"
# Get molecular properties
response = requests.post(
f"{BASE_URL}/molecules/analyze",
headers={"X-API-Key": API_KEY},
json={"smiles": "CC(=O)Oc1ccccc1C(=O)O"}
)
print(response.json())
# Run a docking job
dock_response = requests.post(
f"{BASE_URL}/docking/run",
headers={"X-API-Key": API_KEY},
json={
"protein_pdb": "6LU7",
"ligand_smiles": "CC(=O)Oc1ccccc1C(=O)O"
}
)
job_id = dock_response.json()["job_id"]
# Poll for results
import time
while True:
result = requests.get(
f"{BASE_URL}/docking/{job_id}",
headers={"X-API-Key": API_KEY}
).json()
if result["status"] == "completed":
print(f"Best score: {result['best_score']}")
break
time.sleep(5)
const API_KEY = 'mf_your_api_key';
const BASE_URL = 'https://api.molforge.ai/v1';
// Get molecular properties
const response = await fetch(`${BASE_URL}/molecules/analyze`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ smiles: 'CC(=O)Oc1ccccc1C(=O)O' })
});
const data = await response.json();
console.log(data);
// Run docking job
const dockRes = await fetch(`${BASE_URL}/docking/run`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
protein_pdb: '6LU7',
ligand_smiles: 'CC(=O)Oc1ccccc1C(=O)O'
})
});
const { job_id } = await dockRes.json();
// Poll for results
const pollResult = async () => {
while (true) {
const res = await fetch(`${BASE_URL}/docking/${job_id}`, {
headers: { 'X-API-Key': API_KEY }
});
const result = await res.json();
if (result.status === 'completed') return result;
await new Promise(r => setTimeout(r, 5000));
}
};
const result = await pollResult();
# Get molecular properties
curl -X POST https://api.molforge.ai/v1/molecules/analyze \
-H "X-API-Key: mf_your_api_key" \
-H "Content-Type: application/json" \
-d '{"smiles": "CC(=O)Oc1ccccc1C(=O)O"}'
# Submit a docking job
curl -X POST https://api.molforge.ai/v1/docking/run \
-H "X-API-Key: mf_your_api_key" \
-H "Content-Type: application/json" \
-d '{"protein_pdb": "6LU7", "ligand_smiles": "CC(=O)Oc1ccccc1C(=O)O"}'
# Get docking results
curl https://api.molforge.ai/v1/docking/dock_x7y8z9 \
-H "X-API-Key: mf_your_api_key"
# List your tasks
curl https://api.molforge.ai/v1/tasks?status=running \
-H "X-API-Key: mf_your_api_key"
# Cancel a task
curl -X DELETE https://api.molforge.ai/v1/tasks/task_abc123 \
-H "X-API-Key: mf_your_api_key"
MolForge integrates established open-source tools for molecular computations.
Property calculations use RDKit (open-source cheminformatics). Docking uses AutoDock Vina. MD simulations use OpenMM/GROMACS. ADMET predictions use machine learning models trained on public datasets. See individual tool documentation for algorithmic details and references.
Start integrating molecular intelligence into your applications today.