Changelog¶
Changes a caller can see: what the API accepts, what it returns, and when an existing request gives a different answer.
2026-10-19: an ended job always has a usage record¶
-
A path guessed on the API host leads somewhere.
GET /gainsguide,llms_txtandhuman_docsnext todocs./llms.txt,/docsand the other usual doc paths answer a short plain-text pointer to the guide and the spec;/api/v1/openapi.jsonand other spec-shaped paths redirect to/v1/openapi.jsonwith a body naming it./healthanswers as/v1/health. An unversioned path whose/v1route exists (/models,/jobs/{id}) still answers404, now naming that route indetailanddid_you_mean; any other404lists the nearest routes indid_you_meanwhen one is close. -
POST /v1/jobs/{id}/cancelsays what state the job is in. The answer gainsstatusandfinished_at. A running job used to answer{"canceled": true}while its run was still stopping, so its usage answered404"this job is running"; the cancel now holds up to 15 s for the run to stop and answers the ended job. A run still going after that readsrunning, with adetailnaming the?wait=call. MCPcancel_jobanswers the same. See Jobs → Cancel, delete. -
GET /v1/jobs/{id}/usageanswers the moment a job has ended. A job canceled while queued, or one that failed before it ran, used to answer404"No usage record yet" for good; it now answers its record withamount0. A queued or running job still answers404, and the message names its status and the?wait=call that returns when it ends. MCPget_job_usageanswers the same. See Jobs. -
MCP:
get_jobwithwaitnow holds up to 100 s in one call, where it held 45 s. A client that acceptstext/event-stream(Claude Code does) gets the answer as a stream with a progress notification every 10 s; any other client is still answered in one JSON body, held up to 45 s. Nothing under/v1changed.
2026-10-18: a finished job says how to download it¶
GET /v1/jobs/{id}on a succeeded job gainsartifactsanddownload.artifactsis the file list from its results (up to 20 files);downloadis one shell command that fetches every file, or the zip past 20. The list (GET /v1/jobs) is unchanged. See Jobs → Results.- MCP:
get_jobreturns the same, so a finished job needs noget_resultsor per-fileget_artifactcall to be downloaded.
2026-10-18: usage in dollars¶
GET /v1/usagesays what you spent.summarygainsamount(dollars),amount_micros,currencyandby_model, each model's jobs, seconds and money;by_surfacegains the same money fields. Each row, andGET /v1/jobs/{id}/usage, gainsamountandcurrency, and each targetamount. Existing fields are unchanged.japanfold usageprints what you spent by model, e.g.--days 7for the last week.
2026-10-18: the API as an MCP server¶
POST /mcpis a remote MCP server (Streamable HTTP, protocol 2025-06-18). Its tools are generated from/v1/openapi.json: submit a prediction, design or embedding, follow, list and cancel jobs, read results, get a download link per file, balance, usage and the model list. Same key, same limits, same billing as the REST call each tool makes. See The JapanFold skill. Nothing under/v1changed.
2026-10-11: guided antibody docking on OpenDDE¶
- OpenDDE takes a
constraint:block anduse_tfg_guidance: true. Give contact pairs or epitope residues you already know and the antibody is moved during sampling until the prediction agrees (OpenDDE 1.2.0's constraint guidance). Bothopenddeandopendde-abag; see Predictions. Requests without the parameter fold exactly as before. - A
constraint:block withoutuse_tfg_guidance: true, or sent to another model, is a 400, as is one naming a residue or chain the input does not have.
2026-10-06: chain-pair ipTM from every model, and OpenBind-0 pairs complexes¶
- Every model's results row carries
pair_chains_iptmandchains_ptmfor a multi-chain input. OpenFold3, OpenBind-0, RoseTTAFold3 and AF2-IG rows hadiptmbut not the per-pair matrix. It is keyed by chain position ("0","1", ...) on every model except ESMFold-2, which keys it by chain ID. OpenFold3 and OpenBind-0 rows written between 00:30 and the next roll on 2026-10-06 UTC key it from"1". - OpenBind-0 folds protein complexes again. A complex of two or more different proteins failed during preparation with a paired-MSA error. The cause was the paired alignment search, which did not pair: it returned each chain's own alignment. It now pairs rows by species, so ESMFold-2, OpenDDE and OpenDDE Antibody-Antigen also get a real paired alignment for a complex, and their answers for complexes can differ from before.
2026-10-05: full confidence matrices from every model¶
write_pae: trueworks on every prediction model. ESMFold-2, ESMFold-2 Fast, OpenFold3, OpenBind-0, RoseTTAFold3 and AF2-IG used to refuse it; they now return<name>_pae.npzlike Boltz-2 and OpenDDE.- The npz carries more arrays, and the old ones are unchanged. Beside
pae, the file now holdspdewhere the model has a PDE head (all but AF2-IG) andcontact_probswithcontact_cutoff_Afrom the model's distogram (all of them). A client readingnp.load(f)["pae"]gets the same matrix as before. Each file has a sidecar<name>_pae.json, listed among the artifacts as typepae_sidecar, that names every array and says why any is missing.GET /v1/modelslists each model's arrays underconfidence. See Confidence outputs. - ESMFold-2 results rows carry
iptmandpair_chains_iptmfor a multi-chain input. - The workbench shows them. A finished prediction that asked for
write_paelists the file under its structure, with each array's shape and units, and downloads it.
2026-10-02: Protenix-v2 is withheld¶
- A new
protenix-v2job is refused with a 400 whosedetailsays why: the licence for its weights is an open question with their rights holder. Jobs submitted before the change run to completion and stay readable, and nothing already charged changes.GET /v1/models, the workbench and the API reference no longer list it. For the same inputs (multi-chain complexes, RNA/DNA, ligands, with an MSA) useboltz2.
2026-09-27: notes leaves the model list¶
GET /v1/modelsno longer returnsnotes, andGET /v1/catalogno longer returnscaps_note. Both carried one sentence about the size bounds. The bounds themselves are unchanged and still machine-readable: each model'smax_residues, andlimitsfor the rest. An input over a bound is refused with an error that names it, as before. See Models and limits.
2026-09-25: reproducible BoltzGen designs¶
- BoltzGen takes a
seed. Send the same spec with the sameseedand you get the same ranked designs back, sequences, metrics and structure files. Leave it out and every run draws fresh designs, as before, so resubmitting a spec to get more candidates still works. RFdiffusion3 and PXDesign already had a seed and are unchanged. The CLI takes it asjapanfold design --seed N. - A new Galaxy downloads BoltzGen's weights once. When several parts of one design started together on a Galaxy with no weights yet, each downloaded the same checkpoint and one part could fail. They now wait for the first download.
- Nothing else you get back changes. Boltz-2, ESMFold-2, AF2-IG and ESMC 6B return the same bytes as before on the same input and seed.
2026-09-24: AF2-IG, and OpenDDE to 1536¶
- A new model,
af2ig. AlphaFold2 initial-guess: give it a designed complex (a structure carrying the target chain and the binder backbone, plus the binder's sequence) and it returns pLDDT, pTM, ipTM, pAE and interface pAE for that interface. It is the filter a binder-design pipeline uses to tell a real design from a plausible one, soPOST /v1/designsthenaf2igis the route it was added for. No alignment and no sampling: the same input gives the same answer. See Predictions. - A parameter we do not have is now an error, not a shrug. A
paramskey that is not inGET /v1/catalogused to be accepted and echoed back on the job while nothing read it, so a request could look honoured when it was not. It now comes back400naming the key and listing the ones that exist. - Both OpenDDE checkpoints now take 1,536 residues, up from 1,024. The engine got faster at this size: a 1,536-residue complex with a deep alignment now folds in about an hour, inside the time a job is allowed to run, where it used to be killed near the end.
- A job above 1,024 residues waits longer before it is called stuck. The window a run may go without progress now grows with its size the way its runtime limit does: 10 minutes up to 1,024 residues, about 34 at 1,536. One step of a large fold is quiet for longer than 10 minutes, and such folds were stopped as stuck. Up to 1,024 residues nothing changes.
2026-09-24: engine update¶
- Larger structures. Every folding model except OpenDDE takes more residues
per structure: Boltz-2 1920, Protenix-v2 2048, ESMFold-2 and ESMFold-2 Fast
1664, OpenFold3 and OpenBind-0 1664, RoseTTAFold3 1600. RFdiffusion3 and
PXDesign design up to 1536.
GET /v1/modelspublishes eachmax_residues. A fold above 1024 residues runs for longer and costs more, by the rules in Models & limits. - Long folds finish. A structure that took more than 30 minutes on its chip was started again on another chip and never returned; the job ran until it was killed. It now finishes where it started.
- ESMFold-2 Fast no longer runs out of memory near 1000 residues. A job of ten targets at 950 to 1000 residues could fail with "Ran out of device memory while folding". Ten targets at 1024 now fold.
- The PAE matrix is listed. With
write_pae: true, a Boltz-2, Protenix-v2 or OpenDDE job's results now list<name>_pae.npzamong its artifacts (typepae). Before, the file was stored but missing from the list. - OpenDDE stays at 1024. It folds larger complexes, but a 1536-residue fold takes longer than a job is allowed to run, so it would be killed near the end.
msa: emptynow means single-sequence. A chain markedmsa: emptywas sent to the MSA search like any other chain. It now folds without an alignment, which is what the field asks for. The structure you get for such a chain changes.- Alignment depth follows the reference models. Protenix-v2, OpenDDE,
OpenFold3 and OpenBind-0 read at most 16384 alignment rows, paired rows first,
as their reference implementations do. Before, they read the whole alignment.
Each result reports the depth it used as
msa_depth. - ESMC 6B embeddings fixed at some lengths. An
esmc-6bembedding whose token count was a multiple of 32 came back wrong (correlation 0.34 with the reference at 126 residues). It now matches the reference (0.9989 or better). If you storedesmc-6bvectors, re-embed the ones at those lengths. - Same seed, slightly different structure. The engine changed underneath every model, so a request repeated with the same seed returns a structure that differs by a fraction of an Angstrom from the one it returned before. How far, per model, is in Accuracy.