Volt documentation
API reference, outputs, and model confidence guidance for Volt workflows.
Structure Prediction 101
Volt uses a state-of-the-art deep learning model to predict the three-dimensional structures of proteins and their complexes with other proteins, nucleic acids, and small molecules. The model was trained on the Protein Data Bank (PDB), the largest public repository of experimentally determined molecular structures, along with sequence databases that capture evolutionary relationships across millions of known proteins. By learning which amino acid sequences fold into which structures across biology, the model can generate accurate structure predictions for novel sequences it has never seen.
At its core, the deep learning approach works by feeding structured inputs into a neural network that has learned to analyze the relationships within that data. For a given prediction job, inputs include the amino acid sequence itself as well as a multiple sequence alignment (MSA): a set of related sequences from evolutionarily distant organisms that reveal which positions tend to co-vary. Co-variation between residue positions is a strong signal that those positions are spatially close or functionally coupled in the folded structure. The model integrates these signals to infer plausible geometries for how a protein folds internally and how it might interact with other molecules.
For each job, Volt generates multiple independent structure predictions using a diffusion-based sampling process, similar in concept to how image generation models produce varied outputs from the same prompt. This gives a distribution of plausible conformations rather than a single answer, which is valuable for understanding flexibility and assessing prediction robustness.
Confidence metrics
Each prediction comes with built-in confidence signals that indicate how reliable different parts of the structure are. These are not experimental measurements; they are the model's own estimates of its certainty:
pLDDT
Per-residue local confidence, scored 0-100. High values (above ~70) indicate well-modeled regions. Low values often correspond to disordered or flexible segments.
PAE
Pairwise Aligned Error. Estimates the expected positional error between pairs of residues. Low PAE between two regions means the model is confident about their relative orientation, which is particularly useful for assessing domain arrangement and interfaces.
iPTM
Interface predicted TM-score. Measures the model's confidence in the overall accuracy of a chain-chain interface. Values above ~0.8 generally indicate a high-confidence interaction; below ~0.5 is low confidence.
Consistency
A Volt-computed metric that summarizes how reproducibly the same inter-chain contacts appear across the set of generated predictions. High consistency suggests a more stable, recurrent interface rather than an artifact of one sample.
Confidence metrics are useful for prioritizing which predictions to investigate further, but they do not replace experimental validation. A high-confidence prediction is a strong hypothesis, not a confirmed structure.
Overview
Volt supports both a web UI workflow and a public API under /api/v1. The public API is designed for lab pipelines, notebooks, and automation agents that need to submit runs, monitor progress, inspect jobs, and download outputs.
What you can do
Submit runs, list runs/jobs, check run status, and download completed job outputs as ZIP files.
What you should monitor
Run/job status plus confidence metrics like pLDDT, PAE, iPTM, and cross-model contact consistency.
Quick start
1. Create an API key
Logged-in users can create API keys from API keys. Keys are permission-scoped and tied to a group.
2. Read the API agent instructions
Volt provides a machine-readable guide at /api/v1/agent that is useful for automation tools and LLM agents.
3. Test your key
Call GET /api/v1/ to verify authentication and view key permissions.
curl -sS https://runvolt.io/api/v1/ \
-H "X-API-Key: <YOUR_API_KEY>"
The response wrapper uses success, message, and data.
API Authentication
Most public API endpoints require an API key. Send the key in either the X-API-Key header (preferred) or Authorization: Bearer ....
Headers
X-API-Key: ... or Authorization: Bearer ...
Permissions
Use write for submission and other mutating actions. Read-only endpoints, including output downloads, accept read or write.
Public API requests are rate-limited per API key. Current server behavior allows one API call per key every 5 seconds.
Keys are associated with a single group, so list/status/download operations are automatically scoped to that group.
API Endpoints
Primary public endpoints currently available under /api/v1:
| Method | Path | Permission | Purpose |
|---|---|---|---|
| GET | /api/v1/agent | None | Returns markdown instructions for programmatic/agent integrations. |
| GET | /api/v1/ | Any valid key | Returns API key info, associated user/group, and allowed actions. |
| POST | /api/v1/run/submit | write | Submit a run with explicit jobs. |
| POST | /api/v1/run/list | read or write | List runs in the API key's group. |
| POST | /api/v1/run/status | read or write | Fetch a run status summary by run ID. |
| POST | /api/v1/run/info | read or write | Fetch run metadata and job counts by run ID. |
| POST | /api/v1/run/list/jobs | read or write | List jobs for a run (includes job-level analysis summary when available). |
| POST | /api/v1/run/cancel | write | Cancel a run and all its pending jobs. |
| POST | /api/v1/run/screen | write | Submit a pairwise screen: list A × list B generates one job per pair. |
| POST | /api/v1/job/status | read or write | Fetch status for a single job by job ID. |
| POST | /api/v1/job/info | read or write | Fetch job metadata and the original input payload. |
| GET | /api/v1/job/{job_id}/download | read or write | Download completed job outputs as a ZIP archive. |
| POST | /api/v1/job/output/list | read or write | List per-artifact outputs for a completed job. |
| POST | /api/v1/job/output/get | read or write | Download one artifact by output ID. |
Exact input requirements and examples for each endpoint are in the cards below.
GET Agent Instructions
/api/v1/agent
- No authentication required.
- No path parameters.
- No request body.
- Returns plain-text markdown instructions.
curl -sS https://runvolt.io/api/v1/agent
GET API Info
/api/v1/
- Authentication required: X-API-Key (preferred) or Authorization: Bearer ....
- API key format must be 128 alphanumeric characters.
- No path parameters.
- No request body.
curl -sS https://runvolt.io/api/v1/ \
-H "X-API-Key: <YOUR_API_KEY>"
POST Submit Run
/api/v1/run/submit
- Authentication required and key must have write permission.
- Header Content-Type: application/json required.
- Body field name: required string, 4-128 chars.
- Body field description: required string, 8-256 chars.
- Body field notify_by_email: optional boolean, defaults to false.
- Body field jobs: required array with 1-50,000 entries.
- Each jobs[] item must be an object; use /api/v1/agent for current payload conventions.
curl -sS -X POST https://runvolt.io/api/v1/run/submit \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{
"name": "Example API run",
"description": "Example submission from docs",
"notify_by_email": false,
"jobs": [
{
"name": "example job",
"chains": [
{"name": "TP53", "type": "protein", "value": "MEEPQSDPSVEPPLSQETFSDLWK..."}
]
}
]
}'
POST List Runs
/api/v1/run/list
- Authentication required and key must have read or write permission.
- No path parameters.
- No request body required.
curl -sS -X POST https://runvolt.io/api/v1/run/list \
-H "X-API-Key: <YOUR_API_KEY>"
POST Run Status
/api/v1/run/status
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field run_id: required string, exactly 16 chars, alphanumeric.
curl -sS -X POST https://runvolt.io/api/v1/run/status \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"run_id":"<RUN_ID_16_CHARS>"}'
POST Run Info
/api/v1/run/info
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field run_id: required string, exactly 16 chars, alphanumeric.
- Returns run metadata including name, description, times, and job counts.
curl -sS -X POST https://runvolt.io/api/v1/run/info \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"run_id":"<RUN_ID_16_CHARS>"}'
POST List Jobs For Run
/api/v1/run/list/jobs
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field run_id: required string, exactly 16 chars, alphanumeric.
- Returns jobs including job-level analysis when available.
curl -sS -X POST https://runvolt.io/api/v1/run/list/jobs \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"run_id":"<RUN_ID_16_CHARS>"}'
POST Cancel Run
/api/v1/run/cancel
- Authentication required and key must have write permission.
- Header Content-Type: application/json required.
- Body field run_id: required string, exactly 16 chars, alphanumeric.
- Run must belong to the same group as the API key.
- Response includes cancelled_job_count, active_job_count, refunded_token_count, and refunded_api_job_count.
curl -sS -X POST https://runvolt.io/api/v1/run/cancel \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"run_id":"<RUN_ID_16_CHARS>"}'
POST Submit Screen
/api/v1/run/screen
- Authentication required and key must have write permission.
- Header Content-Type: application/json required.
- Body field name: required string, 4-128 chars.
- Body field description: required string, 8-256 chars.
- Body field notify_by_email: optional boolean, defaults to false.
- Body field list_a: required array of chain specs, 1-10,000 entries. Each entry uses the same format as a single chain in /run/submit, including uniprot_id shorthand.
- Body field list_b: required array of chain specs, 1-10,000 entries.
- The total pair count (len(list_a) × len(list_b)) must not exceed 50,000.
- One job is created per A×B pair. Each job contains two chains: one from list_a and one from list_b.
- Job names are auto-generated as "{label_a} vs {label_b}". Label priority: chain name field → uniprot_id → positional fallback (A1, B2, etc.).
- Returns immediately with run_id, job_count, token_cost, and jobs_left. Poll /run/status to track progress.
curl -sS -X POST https://runvolt.io/api/v1/run/screen \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{
"name": "MDM2 inhibitor screen",
"description": "Screen MDM2 against a compound library",
"list_a": [
{"uniprot_id": "Q00987"},
{"uniprot_id": "P04637"}
],
"list_b": [
{"name": "aspirin", "type": "ligand", "value": "CC1=CC=C(C=C1)C(=O)O"},
{"uniprot_id": "P12931"}
]
}'
This example produces 4 jobs: Q00987 vs aspirin, Q00987 vs P12931, P04637 vs aspirin, P04637 vs P12931.
POST Job Status
/api/v1/job/status
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field job_id: required string, exactly 16 chars, alphanumeric.
- Returns job status, timing fields, and the parent run_id.
curl -sS -X POST https://runvolt.io/api/v1/job/status \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"job_id":"<JOB_ID_16_CHARS>"}'
POST Job Info
/api/v1/job/info
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field job_id: required string, exactly 16 chars, alphanumeric.
- Returns job metadata, timing fields, the parent run_id, and the original input payload (chains, names, types).
curl -sS -X POST https://runvolt.io/api/v1/job/info \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"job_id":"<JOB_ID_16_CHARS>"}'
GET Download Job Outputs
/api/v1/job/{job_id}/download
- Authentication required and key must have read or write permission.
- Path parameter job_id: required string, exactly 16 chars, alphanumeric.
- Optional query parameter type: full, structure, or data. Defaults to full.
- full returns CIFs, per-prediction *.analysis.json files, and analysis_summary.json. structure returns CIFs only. data returns analysis JSON files only.
- No request body.
- Returns a ZIP file stream. Job must be in complete status.
curl -L https://runvolt.io/api/v1/job/<JOB_ID_16_CHARS>/download \
-H "X-API-Key: <YOUR_API_KEY>" \
-o job_outputs.zip
POST List Job Outputs
/api/v1/job/output/list
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field job_id: required string, exactly 16 chars, alphanumeric.
- Job must be in complete status.
- Returns a list of artifact objects. Each artifact has an id and kind (prediction, analysis, or analysis_summary). Pass the id to /api/v1/job/output/get.
curl -sS -X POST https://runvolt.io/api/v1/job/output/list \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"job_id":"<JOB_ID_16_CHARS>"}'
POST Get Job Output
/api/v1/job/output/get
- Authentication required and key must have read or write permission.
- Header Content-Type: application/json required.
- Body field job_id: required string, exactly 16 chars, alphanumeric.
- Body field id: required string, the output artifact ID from /api/v1/job/output/list.
- Returns the raw file bytes of the artifact, not the standard JSON wrapper.
curl -sS -X POST https://runvolt.io/api/v1/job/output/get \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"job_id":"<JOB_ID_16_CHARS>","id":"<OUTPUT_ID>"}' \
-o artifact.cif
API Example Workflow
Typical flow: verify key, submit a run or screen, poll status, list jobs, then download completed outputs.
Option A: Submit a run (explicit jobs)
curl -sS -X POST https://runvolt.io/api/v1/run/submit \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{
"name": "TP53 + pifithrin",
"description": "Example API submission",
"notify_by_email": false,
"jobs": [
{
"name": "TP53 + pifithrin job",
"chains": [
{"name": "TP53", "type": "protein", "value": "MEEPQSDPSVEPPLSQETFSDLWK..."},
{"name": "Pifithrin", "type": "ligand", "value": "CC1=CC=C(C=C1)C(=O)CN2C3=C(CCCC3)SC2=N.Br"}
]
}
]
}'
Use /api/v1/agent for the latest payload guidance and integration conventions.
Option B: Submit a pairwise screen
Use /run/screen instead of /run/submit when you want to test every combination of two lists of molecules. The server generates one job per A×B pair automatically.
curl -sS -X POST https://runvolt.io/api/v1/run/screen \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{
"name": "MDM2 inhibitor screen",
"description": "Screen MDM2 against a compound library",
"list_a": [{"uniprot_id": "Q00987"}],
"list_b": [
{"name": "aspirin", "type": "ligand", "value": "CC1=CC=C(C=C1)C(=O)O"},
{"name": "ibuprofen", "type": "ligand", "value": "CC(C)Cc1ccc(cc1)C(C)C(=O)O"}
]
}'
Both /run/submit and /run/screen return a run_id immediately. Poll /run/status to track progress.
Check run status
curl -sS -X POST https://runvolt.io/api/v1/run/status \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"run_id":"<RUN_ID>"}'
List jobs for a run
curl -sS -X POST https://runvolt.io/api/v1/run/list/jobs \
-H "Content-Type: application/json" \
-H "X-API-Key: <YOUR_API_KEY>" \
-d '{"run_id":"<RUN_ID>"}'
Download outputs for a completed job
curl -L https://runvolt.io/api/v1/job/<JOB_ID>/download \
-H "X-API-Key: <YOUR_API_KEY>" \
-o job_outputs.zip
Add ?type=structure for CIF files only or ?type=data for JSON analysis only. Use POST /api/v1/job/output/list and POST /api/v1/job/output/get when you want a specific artifact instead of a ZIP archive.
Troubleshooting
401 Unauthorized
Check the API key format and confirm the key is active and not expired.
403 Forbidden
The key is valid, but it likely lacks the required action. Read-only endpoints require read or write, while mutating endpoints require write.
404 Not found
Run/job IDs must exist and belong to the same group as the API key.
429 Rate limit exceeded
Slow down polling. Current public API behavior allows one request per key every 5 seconds.
Missing analysis fields
Analysis summaries are generated when supported outputs are available. Some jobs may complete without every confidence summary artifact.
Model Confidence
Volt exposes confidence-related summaries to help prioritize follow-up work. These metrics are useful, but they should be treated as decision support signals, not proof of biological truth.
pLDDT
Per-token / local confidence indicator. Useful for identifying uncertain regions or flexible segments.
PAE
Pairwise aligned-error estimate. Lower values generally indicate more reliable relative positioning.
iPTM
Interface confidence signal for chain-pair interactions. Useful when assessing complex interfaces.
Consistency
Cross-model contact recurrence summary. Higher consistency can indicate more stable contact patterns across sampled models.
Where confidence data appears
- Job list responses can include a job analysis object.
- Downloaded outputs include per-prediction *.analysis.json files and an analysis_summary.json summary file when available.
- Chain-pair summaries include statistics such as pae, plddt, iptm, and consistency.
Practical interpretation: use confidence metrics to rank hypotheses and select experiments, then validate with orthogonal evidence (assays, literature, controls, or additional modeling).
Outputs
The job download endpoint returns a ZIP archive containing available outputs for the job. Output availability can vary by model/run. When you need an individual artifact instead, use POST /api/v1/job/output/list followed by POST /api/v1/job/output/get.
Common files
- <prediction_id>.cif structure files for generated predictions.
- <prediction_id>.analysis.json per-prediction confidence/contact summary files.
- analysis_summary.json cross-prediction analysis summary.
Job-level API analysis summary
For convenience, Volt stores a compact analysis summary on the job record (exposed through run job listing). This summary includes chain-pair level fields such as contact counts, consistency, and confidence statistic ranges.
Limitations & Validation
High-confidence model outputs can still be incomplete, context-dependent, or wrong for the exact biological system and assay conditions you care about.
Treat structures and interfaces as hypotheses. Validate important conclusions independently before relying on them in critical scientific or business decisions.