MolDyn Documentation
Wave-resonance virtual screening for protease targets. 2.6M ChEMBL compounds, ~17 ms per query on a single GPU.
Getting Started
MolDyn is self-hosted: you run the Docker image on a Linux host with an NVIDIA GPU. No data leaves your infrastructure. Three commands after you have your trial key:
curl -O https://cellswave.com/install.sh
chmod +x install.sh
bash install.sh
The installer checks GPU + driver, pulls the Docker image, downloads the cached wave library, and starts the API on https://localhost:8443.
First API call
The health check requires no key and confirms the service is reachable:
curl -k https://localhost:8443/v1/health
Expected response:
{
"status": "ok",
"library_size": 2609637,
"encoder_version": "magnitude_v1",
"api_version": "1.0.0"
}
Screen a molecule
curl -k -X POST https://localhost:8443/v1/screen \
-H "X-API-Key: $MOLDYN_KEY" \
-H "Content-Type: application/json" \
-d '{"smiles": "CC(=O)Oc1ccccc1C(=O)O", "top_k": 10}'
Dock against a protein pocket
curl -k -X POST https://localhost:8443/v1/dock \
-H "X-API-Key: $MOLDYN_KEY" \
-H "Content-Type: application/json" \
-d '{"pdb_id": "6LU7", "top_k": 100}'
Requirements
| Component | Minimum |
|---|---|
| GPU | NVIDIA with 8 GB VRAM (tested on RTX 3070 Laptop) |
| Driver | NVIDIA driver ≥ 535 |
| OS | Linux with Docker + NVIDIA Container Toolkit |
| RAM | 16 GB host memory |
| Disk | ~10 GB for library + image |
| Network | One-time download of the ~5 GB wave cache |
API Reference
Base URL: https://localhost:8443/v1 (self-hosted). Auth: X-API-Key header on every request except /health and /proteins.
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /v1/health | — | Service, GPU, library readiness |
| GET | /v1/proteins | — | List cached PDB IDs |
| POST | /v1/screen | yes | Rank library by SMILES similarity |
| POST | /v1/dock | yes | Rank library against a binding pocket |
POST /v1/screen
| Field | Type | Required | Notes |
|---|---|---|---|
| smiles | string | yes | Query ligand as SMILES |
| top_k | integer | no (10) | Number of hits. Capped by plan. |
| method | string | no ("gre") | One of gre, boosted, hybrid, pharmacophore |
POST /v1/dock
| Field | Type | Required | Notes |
|---|---|---|---|
| pdb_id | string | yes | 4-character PDB code. Auto-downloaded if not cached. |
| top_k | integer | no (100) | Number of hits. Capped by plan. |
| method | string | no ("boosted") | Same options as /screen |
Plans
| Plan | Requests / month | top_k max |
|---|---|---|
| Free | 100 | 10 |
| Starter | 1,000 | 50 |
| Pro | 10,000 | 100 |
| Enterprise | unlimited | 500 |
Exceeding the request cap returns HTTP 429. Exceeding the top_k cap returns HTTP 422.
Error Codes
Every error has the same shape: {"error": "<slug>", "message": "<human>"}.
| HTTP | Slug | Condition |
|---|---|---|
| 400 | invalid_smiles | SMILES parse / conformer generation failed |
| 400 | invalid_input | Malformed / unresolvable PDB ID |
| 401 | invalid_api_key | Missing or unknown X-API-Key |
| 422 | invalid_input | top_k out of range for plan |
| 429 | rate_limit | Monthly request limit reached |
| 500 | server_error | Unhandled internal error |
| 503 | service_unavailable | Library cache / encoder version mismatch |
Examples
Python
import os, requests
headers = {"X-API-Key": os.environ["MOLDYN_KEY"]}
r = requests.post(
"https://localhost:8443/v1/screen",
json={"smiles": "CC(=O)Oc1ccccc1C(=O)O", "top_k": 10},
headers=headers,
verify=False, # self-signed cert for local install
)
for hit in r.json()["results"]:
print(hit["rank"], hit["chembl_id"], hit["score"])
JavaScript
const r = await fetch("https://localhost:8443/v1/screen", {
method: "POST",
headers: {
"X-API-Key": process.env.MOLDYN_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ smiles: "CC(=O)Oc1ccccc1C(=O)O", top_k: 10 }),
});
const data = await r.json();
Support
Email hello@cellswave.com for:
- Trial access and plan upgrades
- Benchmark report (sent after short review)
- Deployment help, on-prem installs, and custom targets
- Bug reports and feature requests