{
  "openapi": "3.1.0",
  "info": {
    "title": "Athanor Bio Tools API",
    "version": "1.0.0",
    "description": "One pair of endpoints per tool. A POST queues a job and returns immediately; the job is polled for its result."
  },
  "servers": [
    {
      "url": "https://www.athanortools.com"
    }
  ],
  "paths": {
    "/api/rdkit/": {
      "get": {
        "summary": "RDKit field schema",
        "description": "Calculate common molecular descriptors and normalize SMILES.",
        "operationId": "rdkit_schema",
        "tags": [
          "RDKit"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a RDKit job",
        "description": "Calculate common molecular descriptors and normalize SMILES. A lightweight, immediately runnable cheminformatics endpoint.",
        "operationId": "rdkit_submit",
        "tags": [
          "RDKit"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "One of the field's option values.",
                    "enum": [
                      "descriptors",
                      "canonicalize"
                    ],
                    "default": "descriptors"
                  },
                  "smiles": {
                    "type": "string",
                    "title": "SMILES",
                    "description": "One molecule in SMILES notation; the example is aspirin. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O"
                  },
                  "include_inchi": {
                    "type": "boolean",
                    "title": "Include InChI",
                    "description": "Include InChI and InChIKey when the RDKit build supports them. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  }
                },
                "required": [
                  "smiles"
                ],
                "example": {
                  "operation": "descriptors",
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O",
                  "include_inchi": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "One of the field's option values.",
                    "enum": [
                      "descriptors",
                      "canonicalize"
                    ],
                    "default": "descriptors"
                  },
                  "smiles": {
                    "type": "string",
                    "title": "SMILES",
                    "description": "One molecule in SMILES notation; the example is aspirin. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O"
                  },
                  "include_inchi": {
                    "type": "boolean",
                    "title": "Include InChI",
                    "description": "Include InChI and InChIKey when the RDKit build supports them. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  }
                },
                "required": [
                  "smiles"
                ],
                "example": {
                  "operation": "descriptors",
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O",
                  "include_inchi": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/opendde/": {
      "get": {
        "summary": "OpenDDE field schema",
        "description": "Run a protein, DNA/RNA, or ligand co-folding prediction.",
        "operationId": "opendde_schema",
        "tags": [
          "OpenDDE"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a OpenDDE job",
        "description": "Run a protein, DNA/RNA, or ligand co-folding prediction. Predict protein structure from nucleic acid or amino acid sequence. Predict the structure of ligands, nucleic acids, and ions, or complexes of these molecules. This is a relatively new, but very accurate model.",
        "operationId": "opendde_submit",
        "tags": [
          "OpenDDE"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "opendde-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, Ligand, DNA, or RNA. Ligands take a SMILES string or a CCD_ code (e.g. CCD_ATP). A modification applies a CCD residue code at a given position; \"Cyclic\" bonds the chain's first and last residue. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"ACDEFGHIK\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "ACDEFGHIK"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"ACDEFGHIK\"}]"
                  },
                  "ligands_list": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand SMILES per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "ligands_molecules": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand SMILES per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "bonds": {
                    "type": "string",
                    "title": "Covalent bonds (optional)",
                    "description": "JSON list of covalent bonds between the chains above, e.g. [{\"atom1Chain\":\"A\",\"atom1Idx\":\"32\",\"atom1Atom\":\"C\",\"atom2Chain\":\"B\",\"atom2Idx\":\"1\",\"atom2Atom\":\"N\"}]. Chains are lettered A, B, C... in the order entered: protein chains first, then DNA, then RNA, then ligands. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "seeds": {
                    "type": "string",
                    "title": "Model seeds",
                    "description": "Comma-separated seeds, e.g. \"101,102\"; each produces an independent set of samples. A single line of text.",
                    "default": "101"
                  },
                  "samples": {
                    "type": "number",
                    "title": "Samples per seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "cycles": {
                    "type": "number",
                    "title": "Recycling cycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 10
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use physics-aware guidance",
                    "description": "Training-free guidance for improved ligand plausibility; increases compute time. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "opendde-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"ACDEFGHIK\", \"cyclic\": false, \"modifications\": []}]",
                  "bonds": "",
                  "seeds": "101",
                  "samples": 1,
                  "steps": 200,
                  "cycles": 10,
                  "use_guidance": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "opendde-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, Ligand, DNA, or RNA. Ligands take a SMILES string or a CCD_ code (e.g. CCD_ATP). A modification applies a CCD residue code at a given position; \"Cyclic\" bonds the chain's first and last residue. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"ACDEFGHIK\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "ACDEFGHIK"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"ACDEFGHIK\"}]"
                  },
                  "ligands_list": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand SMILES per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "ligands_molecules": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand SMILES per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "bonds": {
                    "type": "string",
                    "title": "Covalent bonds (optional)",
                    "description": "JSON list of covalent bonds between the chains above, e.g. [{\"atom1Chain\":\"A\",\"atom1Idx\":\"32\",\"atom1Atom\":\"C\",\"atom2Chain\":\"B\",\"atom2Idx\":\"1\",\"atom2Atom\":\"N\"}]. Chains are lettered A, B, C... in the order entered: protein chains first, then DNA, then RNA, then ligands. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "seeds": {
                    "type": "string",
                    "title": "Model seeds",
                    "description": "Comma-separated seeds, e.g. \"101,102\"; each produces an independent set of samples. A single line of text.",
                    "default": "101"
                  },
                  "samples": {
                    "type": "number",
                    "title": "Samples per seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "cycles": {
                    "type": "number",
                    "title": "Recycling cycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 10
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use physics-aware guidance",
                    "description": "Training-free guidance for improved ligand plausibility; increases compute time. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "opendde-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"ACDEFGHIK\", \"cyclic\": false, \"modifications\": []}]",
                  "bonds": "",
                  "seeds": "101",
                  "samples": 1,
                  "steps": 200,
                  "cycles": 10,
                  "use_guidance": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/boltz2/": {
      "get": {
        "summary": "Boltz-2 field schema",
        "description": "Predict a biomolecular complex and optional ligand affinity.",
        "operationId": "boltz2_schema",
        "tags": [
          "Boltz-2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Boltz-2 job",
        "description": "Predict a biomolecular complex and optional ligand affinity. Builds the preferred Boltz YAML input and invokes the official boltz CLI. Runs single-sequence by default: no MSA server is contacted unless explicitly enabled.",
        "operationId": "boltz2_submit",
        "tags": [
          "Boltz-2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "boltz2-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, Ligand, DNA, or RNA. Ligands take a SMILES string or a CCD_ code (e.g. CCD_ATP). A modification applies a CCD residue code at a given position; \"Cyclic\" marks the chain cyclic. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\"}]"
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Design specification (YAML)",
                    "description": "A complete Boltz YAML input, used as-is (ligands, bonds, restraints, templates below are ignored for this task). Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "version: 1\nsequences:\n  - protein:\n      id: A\n      sequence: MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\n      msa: empty\n"
                  },
                  "ligands": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand per line: a SMILES string, or CCD_<code> for a CCD component. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "affinity": {
                    "type": "boolean",
                    "title": "Predict affinity of the first ligand",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "cyclic": {
                    "type": "boolean",
                    "title": "Treat protein chains as cyclic",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Opt in to a network call to ColabFold's MMseqs2 server for better accuracy. Off by default keeps the run local (single-sequence mode). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_potentials": {
                    "type": "boolean",
                    "title": "Use inference-time potentials",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "recycling_steps": {
                    "type": "number",
                    "title": "Recycling steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "sampling_steps": {
                    "type": "number",
                    "title": "Diffusion sampling steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 1000,
                    "default": 200
                  },
                  "diffusion_samples": {
                    "type": "number",
                    "title": "Diffusion samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 1
                  },
                  "step_scale": {
                    "type": "number",
                    "title": "Step scale (optional)",
                    "description": "Diffusion temperature; lower increases diversity. Leave at 0 for Boltz's own default (~1.5). A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 5,
                    "default": 0
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "output_format": {
                    "type": "string",
                    "title": "Output format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "mmcif",
                      "pdb"
                    ],
                    "default": "mmcif"
                  },
                  "bonds": {
                    "type": "string",
                    "title": "Covalent bonds (optional)",
                    "description": "JSON list, e.g. [{\"atom1Chain\":\"A\",\"atom1Idx\":32,\"atom1Atom\":\"C\",\"atom2Chain\":\"B\",\"atom2Idx\":1,\"atom2Atom\":\"N\"}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraints (optional)",
                    "description": "JSON list, e.g. [{\"binderChain\":\"A\",\"pocketChain\":\"B\",\"pocketContacts\":\"5 6 7\",\"maxDistance\":6,\"force\":false}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\",\"res_idxB\":1,\"max_distance_angstrom\":5,\"force\":false}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "modifications": {
                    "type": "string",
                    "title": "Residue modifications (optional)",
                    "description": "JSON list, e.g. [{\"chain\":\"A\",\"ptmPosition\":15,\"ptmResidue\":\"SEP\"}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "template_cif": {
                    "type": "string",
                    "title": "Template structure (mmCIF, optional)",
                    "description": "Uploaded mmCIF file used to template the prediction. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "template_chain_ids": {
                    "type": "string",
                    "title": "Template applies to chains (optional)",
                    "description": "Comma-separated chain letters from above; blank matches automatically. A single line of text."
                  },
                  "template_ids": {
                    "type": "string",
                    "title": "Template chain IDs (optional)",
                    "description": "Comma-separated chain IDs inside the template mmCIF, aligned with the chains above. A single line of text."
                  },
                  "template_threshold": {
                    "type": "number",
                    "title": "Template distance threshold, angstrom (optional)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 0
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules",
                      "yaml"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "boltz2-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\", \"cyclic\": false, \"modifications\": []}]",
                  "affinity": true,
                  "use_msa_server": false,
                  "use_potentials": false,
                  "recycling_steps": 3,
                  "sampling_steps": 200,
                  "diffusion_samples": 1,
                  "step_scale": 0,
                  "seed": 0,
                  "output_format": "mmcif",
                  "bonds": "",
                  "pocket_restraints": "",
                  "contact_restraints": "",
                  "template_cif": "",
                  "template_chain_ids": "",
                  "template_ids": "",
                  "template_threshold": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "boltz2-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, Ligand, DNA, or RNA. Ligands take a SMILES string or a CCD_ code (e.g. CCD_ATP). A modification applies a CCD residue code at a given position; \"Cyclic\" marks the chain cyclic. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\"}]"
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Design specification (YAML)",
                    "description": "A complete Boltz YAML input, used as-is (ligands, bonds, restraints, templates below are ignored for this task). Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "version: 1\nsequences:\n  - protein:\n      id: A\n      sequence: MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\n      msa: empty\n"
                  },
                  "ligands": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand per line: a SMILES string, or CCD_<code> for a CCD component. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "affinity": {
                    "type": "boolean",
                    "title": "Predict affinity of the first ligand",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "cyclic": {
                    "type": "boolean",
                    "title": "Treat protein chains as cyclic",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Opt in to a network call to ColabFold's MMseqs2 server for better accuracy. Off by default keeps the run local (single-sequence mode). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_potentials": {
                    "type": "boolean",
                    "title": "Use inference-time potentials",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "recycling_steps": {
                    "type": "number",
                    "title": "Recycling steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "sampling_steps": {
                    "type": "number",
                    "title": "Diffusion sampling steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 1000,
                    "default": 200
                  },
                  "diffusion_samples": {
                    "type": "number",
                    "title": "Diffusion samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 1
                  },
                  "step_scale": {
                    "type": "number",
                    "title": "Step scale (optional)",
                    "description": "Diffusion temperature; lower increases diversity. Leave at 0 for Boltz's own default (~1.5). A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 5,
                    "default": 0
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "output_format": {
                    "type": "string",
                    "title": "Output format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "mmcif",
                      "pdb"
                    ],
                    "default": "mmcif"
                  },
                  "bonds": {
                    "type": "string",
                    "title": "Covalent bonds (optional)",
                    "description": "JSON list, e.g. [{\"atom1Chain\":\"A\",\"atom1Idx\":32,\"atom1Atom\":\"C\",\"atom2Chain\":\"B\",\"atom2Idx\":1,\"atom2Atom\":\"N\"}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraints (optional)",
                    "description": "JSON list, e.g. [{\"binderChain\":\"A\",\"pocketChain\":\"B\",\"pocketContacts\":\"5 6 7\",\"maxDistance\":6,\"force\":false}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\",\"res_idxB\":1,\"max_distance_angstrom\":5,\"force\":false}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "modifications": {
                    "type": "string",
                    "title": "Residue modifications (optional)",
                    "description": "JSON list, e.g. [{\"chain\":\"A\",\"ptmPosition\":15,\"ptmResidue\":\"SEP\"}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "template_cif": {
                    "type": "string",
                    "title": "Template structure (mmCIF, optional)",
                    "description": "Uploaded mmCIF file used to template the prediction. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "template_chain_ids": {
                    "type": "string",
                    "title": "Template applies to chains (optional)",
                    "description": "Comma-separated chain letters from above; blank matches automatically. A single line of text."
                  },
                  "template_ids": {
                    "type": "string",
                    "title": "Template chain IDs (optional)",
                    "description": "Comma-separated chain IDs inside the template mmCIF, aligned with the chains above. A single line of text."
                  },
                  "template_threshold": {
                    "type": "number",
                    "title": "Template distance threshold, angstrom (optional)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 0
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules",
                      "yaml"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "boltz2-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP\", \"cyclic\": false, \"modifications\": []}]",
                  "affinity": true,
                  "use_msa_server": false,
                  "use_potentials": false,
                  "recycling_steps": 3,
                  "sampling_steps": 200,
                  "diffusion_samples": 1,
                  "step_scale": 0,
                  "seed": 0,
                  "output_format": "mmcif",
                  "bonds": "",
                  "pocket_restraints": "",
                  "contact_restraints": "",
                  "template_cif": "",
                  "template_chain_ids": "",
                  "template_ids": "",
                  "template_threshold": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/chai1/": {
      "get": {
        "summary": "Chai-1 field schema",
        "description": "Predict protein or protein-ligand complex structures with Chai-1.",
        "operationId": "chai1_schema",
        "tags": [
          "Chai-1"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Chai-1 job",
        "description": "Predict protein or protein-ligand complex structures with Chai-1. Builds Chai's typed FASTA input and runs the official chai-lab folding CLI.",
        "operationId": "chai1_submit",
        "tags": [
          "Chai-1"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "chai1-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, Ligand, DNA, or RNA. Ligands take a SMILES string (Chai-1 does not accept CCD codes). A modification applies a CCD residue code at a given position. Chai-1 does not support cyclic chains. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSTNPKPQRKTKRNTNRRPQDVKFPGG"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\"}]"
                  },
                  "ligands": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand SMILES per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Opt in to a network call to ColabFold's MMseqs2 server for better accuracy. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_templates_server": {
                    "type": "boolean",
                    "title": "Use the public pdb100 template server",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\"}] (any residue on chainB near residue res_idxA on chainA). Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\",\"res_idxB\":1}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "covalent_restraints": {
                    "type": "string",
                    "title": "Covalent restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"covalentAtomA\":\"C\",\"chainB\":\"B\",\"res_idxB\":1,\"covalentAtomB\":\"C\"}]. Chai-1 was not trained on intra-chain bonds; use inter-chain pairs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "restraints_min_distance": {
                    "type": "number",
                    "title": "Restraints minimum distance, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 0
                  },
                  "restraints_max_distance": {
                    "type": "number",
                    "title": "Restraints maximum distance, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 5
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Diffusion samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 25,
                    "default": 5
                  },
                  "num_trunk_samples": {
                    "type": "number",
                    "title": "Trunk samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 1
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "num_diffn_timesteps": {
                    "type": "number",
                    "title": "Diffusion timesteps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 1000,
                    "default": 200
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "chai1-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "use_msa_server": false,
                  "use_templates_server": false,
                  "pocket_restraints": "",
                  "contact_restraints": "",
                  "covalent_restraints": "",
                  "restraints_min_distance": 0,
                  "restraints_max_distance": 5,
                  "num_samples": 5,
                  "num_trunk_samples": 1,
                  "num_recycles": 3,
                  "num_diffn_timesteps": 200,
                  "seed": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "chai1-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, Ligand, DNA, or RNA. Ligands take a SMILES string (Chai-1 does not accept CCD codes). A modification applies a CCD residue code at a given position. Chai-1 does not support cyclic chains. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSTNPKPQRKTKRNTNRRPQDVKFPGG"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\"}]"
                  },
                  "ligands": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand SMILES per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Opt in to a network call to ColabFold's MMseqs2 server for better accuracy. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_templates_server": {
                    "type": "boolean",
                    "title": "Use the public pdb100 template server",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\"}] (any residue on chainB near residue res_idxA on chainA). Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\",\"res_idxB\":1}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "covalent_restraints": {
                    "type": "string",
                    "title": "Covalent restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"covalentAtomA\":\"C\",\"chainB\":\"B\",\"res_idxB\":1,\"covalentAtomB\":\"C\"}]. Chai-1 was not trained on intra-chain bonds; use inter-chain pairs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "restraints_min_distance": {
                    "type": "number",
                    "title": "Restraints minimum distance, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 0
                  },
                  "restraints_max_distance": {
                    "type": "number",
                    "title": "Restraints maximum distance, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 5
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Diffusion samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 25,
                    "default": 5
                  },
                  "num_trunk_samples": {
                    "type": "number",
                    "title": "Trunk samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 1
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "num_diffn_timesteps": {
                    "type": "number",
                    "title": "Diffusion timesteps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 1000,
                    "default": 200
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "chai1-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "use_msa_server": false,
                  "use_templates_server": false,
                  "pocket_restraints": "",
                  "contact_restraints": "",
                  "covalent_restraints": "",
                  "restraints_min_distance": 0,
                  "restraints_max_distance": 5,
                  "num_samples": 5,
                  "num_trunk_samples": 1,
                  "num_recycles": 3,
                  "num_diffn_timesteps": 200,
                  "seed": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/protenix/": {
      "get": {
        "summary": "Protenix-v2 field schema",
        "description": "Predict protein or protein-ligand complex structures with Protenix.",
        "operationId": "protenix_schema",
        "tags": [
          "Protenix-v2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Protenix-v2 job",
        "description": "Predict protein or protein-ligand complex structures with Protenix. Builds Protenix's AlphaFold3-style JSON input and runs the official `protenix pred` CLI, with MSA and PDB template search off by default.",
        "operationId": "protenix_submit",
        "tags": [
          "Protenix-v2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "protenix-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, DNA, RNA, Ligand, or Ion. Ligands take a SMILES string or a CCD_ code (e.g. CCD_ATP); ions take a CCD ion code (e.g. NA, MG, ZN). A modification applies a CCD residue code at a given position; \"Cyclic\" bonds the chain's first and last residue. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSTNPKPQRKTKRNTNRRPQDVKFPGG"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\"}]"
                  },
                  "ligands": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand per line: a CCD code such as CCD_ATP, or a SMILES string. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "model": {
                    "type": "string",
                    "title": "Model",
                    "description": "Use protenix_base_constraint_v0.5.0 for pocket/contact restraints to have any effect on the prediction. One of the field's option values.",
                    "enum": [
                      "protenix-v2",
                      "protenix_base_20250630_v1.0.0",
                      "protenix_base_constraint_v0.5.0",
                      "protenix_base_default_v0.5.0",
                      "protenix_base_default_v1.0.0"
                    ],
                    "default": "protenix-v2"
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 25,
                    "default": 5
                  },
                  "num_seeds": {
                    "type": "number",
                    "title": "Consecutive seeds",
                    "description": "Runs this many seeds (MSA computed once); total predictions = seeds x samples. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Starting random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 101
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 10
                  },
                  "diffusion_steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 500,
                    "default": 200
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Opt in to a network call for better accuracy; off keeps the run local. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_template": {
                    "type": "boolean",
                    "title": "Search PDB for templates",
                    "description": "Network search; only supported by protenix-v2 and the v1.0.0 base models. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_rna_msa": {
                    "type": "boolean",
                    "title": "Use RNA MSA search",
                    "description": "Network search; only supported by protenix-v2 and the v1.0.0 base models. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use physics-aware guidance",
                    "description": "Training-free guidance for improved ligand plausibility (chirality, planarity, stereochemistry); increases compute time. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "bonds": {
                    "type": "string",
                    "title": "Covalent bonds (optional)",
                    "description": "JSON list, e.g. [{\"atom1Chain\":\"A\",\"atom1Idx\":32,\"atom1Atom\":\"C\",\"atom2Chain\":\"B\",\"atom2Idx\":1,\"atom2Atom\":\"N\"}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraint (optional)",
                    "description": "At most one, as a JSON list, e.g. [{\"binderChain\":\"A\",\"pocketChain\":\"B\",\"pocketContacts\":\"5 6 7\",\"maxDistance\":6}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\",\"res_idxB\":1,\"max_distance_angstrom\":6,\"min_distance_angstrom\":3}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "protenix-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "model": "protenix-v2",
                  "num_samples": 5,
                  "num_seeds": 1,
                  "seed": 101,
                  "num_recycles": 10,
                  "diffusion_steps": 200,
                  "use_msa_server": false,
                  "use_template": false,
                  "use_rna_msa": false,
                  "use_guidance": false,
                  "bonds": "",
                  "pocket_restraints": "",
                  "contact_restraints": ""
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "protenix-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per chain: Protein, DNA, RNA, Ligand, or Ion. Ligands take a SMILES string or a CCD_ code (e.g. CCD_ATP); ions take a CCD ion code (e.g. NA, MG, ZN). A modification applies a CCD residue code at a given position; \"Cyclic\" bonds the chain's first and last residue. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "proteins": {
                    "type": "string",
                    "title": "Protein chains",
                    "description": "One protein chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSTNPKPQRKTKRNTNRRPQDVKFPGG"
                  },
                  "dnas": {
                    "type": "string",
                    "title": "DNA chains (optional)",
                    "description": "One DNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "rnas": {
                    "type": "string",
                    "title": "RNA chains (optional)",
                    "description": "One RNA chain sequence per line. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "JSON list of {\"type\": \"protein\"|\"dna\"|\"rna\", \"chain\": \"A\", \"sequence\": \"...\"}. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"type\": \"protein\", \"chain\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\"}]"
                  },
                  "ligands": {
                    "type": "string",
                    "title": "Ligands (optional)",
                    "description": "One ligand per line: a CCD code such as CCD_ATP, or a SMILES string. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "model": {
                    "type": "string",
                    "title": "Model",
                    "description": "Use protenix_base_constraint_v0.5.0 for pocket/contact restraints to have any effect on the prediction. One of the field's option values.",
                    "enum": [
                      "protenix-v2",
                      "protenix_base_20250630_v1.0.0",
                      "protenix_base_constraint_v0.5.0",
                      "protenix_base_default_v0.5.0",
                      "protenix_base_default_v1.0.0"
                    ],
                    "default": "protenix-v2"
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 25,
                    "default": 5
                  },
                  "num_seeds": {
                    "type": "number",
                    "title": "Consecutive seeds",
                    "description": "Runs this many seeds (MSA computed once); total predictions = seeds x samples. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Starting random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 101
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 10
                  },
                  "diffusion_steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 500,
                    "default": 200
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Opt in to a network call for better accuracy; off keeps the run local. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_template": {
                    "type": "boolean",
                    "title": "Search PDB for templates",
                    "description": "Network search; only supported by protenix-v2 and the v1.0.0 base models. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_rna_msa": {
                    "type": "boolean",
                    "title": "Use RNA MSA search",
                    "description": "Network search; only supported by protenix-v2 and the v1.0.0 base models. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use physics-aware guidance",
                    "description": "Training-free guidance for improved ligand plausibility (chirality, planarity, stereochemistry); increases compute time. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "bonds": {
                    "type": "string",
                    "title": "Covalent bonds (optional)",
                    "description": "JSON list, e.g. [{\"atom1Chain\":\"A\",\"atom1Idx\":32,\"atom1Atom\":\"C\",\"atom2Chain\":\"B\",\"atom2Idx\":1,\"atom2Atom\":\"N\"}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraint (optional)",
                    "description": "At most one, as a JSON list, e.g. [{\"binderChain\":\"A\",\"pocketChain\":\"B\",\"pocketContacts\":\"5 6 7\",\"maxDistance\":6}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (optional)",
                    "description": "JSON list, e.g. [{\"chainA\":\"A\",\"res_idxA\":1,\"chainB\":\"B\",\"res_idxB\":1,\"max_distance_angstrom\":6,\"min_distance_angstrom\":3}]. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "sequence",
                      "list",
                      "molecules"
                    ],
                    "default": "sequence"
                  }
                },
                "required": [],
                "example": {
                  "task": "sequence",
                  "job_name": "protenix-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "model": "protenix-v2",
                  "num_samples": 5,
                  "num_seeds": 1,
                  "seed": 101,
                  "num_recycles": 10,
                  "diffusion_steps": 200,
                  "use_msa_server": false,
                  "use_template": false,
                  "use_rna_msa": false,
                  "use_guidance": false,
                  "bonds": "",
                  "pocket_restraints": "",
                  "contact_restraints": ""
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/esmfold2/": {
      "get": {
        "summary": "ESMFold 2 field schema",
        "description": "Fold a protein from its sequence alone, with no MSA or template search.",
        "operationId": "esmfold2_schema",
        "tags": [
          "ESMFold 2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ESMFold 2 job",
        "description": "Fold a protein from its sequence alone, with no MSA or template search. Writes a FASTA record and invokes the esm-fold CLI from fair-esm. Predictions are single-sequence, so no alignment or template database is consulted.",
        "operationId": "esmfold2_submit",
        "tags": [
          "ESMFold 2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "esmfold2-demo"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Protein sequence",
                    "description": "Join chains of a complex with a colon to fold them as one record. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "More recycles refine the prediction at a proportional runtime cost. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 48,
                    "default": 4
                  },
                  "max_tokens_per_batch": {
                    "type": "number",
                    "title": "Max tokens per batch",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 16384,
                    "default": 1024
                  },
                  "chunk_size": {
                    "type": "number",
                    "title": "Attention chunk size",
                    "description": "0 disables chunking; lower values trade speed for less memory. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 512,
                    "default": 0
                  },
                  "cpu_only": {
                    "type": "boolean",
                    "title": "CPU only",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "cpu_offload": {
                    "type": "boolean",
                    "title": "Offload parameters to CPU",
                    "description": "Keeps large sequences within GPU memory at the cost of speed. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  }
                },
                "required": [
                  "protein_sequence"
                ],
                "example": {
                  "job_name": "esmfold2-demo",
                  "protein_sequence": "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "num_recycles": 4,
                  "max_tokens_per_batch": 1024,
                  "chunk_size": 0,
                  "cpu_only": false,
                  "cpu_offload": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "esmfold2-demo"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Protein sequence",
                    "description": "Join chains of a complex with a colon to fold them as one record. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "More recycles refine the prediction at a proportional runtime cost. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 48,
                    "default": 4
                  },
                  "max_tokens_per_batch": {
                    "type": "number",
                    "title": "Max tokens per batch",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 16384,
                    "default": 1024
                  },
                  "chunk_size": {
                    "type": "number",
                    "title": "Attention chunk size",
                    "description": "0 disables chunking; lower values trade speed for less memory. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 512,
                    "default": 0
                  },
                  "cpu_only": {
                    "type": "boolean",
                    "title": "CPU only",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "cpu_offload": {
                    "type": "boolean",
                    "title": "Offload parameters to CPU",
                    "description": "Keeps large sequences within GPU memory at the cost of speed. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  }
                },
                "required": [
                  "protein_sequence"
                ],
                "example": {
                  "job_name": "esmfold2-demo",
                  "protein_sequence": "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "num_recycles": 4,
                  "max_tokens_per_batch": 1024,
                  "chunk_size": 0,
                  "cpu_only": false,
                  "cpu_offload": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/immunebuilder/": {
      "get": {
        "summary": "ImmuneBuilder field schema",
        "description": "Predict an antibody, nanobody, or TCR structure in seconds.",
        "operationId": "immunebuilder_schema",
        "tags": [
          "ImmuneBuilder"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ImmuneBuilder job",
        "description": "Predict an antibody, nanobody, or TCR structure in seconds. Runs ABodyBuilder2, NanoBodyBuilder2, or TCRBuilder2 on the supplied variable-domain sequences. These are single-sequence models with no MSA or template search, so a structure comes back in seconds rather than the minutes a general folding model needs.",
        "operationId": "immunebuilder_submit",
        "tags": [
          "ImmuneBuilder"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "immunebuilder-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Variable domain only; constant domains are not modelled. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "vhh_sequence": {
                    "type": "string",
                    "title": "VHH sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGRTFSYNPMGWFRQAPGKGRELVAAISRTGGSTYYPDSVEGRFTISRDNAKRMVYLQMNSLRAEDTAVYYCAAAGVRAEDGRVRTLPSEYTFWGQGTQVTVSS"
                  },
                  "alpha_sequence": {
                    "type": "string",
                    "title": "TCR alpha-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "QSVTQPDARVTVSEGASLQLRCKYSYSATPYLFWYVQYPRQGLQLLLKYYSGDPVVQGVNGFEAEFSKSNSSFHLRKASVHWSDSAVYFCAVRPTSGGSYIPTFGRGTSLIVHPY"
                  },
                  "beta_sequence": {
                    "type": "string",
                    "title": "TCR beta-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "NAGVTQTPKFQVLKTGQSMTLQCAQDMNHEYMSWYRQDPGMGLRLIHYSVGAGITDQGEVPNGYNVSRSTTEDFPLRLLSAAPSQTSVYFCASSYVGNTGELFFGEGSRLTVL"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "How the residues of the returned structure are numbered. One of the field's option values.",
                    "enum": [
                      "imgt",
                      "chothia",
                      "kabat",
                      "aho",
                      "martin",
                      "wolfguy",
                      "raw"
                    ],
                    "default": "imgt"
                  },
                  "n_threads": {
                    "type": "number",
                    "title": "CPU threads for refinement",
                    "description": "0 refines on the GPU; any other value forces OpenMM onto that many CPU threads. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 64,
                    "default": 0
                  },
                  "no_sidechain_bond_check": {
                    "type": "boolean",
                    "title": "Skip the strained-bond check",
                    "description": "Slightly faster, at the risk of an occasional unphysical side chain. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "original_weights": {
                    "type": "boolean",
                    "title": "Use the original TCRBuilder2 weights",
                    "description": "Off by default, which uses the newer TCRBuilder2+ weights. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "antibody",
                      "nanobody",
                      "tcr"
                    ],
                    "default": "antibody"
                  }
                },
                "required": [],
                "example": {
                  "task": "antibody",
                  "job_name": "immunebuilder-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "n_threads": 0,
                  "no_sidechain_bond_check": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "immunebuilder-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Variable domain only; constant domains are not modelled. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "vhh_sequence": {
                    "type": "string",
                    "title": "VHH sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGRTFSYNPMGWFRQAPGKGRELVAAISRTGGSTYYPDSVEGRFTISRDNAKRMVYLQMNSLRAEDTAVYYCAAAGVRAEDGRVRTLPSEYTFWGQGTQVTVSS"
                  },
                  "alpha_sequence": {
                    "type": "string",
                    "title": "TCR alpha-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "QSVTQPDARVTVSEGASLQLRCKYSYSATPYLFWYVQYPRQGLQLLLKYYSGDPVVQGVNGFEAEFSKSNSSFHLRKASVHWSDSAVYFCAVRPTSGGSYIPTFGRGTSLIVHPY"
                  },
                  "beta_sequence": {
                    "type": "string",
                    "title": "TCR beta-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "NAGVTQTPKFQVLKTGQSMTLQCAQDMNHEYMSWYRQDPGMGLRLIHYSVGAGITDQGEVPNGYNVSRSTTEDFPLRLLSAAPSQTSVYFCASSYVGNTGELFFGEGSRLTVL"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "How the residues of the returned structure are numbered. One of the field's option values.",
                    "enum": [
                      "imgt",
                      "chothia",
                      "kabat",
                      "aho",
                      "martin",
                      "wolfguy",
                      "raw"
                    ],
                    "default": "imgt"
                  },
                  "n_threads": {
                    "type": "number",
                    "title": "CPU threads for refinement",
                    "description": "0 refines on the GPU; any other value forces OpenMM onto that many CPU threads. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 64,
                    "default": 0
                  },
                  "no_sidechain_bond_check": {
                    "type": "boolean",
                    "title": "Skip the strained-bond check",
                    "description": "Slightly faster, at the risk of an occasional unphysical side chain. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "original_weights": {
                    "type": "boolean",
                    "title": "Use the original TCRBuilder2 weights",
                    "description": "Off by default, which uses the newer TCRBuilder2+ weights. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "antibody",
                      "nanobody",
                      "tcr"
                    ],
                    "default": "antibody"
                  }
                },
                "required": [],
                "example": {
                  "task": "antibody",
                  "job_name": "immunebuilder-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "n_threads": 0,
                  "no_sidechain_bond_check": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/highfold/": {
      "get": {
        "summary": "HighFold field schema",
        "description": "Predict the structure of a cyclic peptide or a cyclic-peptide complex.",
        "operationId": "highfold_schema",
        "tags": [
          "HighFold"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a HighFold job",
        "description": "Predict the structure of a cyclic peptide or a cyclic-peptide complex. Runs HighFold, which folds cyclic peptides by feeding AlphaFold 2 a cyclic position offset matrix in place of its usual relative positional encoding, so head-to-tail and disulfide-bridged macrocycles are modelled as closed rather than as linear chains whose ends happen to meet.",
        "operationId": "highfold_submit",
        "tags": [
          "HighFold"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "highfold-demo"
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence",
                    "description": "Join the chains of a complex with a colon; the first chain is the cyclic peptide. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "GNLWATGHFMGGSGSGSG"
                  },
                  "cyclic_constraint": {
                    "type": "string",
                    "title": "Cyclic constraint",
                    "description": "Which constraints the cyclic offset matrix is built from. One of the field's option values.",
                    "enum": [
                      "head_to_tail",
                      "disulfide",
                      "both",
                      "none"
                    ],
                    "default": "head_to_tail"
                  },
                  "disulfide_pairs": {
                    "type": "string",
                    "title": "Disulfide pairs (optional)",
                    "description": "Comma-separated 1-indexed cysteine pairs, for example 3-11,5-17. Inferred from the sequence when left empty. A single line of text."
                  },
                  "msa_mode": {
                    "type": "string",
                    "title": "MSA mode",
                    "description": "Short macrocycles have no useful alignment, so single-sequence is the usual choice. One of the field's option values.",
                    "enum": [
                      "single_sequence",
                      "mmseqs2_uniref_env",
                      "mmseqs2_uniref"
                    ],
                    "default": "single_sequence"
                  },
                  "num_models": {
                    "type": "number",
                    "title": "Models",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 5,
                    "default": 5
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 48,
                    "default": 3
                  },
                  "num_seeds": {
                    "type": "number",
                    "title": "Seeds per model",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "use_templates": {
                    "type": "boolean",
                    "title": "Use PDB templates",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "amber_relax": {
                    "type": "boolean",
                    "title": "Relax the top model with Amber",
                    "description": "Cleans up bond geometry at the cyclization point, at a few minutes of extra runtime. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  }
                },
                "required": [
                  "peptide_sequence"
                ],
                "example": {
                  "job_name": "highfold-demo",
                  "peptide_sequence": "GNLWATGHFMGGSGSGSG",
                  "cyclic_constraint": "head_to_tail",
                  "disulfide_pairs": "",
                  "msa_mode": "single_sequence",
                  "num_models": 5,
                  "num_recycles": 3,
                  "num_seeds": 1,
                  "seed": 0,
                  "use_templates": false,
                  "amber_relax": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "highfold-demo"
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence",
                    "description": "Join the chains of a complex with a colon; the first chain is the cyclic peptide. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "GNLWATGHFMGGSGSGSG"
                  },
                  "cyclic_constraint": {
                    "type": "string",
                    "title": "Cyclic constraint",
                    "description": "Which constraints the cyclic offset matrix is built from. One of the field's option values.",
                    "enum": [
                      "head_to_tail",
                      "disulfide",
                      "both",
                      "none"
                    ],
                    "default": "head_to_tail"
                  },
                  "disulfide_pairs": {
                    "type": "string",
                    "title": "Disulfide pairs (optional)",
                    "description": "Comma-separated 1-indexed cysteine pairs, for example 3-11,5-17. Inferred from the sequence when left empty. A single line of text."
                  },
                  "msa_mode": {
                    "type": "string",
                    "title": "MSA mode",
                    "description": "Short macrocycles have no useful alignment, so single-sequence is the usual choice. One of the field's option values.",
                    "enum": [
                      "single_sequence",
                      "mmseqs2_uniref_env",
                      "mmseqs2_uniref"
                    ],
                    "default": "single_sequence"
                  },
                  "num_models": {
                    "type": "number",
                    "title": "Models",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 5,
                    "default": 5
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 48,
                    "default": 3
                  },
                  "num_seeds": {
                    "type": "number",
                    "title": "Seeds per model",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "use_templates": {
                    "type": "boolean",
                    "title": "Use PDB templates",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "amber_relax": {
                    "type": "boolean",
                    "title": "Relax the top model with Amber",
                    "description": "Cleans up bond geometry at the cyclization point, at a few minutes of extra runtime. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  }
                },
                "required": [
                  "peptide_sequence"
                ],
                "example": {
                  "job_name": "highfold-demo",
                  "peptide_sequence": "GNLWATGHFMGGSGSGSG",
                  "cyclic_constraint": "head_to_tail",
                  "disulfide_pairs": "",
                  "msa_mode": "single_sequence",
                  "num_models": 5,
                  "num_recycles": 3,
                  "num_seeds": 1,
                  "seed": 0,
                  "use_templates": false,
                  "amber_relax": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/boltzgen/": {
      "get": {
        "summary": "BoltzGen field schema",
        "description": "Design a protein, peptide, nanobody, or antibody binder.",
        "operationId": "boltzgen_schema",
        "tags": [
          "BoltzGen"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a BoltzGen job",
        "description": "Design a protein, peptide, nanobody, or antibody binder. Builds a BoltzGen design specification YAML and runs the official boltzgen CLI end to end (design, inverse folding, and refolding).",
        "operationId": "boltzgen_submit",
        "tags": [
          "BoltzGen"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "boltzgen-demo"
                  },
                  "target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "Uploaded structure file for the binding target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "Comma-separated chain IDs to include from the target file; blank includes all. A single line of text."
                  },
                  "binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "One \"chain:residues\" per line, e.g. \"A:5..7,13\"; BoltzGen residue ranges use \"..\". A single line of text."
                  },
                  "not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "One \"chain:residues\" per line, residues the binder must not contact. A single line of text."
                  },
                  "binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "redesign_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "redesign_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "redesign_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "redesign_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "peptide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "Leave blank to design a free peptide with no target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "peptide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence pattern",
                    "description": "A fixed sequence, a length range like \"10..20\", or a mix using BoltzGen's pattern syntax. A single line of text.",
                    "default": "10..20"
                  },
                  "peptide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds (optional)",
                    "description": "JSON list, e.g. [{\"position1\": 2, \"position2\": 10}], 1-indexed into the peptide. Positions must land on a literal residue already written into the sequence pattern (e.g. a \"C\"), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "peptide_cyclic": {
                    "type": "boolean",
                    "title": "Cyclic backbone",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "peptide_chain_id": {
                    "type": "string",
                    "title": "Peptide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "cyclotide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "cyclotide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_sequence": {
                    "type": "string",
                    "title": "Cyclotide sequence pattern",
                    "description": "BoltzGen sequence pattern mixing fixed residues and design-length runs. A single line of text.",
                    "default": "3C8C6C5C3C1C2"
                  },
                  "cyclotide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds",
                    "description": "JSON list of 1-indexed {\"position1\", \"position2\"} pairs. Positions must land on a literal residue already written into the sequence pattern (e.g. one of its \"C\"s), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"position1\": 4, \"position2\": 26}, {\"position1\": 13, \"position2\": 30}, {\"position1\": 20, \"position2\": 32}]"
                  },
                  "cyclotide_chain_id": {
                    "type": "string",
                    "title": "Cyclotide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "target_ligand_format": {
                    "type": "string",
                    "title": "Target ligand format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "smiles",
                      "ccd"
                    ],
                    "default": "smiles"
                  },
                  "target_ligand": {
                    "type": "string",
                    "title": "Target ligand",
                    "description": "A single line of text.",
                    "default": "N[C@@H](Cc1ccc(O)cc1)C(=O)O"
                  },
                  "small_molecule_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "small_molecule_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "small_molecule_target_chain_id": {
                    "type": "string",
                    "title": "Target ligand chain ID",
                    "description": "A single line of text.",
                    "default": "L"
                  },
                  "small_molecule_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "nanobody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "nanobody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_framework_file": {
                    "type": "string",
                    "title": "Nanobody framework structure (PDB or mmCIF)",
                    "description": "A solved nanobody scaffold to graft new CDR loops onto. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "nanobody_framework_chain": {
                    "type": "string",
                    "title": "Framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "nanobody_cdr_regions": {
                    "type": "string",
                    "title": "CDR regions to redesign",
                    "description": "Residue ranges in the framework file, BoltzGen syntax (e.g. \"26..34,52..59,98..118\"). A single line of text.",
                    "default": "26..34,52..59,98..118"
                  },
                  "nanobody_cdr_exclude": {
                    "type": "string",
                    "title": "Framework residues to drop (optional)",
                    "description": "Residue ranges to strip from the template before redesign, e.g. to shorten a loop. A single line of text."
                  },
                  "nanobody_cdr_insertions": {
                    "type": "string",
                    "title": "Variable-length insertions (optional)",
                    "description": "JSON list, e.g. [{\"position\": 26, \"lengths\": \"1..5\"}], inserted at a framework residue. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "antibody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_framework_file": {
                    "type": "string",
                    "title": "Heavy-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "antibody_heavy_framework_chain": {
                    "type": "string",
                    "title": "Heavy framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "antibody_heavy_cdr_regions": {
                    "type": "string",
                    "title": "Heavy-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "26..32,52..57,99..110"
                  },
                  "antibody_heavy_cdr_exclude": {
                    "type": "string",
                    "title": "Heavy-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_cdr_insertions": {
                    "type": "string",
                    "title": "Heavy-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_light_framework_file": {
                    "type": "string",
                    "title": "Light-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "antibody_light_framework_chain": {
                    "type": "string",
                    "title": "Light framework chain ID",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "antibody_light_cdr_regions": {
                    "type": "string",
                    "title": "Light-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "24..34,50..56,89..97"
                  },
                  "antibody_light_cdr_exclude": {
                    "type": "string",
                    "title": "Light-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_light_cdr_insertions": {
                    "type": "string",
                    "title": "Light-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Design specification (YAML)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "entities:\n  - protein:\n      id: B\n      sequence: 60..100\n"
                  },
                  "yaml_protocol": {
                    "type": "string",
                    "title": "Protocol",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody-anything",
                      "nanobody-anything",
                      "peptide-anything",
                      "protein-anything",
                      "protein-redesign",
                      "protein-small_molecule"
                    ],
                    "default": "protein-anything"
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Intermediate designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "budget": {
                    "type": "number",
                    "title": "Final design budget",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "diffusion_batch_size": {
                    "type": "number",
                    "title": "Diffusion batch size (optional)",
                    "description": "Leave at 0 for BoltzGen's own default. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids from inverse folding (optional)",
                    "description": "One-letter amino-acid codes to avoid when designing sequences. A single line of text."
                  },
                  "skip_refolding": {
                    "type": "boolean",
                    "title": "Skip refolding and confidence filtering",
                    "description": "Stops after design and inverse folding; faster, but skips BoltzGen's own quality filtering. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "protein",
                      "peptide",
                      "cyclotide",
                      "small_molecule",
                      "nanobody",
                      "antibody",
                      "redesign",
                      "yaml"
                    ],
                    "default": "protein"
                  }
                },
                "required": [],
                "example": {
                  "task": "protein",
                  "job_name": "boltzgen-demo",
                  "target_file": "",
                  "target_chains": "",
                  "binding_site": "",
                  "not_binding_site": "",
                  "binder_chain_id": "Z",
                  "minimum_length": 60,
                  "maximum_length": 100,
                  "num_designs": 10,
                  "budget": 1,
                  "diffusion_batch_size": 0,
                  "omit_amino_acids": "",
                  "skip_refolding": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "boltzgen-demo"
                  },
                  "target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "Uploaded structure file for the binding target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "Comma-separated chain IDs to include from the target file; blank includes all. A single line of text."
                  },
                  "binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "One \"chain:residues\" per line, e.g. \"A:5..7,13\"; BoltzGen residue ranges use \"..\". A single line of text."
                  },
                  "not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "One \"chain:residues\" per line, residues the binder must not contact. A single line of text."
                  },
                  "binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "redesign_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "redesign_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "redesign_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "redesign_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "peptide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "Leave blank to design a free peptide with no target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "peptide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence pattern",
                    "description": "A fixed sequence, a length range like \"10..20\", or a mix using BoltzGen's pattern syntax. A single line of text.",
                    "default": "10..20"
                  },
                  "peptide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds (optional)",
                    "description": "JSON list, e.g. [{\"position1\": 2, \"position2\": 10}], 1-indexed into the peptide. Positions must land on a literal residue already written into the sequence pattern (e.g. a \"C\"), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "peptide_cyclic": {
                    "type": "boolean",
                    "title": "Cyclic backbone",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "peptide_chain_id": {
                    "type": "string",
                    "title": "Peptide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "cyclotide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "cyclotide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_sequence": {
                    "type": "string",
                    "title": "Cyclotide sequence pattern",
                    "description": "BoltzGen sequence pattern mixing fixed residues and design-length runs. A single line of text.",
                    "default": "3C8C6C5C3C1C2"
                  },
                  "cyclotide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds",
                    "description": "JSON list of 1-indexed {\"position1\", \"position2\"} pairs. Positions must land on a literal residue already written into the sequence pattern (e.g. one of its \"C\"s), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"position1\": 4, \"position2\": 26}, {\"position1\": 13, \"position2\": 30}, {\"position1\": 20, \"position2\": 32}]"
                  },
                  "cyclotide_chain_id": {
                    "type": "string",
                    "title": "Cyclotide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "target_ligand_format": {
                    "type": "string",
                    "title": "Target ligand format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "smiles",
                      "ccd"
                    ],
                    "default": "smiles"
                  },
                  "target_ligand": {
                    "type": "string",
                    "title": "Target ligand",
                    "description": "A single line of text.",
                    "default": "N[C@@H](Cc1ccc(O)cc1)C(=O)O"
                  },
                  "small_molecule_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "small_molecule_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "small_molecule_target_chain_id": {
                    "type": "string",
                    "title": "Target ligand chain ID",
                    "description": "A single line of text.",
                    "default": "L"
                  },
                  "small_molecule_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "nanobody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "nanobody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_framework_file": {
                    "type": "string",
                    "title": "Nanobody framework structure (PDB or mmCIF)",
                    "description": "A solved nanobody scaffold to graft new CDR loops onto. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "nanobody_framework_chain": {
                    "type": "string",
                    "title": "Framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "nanobody_cdr_regions": {
                    "type": "string",
                    "title": "CDR regions to redesign",
                    "description": "Residue ranges in the framework file, BoltzGen syntax (e.g. \"26..34,52..59,98..118\"). A single line of text.",
                    "default": "26..34,52..59,98..118"
                  },
                  "nanobody_cdr_exclude": {
                    "type": "string",
                    "title": "Framework residues to drop (optional)",
                    "description": "Residue ranges to strip from the template before redesign, e.g. to shorten a loop. A single line of text."
                  },
                  "nanobody_cdr_insertions": {
                    "type": "string",
                    "title": "Variable-length insertions (optional)",
                    "description": "JSON list, e.g. [{\"position\": 26, \"lengths\": \"1..5\"}], inserted at a framework residue. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "antibody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_framework_file": {
                    "type": "string",
                    "title": "Heavy-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "antibody_heavy_framework_chain": {
                    "type": "string",
                    "title": "Heavy framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "antibody_heavy_cdr_regions": {
                    "type": "string",
                    "title": "Heavy-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "26..32,52..57,99..110"
                  },
                  "antibody_heavy_cdr_exclude": {
                    "type": "string",
                    "title": "Heavy-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_cdr_insertions": {
                    "type": "string",
                    "title": "Heavy-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_light_framework_file": {
                    "type": "string",
                    "title": "Light-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "antibody_light_framework_chain": {
                    "type": "string",
                    "title": "Light framework chain ID",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "antibody_light_cdr_regions": {
                    "type": "string",
                    "title": "Light-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "24..34,50..56,89..97"
                  },
                  "antibody_light_cdr_exclude": {
                    "type": "string",
                    "title": "Light-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_light_cdr_insertions": {
                    "type": "string",
                    "title": "Light-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Design specification (YAML)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "entities:\n  - protein:\n      id: B\n      sequence: 60..100\n"
                  },
                  "yaml_protocol": {
                    "type": "string",
                    "title": "Protocol",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody-anything",
                      "nanobody-anything",
                      "peptide-anything",
                      "protein-anything",
                      "protein-redesign",
                      "protein-small_molecule"
                    ],
                    "default": "protein-anything"
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Intermediate designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "budget": {
                    "type": "number",
                    "title": "Final design budget",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "diffusion_batch_size": {
                    "type": "number",
                    "title": "Diffusion batch size (optional)",
                    "description": "Leave at 0 for BoltzGen's own default. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids from inverse folding (optional)",
                    "description": "One-letter amino-acid codes to avoid when designing sequences. A single line of text."
                  },
                  "skip_refolding": {
                    "type": "boolean",
                    "title": "Skip refolding and confidence filtering",
                    "description": "Stops after design and inverse folding; faster, but skips BoltzGen's own quality filtering. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "protein",
                      "peptide",
                      "cyclotide",
                      "small_molecule",
                      "nanobody",
                      "antibody",
                      "redesign",
                      "yaml"
                    ],
                    "default": "protein"
                  }
                },
                "required": [],
                "example": {
                  "task": "protein",
                  "job_name": "boltzgen-demo",
                  "target_file": "",
                  "target_chains": "",
                  "binding_site": "",
                  "not_binding_site": "",
                  "binder_chain_id": "Z",
                  "minimum_length": 60,
                  "maximum_length": 100,
                  "num_designs": 10,
                  "budget": 1,
                  "diffusion_batch_size": 0,
                  "omit_amino_acids": "",
                  "skip_refolding": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/bindcraft/": {
      "get": {
        "summary": "BindCraft field schema",
        "description": "Design de novo protein or peptide binders against a target structure.",
        "operationId": "bindcraft_schema",
        "tags": [
          "BindCraft"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a BindCraft job",
        "description": "Design de novo protein or peptide binders against a target structure. Builds a BindCraft target/advanced/filter settings trio and runs the official pipeline end to end (hallucination, ProteinMPNN redesign, AlphaFold2 validation, and filtering).",
        "operationId": "bindcraft_submit",
        "tags": [
          "BindCraft"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "binder_name": {
                    "type": "string",
                    "title": "Binder name",
                    "description": "A single line of text.",
                    "default": "demo-binder"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TRIMMED TARGET PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chain IDs",
                    "description": "Comma-separated chain IDs. A single line of text.",
                    "default": "A"
                  },
                  "hotspot_residues": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "One \"chain: residues\" per line, e.g. \"A: 54,56,58\" or \"A: 1-10\". Leave blank to let AF2 pick a binding site. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "BindCraft's own default range is 65-150 for protein binders, 10-20 for peptides. A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 65
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "final_designs": {
                    "type": "number",
                    "title": "Accepted designs requested",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "filter_type": {
                    "type": "string",
                    "title": "Filter set",
                    "description": "One of the field's option values.",
                    "enum": [
                      "default",
                      "relaxed",
                      "no_filters",
                      "peptide",
                      "peptide_relaxed"
                    ],
                    "default": "default"
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes ProteinMPNN redesign must not sample. A single line of text.",
                    "default": "C"
                  },
                  "predict_bigbang": {
                    "type": "boolean",
                    "title": "Use BigBang initialization",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "weights_helicity": {
                    "type": "number",
                    "title": "Helicity weight",
                    "description": "Negative biases toward helical binders, positive toward non-helical, 0 is neutral. A number, within the range given for the field.",
                    "minimum": -5,
                    "maximum": 5,
                    "default": -0.3
                  },
                  "betasheet_advanced": {
                    "type": "boolean",
                    "title": "Bias toward beta-sheet designs",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mpnn_advanced": {
                    "type": "boolean",
                    "title": "Use ProteinMPNN-biased trajectory design",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "flexible_advanced": {
                    "type": "boolean",
                    "title": "Allow a flexible target interface",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hardtarget_advanced": {
                    "type": "boolean",
                    "title": "Treat the target as a hard (rigid) target",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "filter_plddt": {
                    "type": "number",
                    "title": "Average pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_ptm": {
                    "type": "number",
                    "title": "Average pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.55
                  },
                  "filter_iptm": {
                    "type": "number",
                    "title": "Average interface pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5
                  },
                  "filter_i_pae": {
                    "type": "number",
                    "title": "Average interface PAE threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_surface_hydrophobicity": {
                    "type": "number",
                    "title": "Average surface hydrophobicity threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_n_interface_residues": {
                    "type": "number",
                    "title": "Minimum interface residues",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 7
                  },
                  "filter_n_interface_hbonds": {
                    "type": "number",
                    "title": "Minimum interface H-bonds",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "filter_hotspot_rmsd": {
                    "type": "number",
                    "title": "Maximum hotspot RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 6
                  },
                  "filter_binder_plddt": {
                    "type": "number",
                    "title": "Average binder pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_binder_rmsd": {
                    "type": "number",
                    "title": "Maximum binder RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 3.5
                  },
                  "max_run_time": {
                    "type": "number",
                    "title": "Maximum run time, minutes",
                    "description": "Bounds this request's own subprocess; BindCraft itself has no built-in time limit. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1440,
                    "default": 16
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "default",
                      "peptide"
                    ],
                    "default": "default"
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "task": "default",
                  "binder_name": "demo-binder",
                  "target_pdb": "HEADER    PASTE A TRIMMED TARGET PDB HERE",
                  "target_chains": "A",
                  "hotspot_residues": "",
                  "minimum_length": 65,
                  "maximum_length": 150,
                  "final_designs": 1,
                  "filter_type": "default",
                  "omit_amino_acids": "C",
                  "predict_bigbang": false,
                  "weights_helicity": -0.3,
                  "betasheet_advanced": false,
                  "mpnn_advanced": false,
                  "flexible_advanced": false,
                  "hardtarget_advanced": false,
                  "filter_plddt": 0.8,
                  "filter_ptm": 0.55,
                  "filter_iptm": 0.5,
                  "filter_i_pae": 0.35,
                  "filter_surface_hydrophobicity": 0.35,
                  "filter_n_interface_residues": 7,
                  "filter_n_interface_hbonds": 3,
                  "filter_hotspot_rmsd": 6,
                  "filter_binder_plddt": 0.8,
                  "filter_binder_rmsd": 3.5,
                  "max_run_time": 16
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "binder_name": {
                    "type": "string",
                    "title": "Binder name",
                    "description": "A single line of text.",
                    "default": "demo-binder"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TRIMMED TARGET PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chain IDs",
                    "description": "Comma-separated chain IDs. A single line of text.",
                    "default": "A"
                  },
                  "hotspot_residues": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "One \"chain: residues\" per line, e.g. \"A: 54,56,58\" or \"A: 1-10\". Leave blank to let AF2 pick a binding site. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "BindCraft's own default range is 65-150 for protein binders, 10-20 for peptides. A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 65
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "final_designs": {
                    "type": "number",
                    "title": "Accepted designs requested",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "filter_type": {
                    "type": "string",
                    "title": "Filter set",
                    "description": "One of the field's option values.",
                    "enum": [
                      "default",
                      "relaxed",
                      "no_filters",
                      "peptide",
                      "peptide_relaxed"
                    ],
                    "default": "default"
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes ProteinMPNN redesign must not sample. A single line of text.",
                    "default": "C"
                  },
                  "predict_bigbang": {
                    "type": "boolean",
                    "title": "Use BigBang initialization",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "weights_helicity": {
                    "type": "number",
                    "title": "Helicity weight",
                    "description": "Negative biases toward helical binders, positive toward non-helical, 0 is neutral. A number, within the range given for the field.",
                    "minimum": -5,
                    "maximum": 5,
                    "default": -0.3
                  },
                  "betasheet_advanced": {
                    "type": "boolean",
                    "title": "Bias toward beta-sheet designs",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mpnn_advanced": {
                    "type": "boolean",
                    "title": "Use ProteinMPNN-biased trajectory design",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "flexible_advanced": {
                    "type": "boolean",
                    "title": "Allow a flexible target interface",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hardtarget_advanced": {
                    "type": "boolean",
                    "title": "Treat the target as a hard (rigid) target",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "filter_plddt": {
                    "type": "number",
                    "title": "Average pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_ptm": {
                    "type": "number",
                    "title": "Average pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.55
                  },
                  "filter_iptm": {
                    "type": "number",
                    "title": "Average interface pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5
                  },
                  "filter_i_pae": {
                    "type": "number",
                    "title": "Average interface PAE threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_surface_hydrophobicity": {
                    "type": "number",
                    "title": "Average surface hydrophobicity threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_n_interface_residues": {
                    "type": "number",
                    "title": "Minimum interface residues",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 7
                  },
                  "filter_n_interface_hbonds": {
                    "type": "number",
                    "title": "Minimum interface H-bonds",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "filter_hotspot_rmsd": {
                    "type": "number",
                    "title": "Maximum hotspot RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 6
                  },
                  "filter_binder_plddt": {
                    "type": "number",
                    "title": "Average binder pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_binder_rmsd": {
                    "type": "number",
                    "title": "Maximum binder RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 3.5
                  },
                  "max_run_time": {
                    "type": "number",
                    "title": "Maximum run time, minutes",
                    "description": "Bounds this request's own subprocess; BindCraft itself has no built-in time limit. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1440,
                    "default": 16
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "default",
                      "peptide"
                    ],
                    "default": "default"
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "task": "default",
                  "binder_name": "demo-binder",
                  "target_pdb": "HEADER    PASTE A TRIMMED TARGET PDB HERE",
                  "target_chains": "A",
                  "hotspot_residues": "",
                  "minimum_length": 65,
                  "maximum_length": 150,
                  "final_designs": 1,
                  "filter_type": "default",
                  "omit_amino_acids": "C",
                  "predict_bigbang": false,
                  "weights_helicity": -0.3,
                  "betasheet_advanced": false,
                  "mpnn_advanced": false,
                  "flexible_advanced": false,
                  "hardtarget_advanced": false,
                  "filter_plddt": 0.8,
                  "filter_ptm": 0.55,
                  "filter_iptm": 0.5,
                  "filter_i_pae": 0.35,
                  "filter_surface_hydrophobicity": 0.35,
                  "filter_n_interface_residues": 7,
                  "filter_n_interface_hbonds": 3,
                  "filter_hotspot_rmsd": 6,
                  "filter_binder_plddt": 0.8,
                  "filter_binder_rmsd": 3.5,
                  "max_run_time": 16
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/gromacs/": {
      "get": {
        "summary": "GROMACS field schema",
        "description": "Prepare a solvated molecular-dynamics system from a PDB structure.",
        "operationId": "gromacs_schema",
        "tags": [
          "GROMACS"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a GROMACS job",
        "description": "Prepare a solvated molecular-dynamics system from a PDB structure. Runs the standard pdb2gmx, editconf, and optional solvate preparation steps.",
        "operationId": "gromacs_submit",
        "tags": [
          "GROMACS"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "PDB structure",
                    "description": "Defaults to a minimal alanine example when no file is chosen. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "ATOM      1  N   ALA A   1      -0.525   1.363   0.000  1.00  0.00           N\nATOM      2  CA  ALA A   1       0.000   0.000   0.000  1.00  0.00           C\nATOM      3  C   ALA A   1       1.526   0.000   0.000  1.00  0.00           C\nATOM      4  O   ALA A   1       2.153  -1.057   0.000  1.00  0.00           O\nATOM      5  CB  ALA A   1      -0.507  -0.771  -1.216  1.00  0.00           C\nTER\nEND"
                  },
                  "force_field": {
                    "type": "string",
                    "title": "Force field",
                    "description": "One of the field's option values.",
                    "enum": [
                      "amber99sb-ildn",
                      "charmm27",
                      "oplsaa"
                    ],
                    "default": "amber99sb-ildn"
                  },
                  "water_model": {
                    "type": "string",
                    "title": "Water model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "tip3p",
                      "spce",
                      "none"
                    ],
                    "default": "tip3p"
                  },
                  "box_type": {
                    "type": "string",
                    "title": "Box type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "dodecahedron",
                      "cubic",
                      "octahedron"
                    ],
                    "default": "dodecahedron"
                  },
                  "box_distance": {
                    "type": "number",
                    "title": "Solute-to-box distance (nm)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.1,
                    "maximum": 10,
                    "default": 1.0
                  },
                  "solvate": {
                    "type": "boolean",
                    "title": "Add solvent",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "pdb": "ATOM      1  N   ALA A   1      -0.525   1.363   0.000  1.00  0.00           N\nATOM      2  CA  ALA A   1       0.000   0.000   0.000  1.00  0.00           C\nATOM      3  C   ALA A   1       1.526   0.000   0.000  1.00  0.00           C\nATOM      4  O   ALA A   1       2.153  -1.057   0.000  1.00  0.00           O\nATOM      5  CB  ALA A   1      -0.507  -0.771  -1.216  1.00  0.00           C\nTER\nEND",
                  "force_field": "amber99sb-ildn",
                  "water_model": "tip3p",
                  "box_type": "dodecahedron",
                  "box_distance": 1.0,
                  "solvate": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "PDB structure",
                    "description": "Defaults to a minimal alanine example when no file is chosen. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "ATOM      1  N   ALA A   1      -0.525   1.363   0.000  1.00  0.00           N\nATOM      2  CA  ALA A   1       0.000   0.000   0.000  1.00  0.00           C\nATOM      3  C   ALA A   1       1.526   0.000   0.000  1.00  0.00           C\nATOM      4  O   ALA A   1       2.153  -1.057   0.000  1.00  0.00           O\nATOM      5  CB  ALA A   1      -0.507  -0.771  -1.216  1.00  0.00           C\nTER\nEND"
                  },
                  "force_field": {
                    "type": "string",
                    "title": "Force field",
                    "description": "One of the field's option values.",
                    "enum": [
                      "amber99sb-ildn",
                      "charmm27",
                      "oplsaa"
                    ],
                    "default": "amber99sb-ildn"
                  },
                  "water_model": {
                    "type": "string",
                    "title": "Water model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "tip3p",
                      "spce",
                      "none"
                    ],
                    "default": "tip3p"
                  },
                  "box_type": {
                    "type": "string",
                    "title": "Box type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "dodecahedron",
                      "cubic",
                      "octahedron"
                    ],
                    "default": "dodecahedron"
                  },
                  "box_distance": {
                    "type": "number",
                    "title": "Solute-to-box distance (nm)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.1,
                    "maximum": 10,
                    "default": 1.0
                  },
                  "solvate": {
                    "type": "boolean",
                    "title": "Add solvent",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "pdb": "ATOM      1  N   ALA A   1      -0.525   1.363   0.000  1.00  0.00           N\nATOM      2  CA  ALA A   1       0.000   0.000   0.000  1.00  0.00           C\nATOM      3  C   ALA A   1       1.526   0.000   0.000  1.00  0.00           C\nATOM      4  O   ALA A   1       2.153  -1.057   0.000  1.00  0.00           O\nATOM      5  CB  ALA A   1      -0.507  -0.771  -1.216  1.00  0.00           C\nTER\nEND",
                  "force_field": "amber99sb-ildn",
                  "water_model": "tip3p",
                  "box_type": "dodecahedron",
                  "box_distance": 1.0,
                  "solvate": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/igblast/": {
      "get": {
        "summary": "IgBLAST field schema",
        "description": "Identify germline V(D)J matches in an antibody sequence.",
        "operationId": "igblast_schema",
        "tags": [
          "IgBLAST"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a IgBLAST job",
        "description": "Identify germline V(D)J matches in an antibody sequence. Builds a FASTA query and invokes NCBI IgBLAST against the installed germline databases.",
        "operationId": "igblast_submit",
        "tags": [
          "IgBLAST"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query_name": {
                    "type": "string",
                    "title": "Query name",
                    "description": "A single line of text.",
                    "default": "antibody-query"
                  },
                  "sequence_type": {
                    "type": "string",
                    "title": "Sequence type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "nucleotide",
                      "protein"
                    ],
                    "default": "nucleotide"
                  },
                  "sequence": {
                    "type": "string",
                    "title": "Sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CAGGTGCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCT"
                  },
                  "organism": {
                    "type": "string",
                    "title": "Organism",
                    "description": "Selects the internal annotation data; match it to the databases below. One of the field's option values.",
                    "enum": [
                      "human",
                      "mouse",
                      "rat",
                      "rabbit",
                      "rhesus_monkey"
                    ],
                    "default": "human"
                  },
                  "germline_db_v": {
                    "type": "string",
                    "title": "Germline V database",
                    "description": "BLAST databases found under the configured germline root. One of the field's option values.",
                    "enum": [
                      ""
                    ]
                  },
                  "germline_db_d": {
                    "type": "string",
                    "title": "Germline D database",
                    "description": "BLAST databases found under the configured germline root. One of the field's option values.",
                    "enum": [
                      ""
                    ]
                  },
                  "germline_db_j": {
                    "type": "string",
                    "title": "Germline J database",
                    "description": "BLAST databases found under the configured germline root. One of the field's option values.",
                    "enum": [
                      ""
                    ]
                  },
                  "domain_system": {
                    "type": "string",
                    "title": "Domain system",
                    "description": "One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat"
                    ],
                    "default": "imgt"
                  },
                  "num_alignments": {
                    "type": "number",
                    "title": "Alignments to report",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1.0,
                    "maximum": 100.0,
                    "default": 5
                  }
                },
                "required": [
                  "sequence"
                ],
                "example": {
                  "query_name": "antibody-query",
                  "sequence_type": "nucleotide",
                  "sequence": "CAGGTGCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCT",
                  "organism": "human",
                  "germline_db_v": "",
                  "germline_db_d": "",
                  "germline_db_j": "",
                  "domain_system": "imgt",
                  "num_alignments": 5
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "query_name": {
                    "type": "string",
                    "title": "Query name",
                    "description": "A single line of text.",
                    "default": "antibody-query"
                  },
                  "sequence_type": {
                    "type": "string",
                    "title": "Sequence type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "nucleotide",
                      "protein"
                    ],
                    "default": "nucleotide"
                  },
                  "sequence": {
                    "type": "string",
                    "title": "Sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CAGGTGCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCT"
                  },
                  "organism": {
                    "type": "string",
                    "title": "Organism",
                    "description": "Selects the internal annotation data; match it to the databases below. One of the field's option values.",
                    "enum": [
                      "human",
                      "mouse",
                      "rat",
                      "rabbit",
                      "rhesus_monkey"
                    ],
                    "default": "human"
                  },
                  "germline_db_v": {
                    "type": "string",
                    "title": "Germline V database",
                    "description": "BLAST databases found under the configured germline root. One of the field's option values.",
                    "enum": [
                      ""
                    ]
                  },
                  "germline_db_d": {
                    "type": "string",
                    "title": "Germline D database",
                    "description": "BLAST databases found under the configured germline root. One of the field's option values.",
                    "enum": [
                      ""
                    ]
                  },
                  "germline_db_j": {
                    "type": "string",
                    "title": "Germline J database",
                    "description": "BLAST databases found under the configured germline root. One of the field's option values.",
                    "enum": [
                      ""
                    ]
                  },
                  "domain_system": {
                    "type": "string",
                    "title": "Domain system",
                    "description": "One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat"
                    ],
                    "default": "imgt"
                  },
                  "num_alignments": {
                    "type": "number",
                    "title": "Alignments to report",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1.0,
                    "maximum": 100.0,
                    "default": 5
                  }
                },
                "required": [
                  "sequence"
                ],
                "example": {
                  "query_name": "antibody-query",
                  "sequence_type": "nucleotide",
                  "sequence": "CAGGTGCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCT",
                  "organism": "human",
                  "germline_db_v": "",
                  "germline_db_d": "",
                  "germline_db_j": "",
                  "domain_system": "imgt",
                  "num_alignments": 5
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/biophi/": {
      "get": {
        "summary": "BioPhi field schema",
        "description": "Humanize antibody sequences or estimate their humanness.",
        "operationId": "biophi_schema",
        "tags": [
          "BioPhi"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a BioPhi job",
        "description": "Humanize antibody sequences or estimate their humanness. Prepares paired antibody FASTA and invokes BioPhi Sapiens or OASis.",
        "operationId": "biophi_submit",
        "tags": [
          "BioPhi"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Antibody name",
                    "description": "A single line of text.",
                    "default": "demo-antibody"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAR"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDISNYLNWYQQKPGKAPKLLIYYTSRLHSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQGNTLPYT"
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "One of the field's option values.",
                    "enum": [
                      "humanize",
                      "mean_score",
                      "oasis"
                    ],
                    "default": "humanize"
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "demo-antibody",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAR",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDISNYLNWYQQKPGKAPKLLIYYTSRLHSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQGNTLPYT",
                  "operation": "humanize"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Antibody name",
                    "description": "A single line of text.",
                    "default": "demo-antibody"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAR"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDISNYLNWYQQKPGKAPKLLIYYTSRLHSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQGNTLPYT"
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "One of the field's option values.",
                    "enum": [
                      "humanize",
                      "mean_score",
                      "oasis"
                    ],
                    "default": "humanize"
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "demo-antibody",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAR",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDISNYLNWYQQKPGKAPKLLIYYTSRLHSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQGNTLPYT",
                  "operation": "humanize"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/antifold/": {
      "get": {
        "summary": "AntiFold field schema",
        "description": "Score or sample antibody sequences from an IMGT-numbered structure.",
        "operationId": "antifold_schema",
        "tags": [
          "AntiFold"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a AntiFold job",
        "description": "Score or sample antibody sequences from an IMGT-numbered structure. Invokes AntiFold on a supplied antibody or antibody-antigen PDB structure.",
        "operationId": "antifold_submit",
        "tags": [
          "AntiFold"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "IMGT-numbered PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen-chain ID (optional)",
                    "description": "A single line of text."
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "sampling_temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.2
                  }
                },
                "required": [
                  "pdb",
                  "heavy_chain",
                  "light_chain"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "antigen_chain": "",
                  "num_sequences": 10,
                  "sampling_temperature": 0.2
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "IMGT-numbered PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen-chain ID (optional)",
                    "description": "A single line of text."
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "sampling_temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.2
                  }
                },
                "required": [
                  "pdb",
                  "heavy_chain",
                  "light_chain"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "antigen_chain": "",
                  "num_sequences": 10,
                  "sampling_temperature": 0.2
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/abmpnn/": {
      "get": {
        "summary": "AbMPNN field schema",
        "description": "Design antibody sequences from a backbone structure.",
        "operationId": "abmpnn_schema",
        "tags": [
          "AbMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a AbMPNN job",
        "description": "Design antibody sequences from a backbone structure. Prepares an antibody-specific ProteinMPNN run using separately supplied AbMPNN weights.",
        "operationId": "abmpnn_submit",
        "tags": [
          "AbMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "Antibody PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN ANTIBODY PDB HERE"
                  },
                  "designed_chains": {
                    "type": "string",
                    "title": "Chains to design",
                    "description": "Space-separated chain IDs; heavy chain first. A single line of text.",
                    "default": "H L"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Number of sequences",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 8
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 1.0,
                    "default": 0.2
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Amino acids to omit",
                    "description": "One-letter amino-acid codes. A single line of text.",
                    "default": "X"
                  }
                },
                "required": [
                  "pdb",
                  "designed_chains"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN ANTIBODY PDB HERE",
                  "designed_chains": "H L",
                  "num_sequences": 8,
                  "temperature": 0.2,
                  "omit_amino_acids": "X"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "Antibody PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN ANTIBODY PDB HERE"
                  },
                  "designed_chains": {
                    "type": "string",
                    "title": "Chains to design",
                    "description": "Space-separated chain IDs; heavy chain first. A single line of text.",
                    "default": "H L"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Number of sequences",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 8
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 1.0,
                    "default": 0.2
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Amino acids to omit",
                    "description": "One-letter amino-acid codes. A single line of text.",
                    "default": "X"
                  }
                },
                "required": [
                  "pdb",
                  "designed_chains"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN ANTIBODY PDB HERE",
                  "designed_chains": "H L",
                  "num_sequences": 8,
                  "temperature": 0.2,
                  "omit_amino_acids": "X"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/proteinmpnn/": {
      "get": {
        "summary": "ProteinMPNN field schema",
        "description": "Design protein sequences for a supplied backbone structure.",
        "operationId": "proteinmpnn_schema",
        "tags": [
          "ProteinMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ProteinMPNN job",
        "description": "Design protein sequences for a supplied backbone structure. Runs the official ProteinMPNN fixed-backbone sequence-design script on selected PDB chains.",
        "operationId": "proteinmpnn_submit",
        "tags": [
          "ProteinMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "proteinmpnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Backbone mmCIF or PDB file",
                    "description": "mmCIF is converted to legacy PDB before design; chain ids in it must be a single character. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN BACKBONE PDB HERE"
                  },
                  "chains": {
                    "type": "string",
                    "title": "Chains to design",
                    "description": "Comma- or space-separated PDB chain IDs. A single line of text.",
                    "default": "A"
                  },
                  "designed_residues": {
                    "type": "string",
                    "title": "Designed residues (optional)",
                    "description": "Restrict design to specific residues instead of a whole chain: one line per chain, e.g. \"B 26 27 28 29 30\". Chains left out are designed in full; residues not listed for a named chain are held fixed. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie designed chains as a homo-oligomer",
                    "description": "Symmetric copies: ties the same position across all designed chains to the same amino acid. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model type",
                    "description": "SolubleMPNN is trained on soluble proteins only, for designs meant to express without a membrane or aggregation-prone context. One of the field's option values.",
                    "enum": [
                      "proteinmpnn",
                      "solublempnn"
                    ],
                    "default": "proteinmpnn"
                  },
                  "model_name": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 4
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 1.0,
                    "default": 0.1
                  },
                  "backbone_noise": {
                    "type": "number",
                    "title": "Noise level",
                    "description": "Gaussian noise added to backbone coordinates at inference, separate from the model checkpoint's own training noise (v_48_002/010/020/030). A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.0
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes that ProteinMPNN must not sample anywhere. A single line of text.",
                    "default": "X"
                  },
                  "bias_amino_acids": {
                    "type": "string",
                    "title": "Amino-acid bias (optional)",
                    "description": "Global per-amino-acid sampling bias, e.g. \"W:3.0,P:3.0,C:3.0,A:-3.0\". A single line of text."
                  },
                  "bias_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"C1\": {\"G\": -0.3, \"P\": 10.8}, \"C3\": {\"P\": 10.0}}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue omitted amino acids (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"A1\": \"CP\", \"A2\": \"CW\"}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  }
                },
                "required": [
                  "pdb",
                  "chains"
                ],
                "example": {
                  "job_name": "proteinmpnn-demo",
                  "pdb": "HEADER    PASTE A PROTEIN BACKBONE PDB HERE",
                  "chains": "A",
                  "designed_residues": "",
                  "homo_oligomer": false,
                  "model_type": "proteinmpnn",
                  "model_name": "v_48_020",
                  "num_sequences": 4,
                  "temperature": 0.1,
                  "backbone_noise": 0.0,
                  "seed": 0,
                  "omit_amino_acids": "X",
                  "bias_amino_acids": "",
                  "bias_amino_acids_per_residue": "",
                  "omit_amino_acids_per_residue": ""
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "proteinmpnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Backbone mmCIF or PDB file",
                    "description": "mmCIF is converted to legacy PDB before design; chain ids in it must be a single character. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN BACKBONE PDB HERE"
                  },
                  "chains": {
                    "type": "string",
                    "title": "Chains to design",
                    "description": "Comma- or space-separated PDB chain IDs. A single line of text.",
                    "default": "A"
                  },
                  "designed_residues": {
                    "type": "string",
                    "title": "Designed residues (optional)",
                    "description": "Restrict design to specific residues instead of a whole chain: one line per chain, e.g. \"B 26 27 28 29 30\". Chains left out are designed in full; residues not listed for a named chain are held fixed. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie designed chains as a homo-oligomer",
                    "description": "Symmetric copies: ties the same position across all designed chains to the same amino acid. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model type",
                    "description": "SolubleMPNN is trained on soluble proteins only, for designs meant to express without a membrane or aggregation-prone context. One of the field's option values.",
                    "enum": [
                      "proteinmpnn",
                      "solublempnn"
                    ],
                    "default": "proteinmpnn"
                  },
                  "model_name": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 4
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 1.0,
                    "default": 0.1
                  },
                  "backbone_noise": {
                    "type": "number",
                    "title": "Noise level",
                    "description": "Gaussian noise added to backbone coordinates at inference, separate from the model checkpoint's own training noise (v_48_002/010/020/030). A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.0
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes that ProteinMPNN must not sample anywhere. A single line of text.",
                    "default": "X"
                  },
                  "bias_amino_acids": {
                    "type": "string",
                    "title": "Amino-acid bias (optional)",
                    "description": "Global per-amino-acid sampling bias, e.g. \"W:3.0,P:3.0,C:3.0,A:-3.0\". A single line of text."
                  },
                  "bias_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"C1\": {\"G\": -0.3, \"P\": 10.8}, \"C3\": {\"P\": 10.0}}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue omitted amino acids (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"A1\": \"CP\", \"A2\": \"CW\"}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  }
                },
                "required": [
                  "pdb",
                  "chains"
                ],
                "example": {
                  "job_name": "proteinmpnn-demo",
                  "pdb": "HEADER    PASTE A PROTEIN BACKBONE PDB HERE",
                  "chains": "A",
                  "designed_residues": "",
                  "homo_oligomer": false,
                  "model_type": "proteinmpnn",
                  "model_name": "v_48_020",
                  "num_sequences": 4,
                  "temperature": 0.1,
                  "backbone_noise": 0.0,
                  "seed": 0,
                  "omit_amino_acids": "X",
                  "bias_amino_acids": "",
                  "bias_amino_acids_per_residue": "",
                  "omit_amino_acids_per_residue": ""
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/ligandmpnn/": {
      "get": {
        "summary": "LigandMPNN field schema",
        "description": "Design protein sequences with ligand-, solubility-, or membrane-aware models.",
        "operationId": "ligandmpnn_schema",
        "tags": [
          "LigandMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a LigandMPNN job",
        "description": "Design protein sequences with ligand-, solubility-, or membrane-aware models. Runs the official LigandMPNN run.py, ProteinMPNN's successor CLI covering protein, ligand-aware, soluble-only, and membrane-topology model types behind a single interface.",
        "operationId": "ligandmpnn_submit",
        "tags": [
          "LigandMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "ligandmpnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN (OR PROTEIN-LIGAND) PDB HERE"
                  },
                  "chains_to_design": {
                    "type": "string",
                    "title": "Chains to design (optional)",
                    "description": "Comma-separated chain IDs; blank designs every chain in the structure. A single line of text."
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Sequences generated = batch_size x number_of_batches. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "number_of_batches": {
                    "type": "number",
                    "title": "Number of batches",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids (optional)",
                    "description": "One-letter amino-acid codes to never sample, e.g. \"CX\". A single line of text."
                  },
                  "bias_amino_acids": {
                    "type": "string",
                    "title": "Amino-acid bias (optional)",
                    "description": "Global per-amino-acid sampling bias, e.g. \"A:-1.0,P:2.3\". A single line of text."
                  },
                  "bias_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"C1\": {\"G\": -0.3, \"P\": 10.8}}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue omitted amino acids (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"A1\": \"ACDEFG\"}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "fixed_residues": {
                    "type": "string",
                    "title": "Fixed residues (optional)",
                    "description": "Space-separated \"ChainResnum\", e.g. \"C1 C2 C3\"; these residues are held fixed. A single line of text."
                  },
                  "redesigned_residues": {
                    "type": "string",
                    "title": "Redesigned residues (optional)",
                    "description": "Space-separated \"ChainResnum\", the inverse of fixed_residues: only these are redesigned. A single line of text."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie designed chains as a homo-oligomer",
                    "description": "Symmetric copies: ties equivalent positions across all designed chains to the same amino acid. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ligand_mpnn_use_atom_context": {
                    "type": "boolean",
                    "title": "Use nearby ligand atoms as context",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "ligand_mpnn_use_side_chain_context": {
                    "type": "boolean",
                    "title": "Use fixed residues' side chains as ligand context",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ligand_mpnn_cutoff_for_score": {
                    "type": "number",
                    "title": "Ligand context cutoff, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 8.0
                  },
                  "transmembrane_buried": {
                    "type": "string",
                    "title": "Buried transmembrane residues",
                    "description": "Space-separated \"ChainResnum\", e.g. \"A1 A2 A3\". A single line of text."
                  },
                  "transmembrane_interface": {
                    "type": "string",
                    "title": "Interface-facing transmembrane residues",
                    "description": "Space-separated \"ChainResnum\". A single line of text."
                  },
                  "global_transmembrane_label": {
                    "type": "string",
                    "title": "Transmembrane protein",
                    "description": "One of the field's option values.",
                    "enum": [
                      "0",
                      "1"
                    ],
                    "default": "0"
                  },
                  "pack_side_chains": {
                    "type": "boolean",
                    "title": "Pack side chains onto designed backbones",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "number_of_packs_per_design": {
                    "type": "number",
                    "title": "Side-chain packs per design",
                    "description": "0 uses a single fast pack instead of resampling. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 32,
                    "default": 4
                  },
                  "pack_with_ligand_context": {
                    "type": "boolean",
                    "title": "Pack side chains with ligand context",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "repack_everything": {
                    "type": "boolean",
                    "title": "Repack fixed residues' side chains too",
                    "description": "Off keeps fixed residues' side chains exactly as given. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "protein_mpnn",
                      "ligand_mpnn",
                      "soluble_mpnn",
                      "per_residue_label_membrane_mpnn",
                      "global_label_membrane_mpnn"
                    ],
                    "default": "protein_mpnn"
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "task": "protein_mpnn",
                  "job_name": "ligandmpnn-demo",
                  "pdb": "HEADER    PASTE A PROTEIN (OR PROTEIN-LIGAND) PDB HERE",
                  "chains_to_design": "",
                  "batch_size": 1,
                  "number_of_batches": 1,
                  "temperature": 0.1,
                  "seed": 0,
                  "omit_amino_acids": "",
                  "bias_amino_acids": "",
                  "bias_amino_acids_per_residue": "",
                  "omit_amino_acids_per_residue": "",
                  "fixed_residues": "",
                  "redesigned_residues": "",
                  "homo_oligomer": false,
                  "pack_side_chains": false,
                  "number_of_packs_per_design": 4,
                  "pack_with_ligand_context": true,
                  "repack_everything": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "ligandmpnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN (OR PROTEIN-LIGAND) PDB HERE"
                  },
                  "chains_to_design": {
                    "type": "string",
                    "title": "Chains to design (optional)",
                    "description": "Comma-separated chain IDs; blank designs every chain in the structure. A single line of text."
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Sequences generated = batch_size x number_of_batches. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "number_of_batches": {
                    "type": "number",
                    "title": "Number of batches",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids (optional)",
                    "description": "One-letter amino-acid codes to never sample, e.g. \"CX\". A single line of text."
                  },
                  "bias_amino_acids": {
                    "type": "string",
                    "title": "Amino-acid bias (optional)",
                    "description": "Global per-amino-acid sampling bias, e.g. \"A:-1.0,P:2.3\". A single line of text."
                  },
                  "bias_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"C1\": {\"G\": -0.3, \"P\": 10.8}}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_amino_acids_per_residue": {
                    "type": "string",
                    "title": "Per-residue omitted amino acids (optional)",
                    "description": "JSON object keyed by chain+residue, e.g. {\"A1\": \"ACDEFG\"}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "fixed_residues": {
                    "type": "string",
                    "title": "Fixed residues (optional)",
                    "description": "Space-separated \"ChainResnum\", e.g. \"C1 C2 C3\"; these residues are held fixed. A single line of text."
                  },
                  "redesigned_residues": {
                    "type": "string",
                    "title": "Redesigned residues (optional)",
                    "description": "Space-separated \"ChainResnum\", the inverse of fixed_residues: only these are redesigned. A single line of text."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie designed chains as a homo-oligomer",
                    "description": "Symmetric copies: ties equivalent positions across all designed chains to the same amino acid. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ligand_mpnn_use_atom_context": {
                    "type": "boolean",
                    "title": "Use nearby ligand atoms as context",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "ligand_mpnn_use_side_chain_context": {
                    "type": "boolean",
                    "title": "Use fixed residues' side chains as ligand context",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ligand_mpnn_cutoff_for_score": {
                    "type": "number",
                    "title": "Ligand context cutoff, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 8.0
                  },
                  "transmembrane_buried": {
                    "type": "string",
                    "title": "Buried transmembrane residues",
                    "description": "Space-separated \"ChainResnum\", e.g. \"A1 A2 A3\". A single line of text."
                  },
                  "transmembrane_interface": {
                    "type": "string",
                    "title": "Interface-facing transmembrane residues",
                    "description": "Space-separated \"ChainResnum\". A single line of text."
                  },
                  "global_transmembrane_label": {
                    "type": "string",
                    "title": "Transmembrane protein",
                    "description": "One of the field's option values.",
                    "enum": [
                      "0",
                      "1"
                    ],
                    "default": "0"
                  },
                  "pack_side_chains": {
                    "type": "boolean",
                    "title": "Pack side chains onto designed backbones",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "number_of_packs_per_design": {
                    "type": "number",
                    "title": "Side-chain packs per design",
                    "description": "0 uses a single fast pack instead of resampling. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 32,
                    "default": 4
                  },
                  "pack_with_ligand_context": {
                    "type": "boolean",
                    "title": "Pack side chains with ligand context",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "repack_everything": {
                    "type": "boolean",
                    "title": "Repack fixed residues' side chains too",
                    "description": "Off keeps fixed residues' side chains exactly as given. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "protein_mpnn",
                      "ligand_mpnn",
                      "soluble_mpnn",
                      "per_residue_label_membrane_mpnn",
                      "global_label_membrane_mpnn"
                    ],
                    "default": "protein_mpnn"
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "task": "protein_mpnn",
                  "job_name": "ligandmpnn-demo",
                  "pdb": "HEADER    PASTE A PROTEIN (OR PROTEIN-LIGAND) PDB HERE",
                  "chains_to_design": "",
                  "batch_size": 1,
                  "number_of_batches": 1,
                  "temperature": 0.1,
                  "seed": 0,
                  "omit_amino_acids": "",
                  "bias_amino_acids": "",
                  "bias_amino_acids_per_residue": "",
                  "omit_amino_acids_per_residue": "",
                  "fixed_residues": "",
                  "redesigned_residues": "",
                  "homo_oligomer": false,
                  "pack_side_chains": false,
                  "number_of_packs_per_design": 4,
                  "pack_with_ligand_context": true,
                  "repack_everything": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/proteinmpnn_ddg/": {
      "get": {
        "summary": "ProteinMPNN-ddG field schema",
        "description": "Predict the stability effects of every point mutation in a protein chain.",
        "operationId": "proteinmpnn_ddg_schema",
        "tags": [
          "ProteinMPNN-ddG"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ProteinMPNN-ddG job",
        "description": "Predict the stability effects of every point mutation in a protein chain. Runs ProteinMPNN-ddG with full sequence context and writes its saturation-mutagenesis scores as CSV.",
        "operationId": "proteinmpnn_ddg_submit",
        "tags": [
          "ProteinMPNN-ddG"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "Protein PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN PDB HERE"
                  },
                  "chains": {
                    "type": "string",
                    "title": "Context chains",
                    "description": "Comma-separated chains; the first is predicted by default. A single line of text.",
                    "default": "A"
                  },
                  "chain_to_predict": {
                    "type": "string",
                    "title": "Chain to predict",
                    "description": "Optional; defaults to the first context chain. A single line of text."
                  },
                  "model_name": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 42
                  },
                  "repeats": {
                    "type": "number",
                    "title": "Model repeats",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "without_ddg_correction": {
                    "type": "boolean",
                    "title": "Disable the published ddG correction",
                    "description": "Required when selecting a model other than v_48_020. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "top_k": {
                    "type": "number",
                    "title": "Top mutations to highlight (optional)",
                    "description": "Return only the K most stability-improving mutations, ranked by predicted ddG. 0 returns the full table only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  }
                },
                "required": [
                  "pdb",
                  "chains"
                ],
                "example": {
                  "pdb": "HEADER    PASTE A PROTEIN PDB HERE",
                  "chains": "A",
                  "chain_to_predict": "",
                  "model_name": "v_48_020",
                  "seed": 42,
                  "repeats": 1,
                  "without_ddg_correction": false,
                  "top_k": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "Protein PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN PDB HERE"
                  },
                  "chains": {
                    "type": "string",
                    "title": "Context chains",
                    "description": "Comma-separated chains; the first is predicted by default. A single line of text.",
                    "default": "A"
                  },
                  "chain_to_predict": {
                    "type": "string",
                    "title": "Chain to predict",
                    "description": "Optional; defaults to the first context chain. A single line of text."
                  },
                  "model_name": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 42
                  },
                  "repeats": {
                    "type": "number",
                    "title": "Model repeats",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "without_ddg_correction": {
                    "type": "boolean",
                    "title": "Disable the published ddG correction",
                    "description": "Required when selecting a model other than v_48_020. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "top_k": {
                    "type": "number",
                    "title": "Top mutations to highlight (optional)",
                    "description": "Return only the K most stability-improving mutations, ranked by predicted ddG. 0 returns the full table only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  }
                },
                "required": [
                  "pdb",
                  "chains"
                ],
                "example": {
                  "pdb": "HEADER    PASTE A PROTEIN PDB HERE",
                  "chains": "A",
                  "chain_to_predict": "",
                  "model_name": "v_48_020",
                  "seed": 42,
                  "repeats": 1,
                  "without_ddg_correction": false,
                  "top_k": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/rfdiffusion/": {
      "get": {
        "summary": "RFdiffusion field schema",
        "description": "Generate protein backbones unconditionally, around a motif, or against a target.",
        "operationId": "rfdiffusion_schema",
        "tags": [
          "RFdiffusion"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a RFdiffusion job",
        "description": "Generate protein backbones unconditionally, around a motif, or against a target. Runs the official RFdiffusion inference script. Custom Contigs exposes the raw contig map directly; the other tasks build one for you from a target/binder/motif description.",
        "operationId": "rfdiffusion_submit",
        "tags": [
          "RFdiffusion"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfdiffusion-demo"
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Backbone designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  },
                  "diffusion_steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 15,
                    "maximum": 200,
                    "default": 50
                  },
                  "contigs": {
                    "type": "string",
                    "title": "Contig map",
                    "description": "RFdiffusion contig string without the brackets. For example 150-150 for an unconditional monomer, 5-15/A10-25/30-40 to scaffold a motif, or B1-100/0 100-100 for a binder. A single line of text.",
                    "default": "150-150"
                  },
                  "input_pdb": {
                    "type": "string",
                    "title": "Input PDB (optional)",
                    "description": "Required by any contig that references chains of a structure. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "hotspot_chain": {
                    "type": "string",
                    "title": "Hotspot chain (optional)",
                    "description": "A single line of text."
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "Comma- or space-separated residue numbers on hotspot_chain, e.g. 100,101,102. A single line of text."
                  },
                  "binder_design_input_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET STRUCTURE PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains",
                    "description": "Comma-separated chain IDs from the target PDB to keep as context. A single line of text.",
                    "default": "A"
                  },
                  "binder_length": {
                    "type": "string",
                    "title": "Binder length range",
                    "description": "e.g. 70-100. A single line of text.",
                    "default": "70-100"
                  },
                  "binder_hotspots": {
                    "type": "string",
                    "title": "Target hotspots (optional)",
                    "description": "One \"chain: residues\" per line, e.g. \"A: 20 21 23\". Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "binder_redesign_input_pdb": {
                    "type": "string",
                    "title": "Target-binder complex PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET-BINDER COMPLEX PDB HERE"
                  },
                  "redesign_hotspot_chain": {
                    "type": "string",
                    "title": "Hotspot chain (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_hotspots": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "Comma- or space-separated residue numbers. A single line of text."
                  },
                  "binder_chain": {
                    "type": "string",
                    "title": "Binder chain",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "designed_residues": {
                    "type": "string",
                    "title": "Designed residues",
                    "description": "Comma-separated ranges on binder_chain to regenerate; everything else on it stays fixed. A single line of text.",
                    "default": "26-32,52-57,99-110"
                  },
                  "designed_lengths": {
                    "type": "string",
                    "title": "Designed lengths (optional)",
                    "description": "One length range per designed_residues range, e.g. 5-9,3-8,10-25. Blank keeps each span's original length. A single line of text."
                  },
                  "motif_input_pdb": {
                    "type": "string",
                    "title": "Motif source PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STRUCTURE CONTAINING THE MOTIF HERE"
                  },
                  "interface_chain": {
                    "type": "string",
                    "title": "Motif chain",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "interface_residues": {
                    "type": "string",
                    "title": "Motif residues",
                    "description": "Comma-separated ranges of the motif to preserve. A single line of text.",
                    "default": "30-40, 60-70"
                  },
                  "motif_designed_lengths": {
                    "type": "string",
                    "title": "Scaffold gap lengths (optional)",
                    "description": "One range per gap (one more than the number of motif ranges), e.g. 10-40,10-40,10-40. Blank defaults every gap to 10-40. A single line of text."
                  },
                  "partial_input_pdb": {
                    "type": "string",
                    "title": "Starting structure PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STARTING STRUCTURE PDB HERE"
                  },
                  "designed_chain": {
                    "type": "string",
                    "title": "Chain to partially diffuse",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "diffused_residues": {
                    "type": "string",
                    "title": "Diffused residues",
                    "description": "Comma-separated ranges on designed_chain to noise; other residues (and other chains) stay fixed. A single line of text.",
                    "default": "1-79"
                  },
                  "provide_seq": {
                    "type": "string",
                    "title": "Keep sequence fixed at (optional)",
                    "description": "Comma-separated ranges, in designed_chain's own residue numbering, to hold sequence identity constant even while noised. A single line of text."
                  },
                  "partial_t": {
                    "type": "number",
                    "title": "Partial noising steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 199,
                    "default": 20
                  },
                  "fold_conditioning_target_file": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET STRUCTURE PDB HERE"
                  },
                  "fold_conditioning_binder_file": {
                    "type": "string",
                    "title": "Desired binder fold PDB",
                    "description": "A structure whose secondary-structure/block-adjacency pattern the new binder should follow. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STRUCTURE WITH THE DESIRED BINDER FOLD HERE"
                  },
                  "fold_hotspot_chain": {
                    "type": "string",
                    "title": "Hotspot chain (optional)",
                    "description": "A single line of text."
                  },
                  "fold_hotspots": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "A single line of text."
                  },
                  "symmetry_type": {
                    "type": "string",
                    "title": "Symmetry",
                    "description": "e.g. C2, C4, C6, D2, tetrahedral, octahedral, icosahedral. A single line of text.",
                    "default": "C4"
                  },
                  "oligomer_length": {
                    "type": "number",
                    "title": "Total oligomer length",
                    "description": "Divided evenly across the symmetric copies by RFdiffusion. A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 10000,
                    "default": 480
                  },
                  "oligomer_use_contacts": {
                    "type": "boolean",
                    "title": "Guide with an inter/intra-chain contact potential",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "symmetric_motif_input_pdb": {
                    "type": "string",
                    "title": "Structure containing the symmetric motif copies",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STRUCTURE WITH SYMMETRIC MOTIF COPIES HERE"
                  },
                  "motif_symmetry_type": {
                    "type": "string",
                    "title": "Symmetry",
                    "description": "A single line of text.",
                    "default": "C4"
                  },
                  "motif_residues": {
                    "type": "string",
                    "title": "Motif copies",
                    "description": "Comma-separated per-copy residue ranges, one per symmetric unit. A single line of text.",
                    "default": "A2-4, A7-9, A12-14, A17-19"
                  },
                  "scaffold_length_before": {
                    "type": "number",
                    "title": "Scaffold residues before each copy",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 500,
                    "default": 50
                  },
                  "scaffold_length_after": {
                    "type": "number",
                    "title": "Scaffold residues after each copy",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 500,
                    "default": 50
                  },
                  "motif_use_contacts": {
                    "type": "boolean",
                    "title": "Guide with an inter/intra-chain contact potential",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "checkpoint": {
                    "type": "string",
                    "title": "Model checkpoint override (optional)",
                    "description": "One of the field's option values.",
                    "enum": [
                      "",
                      "active_site",
                      "complex_base",
                      "complex_fold_base",
                      "inpaint_seq",
                      "inpaint_seq_fold",
                      "base_epoch8"
                    ]
                  },
                  "noise_scale_ca": {
                    "type": "number",
                    "title": "CA noise scale",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2,
                    "default": 1
                  },
                  "noise_scale_frame": {
                    "type": "number",
                    "title": "Frame noise scale",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2,
                    "default": 1
                  },
                  "potentials": {
                    "type": "string",
                    "title": "Custom guiding potential (optional)",
                    "description": "Raw potential spec, e.g. \"type:substrate_contacts,s:1,r_0:8,rep_r_0:5.0,rep_s:2,rep_r_min:1\". A single line of text."
                  },
                  "substrate": {
                    "type": "string",
                    "title": "Substrate CCD code (optional)",
                    "description": "Only used with a substrate_contacts potential, e.g. LLK. A single line of text."
                  },
                  "guide_scale": {
                    "type": "number",
                    "title": "Guide scale",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 10
                  },
                  "guide_decay": {
                    "type": "string",
                    "title": "Guide decay",
                    "description": "One of the field's option values.",
                    "enum": [
                      "constant",
                      "linear",
                      "quadratic"
                    ],
                    "default": "constant"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "contigs",
                      "binder_design",
                      "binder_redesign",
                      "motif_scaffolding",
                      "partial_diffusion",
                      "fold_conditioning",
                      "symmetric_oligomer",
                      "symmetric_motif"
                    ],
                    "default": "contigs"
                  }
                },
                "required": [],
                "example": {
                  "task": "contigs",
                  "job_name": "rfdiffusion-demo",
                  "num_designs": 2,
                  "diffusion_steps": 50,
                  "contigs": "150-150",
                  "input_pdb": "",
                  "hotspot_chain": "",
                  "hotspots": "",
                  "checkpoint": "",
                  "noise_scale_ca": 1,
                  "noise_scale_frame": 1,
                  "potentials": "",
                  "substrate": "",
                  "guide_scale": 10,
                  "guide_decay": "constant"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfdiffusion-demo"
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Backbone designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  },
                  "diffusion_steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 15,
                    "maximum": 200,
                    "default": 50
                  },
                  "contigs": {
                    "type": "string",
                    "title": "Contig map",
                    "description": "RFdiffusion contig string without the brackets. For example 150-150 for an unconditional monomer, 5-15/A10-25/30-40 to scaffold a motif, or B1-100/0 100-100 for a binder. A single line of text.",
                    "default": "150-150"
                  },
                  "input_pdb": {
                    "type": "string",
                    "title": "Input PDB (optional)",
                    "description": "Required by any contig that references chains of a structure. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly."
                  },
                  "hotspot_chain": {
                    "type": "string",
                    "title": "Hotspot chain (optional)",
                    "description": "A single line of text."
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "Comma- or space-separated residue numbers on hotspot_chain, e.g. 100,101,102. A single line of text."
                  },
                  "binder_design_input_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET STRUCTURE PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains",
                    "description": "Comma-separated chain IDs from the target PDB to keep as context. A single line of text.",
                    "default": "A"
                  },
                  "binder_length": {
                    "type": "string",
                    "title": "Binder length range",
                    "description": "e.g. 70-100. A single line of text.",
                    "default": "70-100"
                  },
                  "binder_hotspots": {
                    "type": "string",
                    "title": "Target hotspots (optional)",
                    "description": "One \"chain: residues\" per line, e.g. \"A: 20 21 23\". Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "binder_redesign_input_pdb": {
                    "type": "string",
                    "title": "Target-binder complex PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET-BINDER COMPLEX PDB HERE"
                  },
                  "redesign_hotspot_chain": {
                    "type": "string",
                    "title": "Hotspot chain (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_hotspots": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "Comma- or space-separated residue numbers. A single line of text."
                  },
                  "binder_chain": {
                    "type": "string",
                    "title": "Binder chain",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "designed_residues": {
                    "type": "string",
                    "title": "Designed residues",
                    "description": "Comma-separated ranges on binder_chain to regenerate; everything else on it stays fixed. A single line of text.",
                    "default": "26-32,52-57,99-110"
                  },
                  "designed_lengths": {
                    "type": "string",
                    "title": "Designed lengths (optional)",
                    "description": "One length range per designed_residues range, e.g. 5-9,3-8,10-25. Blank keeps each span's original length. A single line of text."
                  },
                  "motif_input_pdb": {
                    "type": "string",
                    "title": "Motif source PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STRUCTURE CONTAINING THE MOTIF HERE"
                  },
                  "interface_chain": {
                    "type": "string",
                    "title": "Motif chain",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "interface_residues": {
                    "type": "string",
                    "title": "Motif residues",
                    "description": "Comma-separated ranges of the motif to preserve. A single line of text.",
                    "default": "30-40, 60-70"
                  },
                  "motif_designed_lengths": {
                    "type": "string",
                    "title": "Scaffold gap lengths (optional)",
                    "description": "One range per gap (one more than the number of motif ranges), e.g. 10-40,10-40,10-40. Blank defaults every gap to 10-40. A single line of text."
                  },
                  "partial_input_pdb": {
                    "type": "string",
                    "title": "Starting structure PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STARTING STRUCTURE PDB HERE"
                  },
                  "designed_chain": {
                    "type": "string",
                    "title": "Chain to partially diffuse",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "diffused_residues": {
                    "type": "string",
                    "title": "Diffused residues",
                    "description": "Comma-separated ranges on designed_chain to noise; other residues (and other chains) stay fixed. A single line of text.",
                    "default": "1-79"
                  },
                  "provide_seq": {
                    "type": "string",
                    "title": "Keep sequence fixed at (optional)",
                    "description": "Comma-separated ranges, in designed_chain's own residue numbering, to hold sequence identity constant even while noised. A single line of text."
                  },
                  "partial_t": {
                    "type": "number",
                    "title": "Partial noising steps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 199,
                    "default": 20
                  },
                  "fold_conditioning_target_file": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET STRUCTURE PDB HERE"
                  },
                  "fold_conditioning_binder_file": {
                    "type": "string",
                    "title": "Desired binder fold PDB",
                    "description": "A structure whose secondary-structure/block-adjacency pattern the new binder should follow. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STRUCTURE WITH THE DESIRED BINDER FOLD HERE"
                  },
                  "fold_hotspot_chain": {
                    "type": "string",
                    "title": "Hotspot chain (optional)",
                    "description": "A single line of text."
                  },
                  "fold_hotspots": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "A single line of text."
                  },
                  "symmetry_type": {
                    "type": "string",
                    "title": "Symmetry",
                    "description": "e.g. C2, C4, C6, D2, tetrahedral, octahedral, icosahedral. A single line of text.",
                    "default": "C4"
                  },
                  "oligomer_length": {
                    "type": "number",
                    "title": "Total oligomer length",
                    "description": "Divided evenly across the symmetric copies by RFdiffusion. A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 10000,
                    "default": 480
                  },
                  "oligomer_use_contacts": {
                    "type": "boolean",
                    "title": "Guide with an inter/intra-chain contact potential",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "symmetric_motif_input_pdb": {
                    "type": "string",
                    "title": "Structure containing the symmetric motif copies",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A STRUCTURE WITH SYMMETRIC MOTIF COPIES HERE"
                  },
                  "motif_symmetry_type": {
                    "type": "string",
                    "title": "Symmetry",
                    "description": "A single line of text.",
                    "default": "C4"
                  },
                  "motif_residues": {
                    "type": "string",
                    "title": "Motif copies",
                    "description": "Comma-separated per-copy residue ranges, one per symmetric unit. A single line of text.",
                    "default": "A2-4, A7-9, A12-14, A17-19"
                  },
                  "scaffold_length_before": {
                    "type": "number",
                    "title": "Scaffold residues before each copy",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 500,
                    "default": 50
                  },
                  "scaffold_length_after": {
                    "type": "number",
                    "title": "Scaffold residues after each copy",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 500,
                    "default": 50
                  },
                  "motif_use_contacts": {
                    "type": "boolean",
                    "title": "Guide with an inter/intra-chain contact potential",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "checkpoint": {
                    "type": "string",
                    "title": "Model checkpoint override (optional)",
                    "description": "One of the field's option values.",
                    "enum": [
                      "",
                      "active_site",
                      "complex_base",
                      "complex_fold_base",
                      "inpaint_seq",
                      "inpaint_seq_fold",
                      "base_epoch8"
                    ]
                  },
                  "noise_scale_ca": {
                    "type": "number",
                    "title": "CA noise scale",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2,
                    "default": 1
                  },
                  "noise_scale_frame": {
                    "type": "number",
                    "title": "Frame noise scale",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2,
                    "default": 1
                  },
                  "potentials": {
                    "type": "string",
                    "title": "Custom guiding potential (optional)",
                    "description": "Raw potential spec, e.g. \"type:substrate_contacts,s:1,r_0:8,rep_r_0:5.0,rep_s:2,rep_r_min:1\". A single line of text."
                  },
                  "substrate": {
                    "type": "string",
                    "title": "Substrate CCD code (optional)",
                    "description": "Only used with a substrate_contacts potential, e.g. LLK. A single line of text."
                  },
                  "guide_scale": {
                    "type": "number",
                    "title": "Guide scale",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 10
                  },
                  "guide_decay": {
                    "type": "string",
                    "title": "Guide decay",
                    "description": "One of the field's option values.",
                    "enum": [
                      "constant",
                      "linear",
                      "quadratic"
                    ],
                    "default": "constant"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "contigs",
                      "binder_design",
                      "binder_redesign",
                      "motif_scaffolding",
                      "partial_diffusion",
                      "fold_conditioning",
                      "symmetric_oligomer",
                      "symmetric_motif"
                    ],
                    "default": "contigs"
                  }
                },
                "required": [],
                "example": {
                  "task": "contigs",
                  "job_name": "rfdiffusion-demo",
                  "num_designs": 2,
                  "diffusion_steps": 50,
                  "contigs": "150-150",
                  "input_pdb": "",
                  "hotspot_chain": "",
                  "hotspots": "",
                  "checkpoint": "",
                  "noise_scale_ca": 1,
                  "noise_scale_frame": 1,
                  "potentials": "",
                  "substrate": "",
                  "guide_scale": 10,
                  "guide_decay": "constant"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/rfantibody/": {
      "get": {
        "summary": "RFantibody field schema",
        "description": "Design antibody or nanobody backbones against a target structure.",
        "operationId": "rfantibody_schema",
        "tags": [
          "RFantibody"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a RFantibody job",
        "description": "Design antibody or nanobody backbones against a target structure. Runs RFantibody's antibody-finetuned RFdiffusion stage with a target, framework, CDR loop ranges, and optional hotspots.",
        "operationId": "rfantibody_submit",
        "tags": [
          "RFantibody"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfantibody-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "framework_pdb": {
                    "type": "string",
                    "title": "Antibody framework PDB",
                    "description": "HLT-formatted framework PDB. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN ANTIBODY FRAMEWORK PDB HERE"
                  },
                  "design_loops": {
                    "type": "string",
                    "title": "CDR loop lengths",
                    "description": "For example H1:7,H2:6,H3:5-13 or include L1/L2/L3 for an scFv. A single line of text.",
                    "default": "H1:7,H2:6,H3:5-13"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Target hotspots",
                    "description": "Optional comma-separated target residues, for example B146,B170,B177. A single line of text."
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Backbone designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  }
                },
                "required": [
                  "target_pdb",
                  "framework_pdb",
                  "design_loops"
                ],
                "example": {
                  "job_name": "rfantibody-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "framework_pdb": "HEADER    PASTE AN ANTIBODY FRAMEWORK PDB HERE",
                  "design_loops": "H1:7,H2:6,H3:5-13",
                  "hotspots": "",
                  "num_designs": 2,
                  "seed": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfantibody-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "framework_pdb": {
                    "type": "string",
                    "title": "Antibody framework PDB",
                    "description": "HLT-formatted framework PDB. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN ANTIBODY FRAMEWORK PDB HERE"
                  },
                  "design_loops": {
                    "type": "string",
                    "title": "CDR loop lengths",
                    "description": "For example H1:7,H2:6,H3:5-13 or include L1/L2/L3 for an scFv. A single line of text.",
                    "default": "H1:7,H2:6,H3:5-13"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Target hotspots",
                    "description": "Optional comma-separated target residues, for example B146,B170,B177. A single line of text."
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Backbone designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  }
                },
                "required": [
                  "target_pdb",
                  "framework_pdb",
                  "design_loops"
                ],
                "example": {
                  "job_name": "rfantibody-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "framework_pdb": "HEADER    PASTE AN ANTIBODY FRAMEWORK PDB HERE",
                  "design_loops": "H1:7,H2:6,H3:5-13",
                  "hotspots": "",
                  "num_designs": 2,
                  "seed": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/germinal/": {
      "get": {
        "summary": "Germinal field schema",
        "description": "Design de novo antibodies against a chosen epitope on a target structure.",
        "operationId": "germinal_schema",
        "tags": [
          "Germinal"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Germinal job",
        "description": "Design de novo antibodies against a chosen epitope on a target structure. Runs the Germinal pipeline, which hallucinates VHH or scFv binders through AlphaFold-Multimer under antibody language model guidance and then filters the trajectories on its structural and sequence criteria. Germinal's own configuration is a set of named Hydra profiles rather than a flat set of flags; this writes a target profile for the submitted structure and selects the matching run and filter profiles for the chosen binder format.",
        "operationId": "germinal_submit",
        "tags": [
          "Germinal"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "germinal-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chain": {
                    "type": "string",
                    "title": "Target chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "target_hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots",
                    "description": "Comma-separated target residues that define the epitope, for example A56,A57,A58. A single line of text.",
                    "default": "A56,A57,A58"
                  },
                  "binder_format": {
                    "type": "string",
                    "title": "Binder format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "vhh",
                      "scfv"
                    ],
                    "default": "vhh"
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to run",
                    "description": "Hallucination trajectories attempted; most are discarded by the filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "max_passing_designs": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many designs have passed every filter. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chain",
                  "target_hotspots"
                ],
                "example": {
                  "job_name": "germinal-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chain": "A",
                  "target_hotspots": "A56,A57,A58",
                  "binder_format": "vhh",
                  "max_trajectories": 10,
                  "max_passing_designs": 2
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "germinal-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chain": {
                    "type": "string",
                    "title": "Target chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "target_hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots",
                    "description": "Comma-separated target residues that define the epitope, for example A56,A57,A58. A single line of text.",
                    "default": "A56,A57,A58"
                  },
                  "binder_format": {
                    "type": "string",
                    "title": "Binder format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "vhh",
                      "scfv"
                    ],
                    "default": "vhh"
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to run",
                    "description": "Hallucination trajectories attempted; most are discarded by the filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "max_passing_designs": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many designs have passed every filter. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chain",
                  "target_hotspots"
                ],
                "example": {
                  "job_name": "germinal-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chain": "A",
                  "target_hotspots": "A56,A57,A58",
                  "binder_format": "vhh",
                  "max_trajectories": 10,
                  "max_passing_designs": 2
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/mber/": {
      "get": {
        "summary": "mBER field schema",
        "description": "Design VHH (nanobody) binders against a target by backprop through AlphaFold-Multimer.",
        "operationId": "mber_schema",
        "tags": [
          "mBER"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a mBER job",
        "description": "Design VHH (nanobody) binders against a target by backprop through AlphaFold-Multimer. Runs mBER (Manifold Binder Engineering and Refinement) through its mber-vhh command-line tool, which designs VHH binders with the ColabDesign backpropagation loop against a target structure, optionally steered onto named hotspots, and keeps every trajectory that clears its iPTM and pLDDT filters. scFv design is not exposed by this CLI in the open-source release.",
        "operationId": "mber_submit",
        "tags": [
          "mBER"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "mber-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains",
                    "description": "Comma-separated if the target is bound across more than one chain, for example A,B. A single line of text.",
                    "maxLength": 20,
                    "default": "A"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots (optional)",
                    "description": "Comma-separated target residues, for example A56,A57. Empty lets mBER bind anywhere on the target. A single line of text.",
                    "default": "A56"
                  },
                  "num_accepted": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many trajectories have passed the iPTM/pLDDT filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to attempt",
                    "description": "Upper bound on attempts if num_accepted is never reached. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100000,
                    "default": 1000
                  },
                  "min_iptm": {
                    "type": "number",
                    "title": "Minimum iPTM",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.75
                  },
                  "min_plddt": {
                    "type": "number",
                    "title": "Minimum pLDDT",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.7
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "job_name": "mber-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chains": "A",
                  "hotspots": "A56",
                  "num_accepted": 10,
                  "max_trajectories": 1000,
                  "min_iptm": 0.75,
                  "min_plddt": 0.7
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "mber-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains",
                    "description": "Comma-separated if the target is bound across more than one chain, for example A,B. A single line of text.",
                    "maxLength": 20,
                    "default": "A"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots (optional)",
                    "description": "Comma-separated target residues, for example A56,A57. Empty lets mBER bind anywhere on the target. A single line of text.",
                    "default": "A56"
                  },
                  "num_accepted": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many trajectories have passed the iPTM/pLDDT filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to attempt",
                    "description": "Upper bound on attempts if num_accepted is never reached. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100000,
                    "default": 1000
                  },
                  "min_iptm": {
                    "type": "number",
                    "title": "Minimum iPTM",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.75
                  },
                  "min_plddt": {
                    "type": "number",
                    "title": "Minimum pLDDT",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.7
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "job_name": "mber-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chains": "A",
                  "hotspots": "A56",
                  "num_accepted": 10,
                  "max_trajectories": 1000,
                  "min_iptm": 0.75,
                  "min_plddt": 0.7
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/igdesign/": {
      "get": {
        "summary": "IgDesign field schema",
        "description": "Design antibody CDRs against a target antigen by inverse folding.",
        "operationId": "igdesign_schema",
        "tags": [
          "IgDesign"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a IgDesign job",
        "description": "Design antibody CDRs against a target antigen by inverse folding. Runs IgDesign, which conditions on an antigen-antibody complex structure plus the antibody framework sequence and samples new sequences for the CDRs it is given explicit position ranges for. IgDesign's own configuration format takes those ranges directly rather than a numbering scheme, so this does too.",
        "operationId": "igdesign_submit",
        "tags": [
          "IgDesign"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "igdesign-demo"
                  },
                  "complex_pdb": {
                    "type": "string",
                    "title": "Antigen-antibody complex PDB",
                    "description": "The framework and antigen are read from this structure; the designed loops are resampled. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "regions": {
                    "type": "string",
                    "title": "Regions to design",
                    "description": "One per line, as region:chain:start-end using 1-indexed positions within that chain, for example hcdr3:heavy:96-108. Designed in the order listed. IgDesign's own example configs are the reference for picking these ranges. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "hcdr3:heavy:96-108"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.5
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  }
                },
                "required": [
                  "complex_pdb",
                  "antigen_chain",
                  "heavy_chain",
                  "light_chain",
                  "regions"
                ],
                "example": {
                  "job_name": "igdesign-demo",
                  "complex_pdb": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE",
                  "antigen_chain": "A",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "regions": "hcdr3:heavy:96-108",
                  "num_sequences": 10,
                  "temperature": 0.5,
                  "seed": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "igdesign-demo"
                  },
                  "complex_pdb": {
                    "type": "string",
                    "title": "Antigen-antibody complex PDB",
                    "description": "The framework and antigen are read from this structure; the designed loops are resampled. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "regions": {
                    "type": "string",
                    "title": "Regions to design",
                    "description": "One per line, as region:chain:start-end using 1-indexed positions within that chain, for example hcdr3:heavy:96-108. Designed in the order listed. IgDesign's own example configs are the reference for picking these ranges. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "hcdr3:heavy:96-108"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.5
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  }
                },
                "required": [
                  "complex_pdb",
                  "antigen_chain",
                  "heavy_chain",
                  "light_chain",
                  "regions"
                ],
                "example": {
                  "job_name": "igdesign-demo",
                  "complex_pdb": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE",
                  "antigen_chain": "A",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "regions": "hcdr3:heavy:96-108",
                  "num_sequences": 10,
                  "temperature": 0.5,
                  "seed": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/thermompnn/": {
      "get": {
        "summary": "ThermoMPNN field schema",
        "description": "Predict the stability change of point mutations in a protein structure.",
        "operationId": "thermompnn_schema",
        "tags": [
          "ThermoMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ThermoMPNN job",
        "description": "Predict the stability change of point mutations in a protein structure. Runs ThermoMPNN, a ProteinMPNN-derived graph network trained by transfer learning to predict ddG for point mutants. custom_inference.py always scores every substitution at every position of a chain (a saturation scan); a named list of mutations is served by filtering that scan down to the requested substitutions rather than by asking the tool for them specifically, which its own CLI has no option for.",
        "operationId": "thermompnn_submit",
        "tags": [
          "ThermoMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "thermompnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Protein PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN PDB HERE"
                  },
                  "chain": {
                    "type": "string",
                    "title": "Chain",
                    "description": "The chain the mutations are scored in; the rest of the structure is context. A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "mutations": {
                    "type": "string",
                    "title": "Mutations",
                    "description": "One per line, as wild-type residue, position, and mutant residue, for example T27A. Prefix with a chain and a colon to override the chain above. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "T27A\nH31Q\nY100F"
                  },
                  "top_k": {
                    "type": "number",
                    "title": "Top mutations to highlight",
                    "description": "Return the K most stabilising substitutions alongside the full table. 0 returns the full table only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 20
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "scan",
                      "mutations"
                    ],
                    "default": "scan"
                  }
                },
                "required": [
                  "pdb",
                  "chain"
                ],
                "example": {
                  "task": "scan",
                  "job_name": "thermompnn-demo",
                  "pdb": "HEADER    PASTE A PROTEIN PDB HERE",
                  "chain": "A",
                  "top_k": 20
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "thermompnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Protein PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN PDB HERE"
                  },
                  "chain": {
                    "type": "string",
                    "title": "Chain",
                    "description": "The chain the mutations are scored in; the rest of the structure is context. A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "mutations": {
                    "type": "string",
                    "title": "Mutations",
                    "description": "One per line, as wild-type residue, position, and mutant residue, for example T27A. Prefix with a chain and a colon to override the chain above. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "T27A\nH31Q\nY100F"
                  },
                  "top_k": {
                    "type": "number",
                    "title": "Top mutations to highlight",
                    "description": "Return the K most stabilising substitutions alongside the full table. 0 returns the full table only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 20
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "scan",
                      "mutations"
                    ],
                    "default": "scan"
                  }
                },
                "required": [
                  "pdb",
                  "chain"
                ],
                "example": {
                  "task": "scan",
                  "job_name": "thermompnn-demo",
                  "pdb": "HEADER    PASTE A PROTEIN PDB HERE",
                  "chain": "A",
                  "top_k": 20
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/boltz_adme/": {
      "get": {
        "summary": "Boltz ADME field schema",
        "description": "Predict lipophilicity, permeability, and solubility for small molecules.",
        "operationId": "boltz_adme_schema",
        "tags": [
          "Boltz ADME"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Boltz ADME job",
        "description": "Predict lipophilicity, permeability, and solubility for small molecules. Submits a batch of SMILES to Boltz's hosted adme-v1 model and returns the per-molecule Tier-1 ADME summary.",
        "operationId": "boltz_adme_submit",
        "tags": [
          "Boltz ADME"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "smiles": {
                    "type": "string",
                    "title": "Molecules as SMILES",
                    "description": "One SMILES string per line; 1 to 128 molecules. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                  }
                },
                "required": [
                  "smiles"
                ],
                "example": {
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "smiles": {
                    "type": "string",
                    "title": "Molecules as SMILES",
                    "description": "One SMILES string per line; 1 to 128 molecules. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                  }
                },
                "required": [
                  "smiles"
                ],
                "example": {
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/genie3/": {
      "get": {
        "summary": "Genie 3 field schema",
        "description": "Generate all-atom protein-binder backbones against a target.",
        "operationId": "genie3_schema",
        "tags": [
          "Genie 3"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Genie 3 job",
        "description": "Generate all-atom protein-binder backbones against a target. Builds a one-target Genie 3 binder-design problem and runs its target-conditioned generation stage.",
        "operationId": "genie3_submit",
        "tags": [
          "Genie 3"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "genie3-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET PDB HERE"
                  },
                  "target_sequence": {
                    "type": "string",
                    "title": "Target sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP"
                  },
                  "target_selection": {
                    "type": "string",
                    "title": "Target chain and residues",
                    "description": "Comma-separated PDB selections such as A1-40 or A2-158,B4-90. A single line of text.",
                    "default": "A1-40"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Interface hotspots",
                    "description": "Comma-separated target chain/residue identifiers. A single line of text.",
                    "default": "A10,A20,A30"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 80
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 120
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Binder candidates",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  }
                },
                "required": [
                  "target_pdb",
                  "target_sequence",
                  "target_selection",
                  "hotspots"
                ],
                "example": {
                  "job_name": "genie3-demo",
                  "target_pdb": "HEADER    PASTE A TARGET PDB HERE",
                  "target_sequence": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP",
                  "target_selection": "A1-40",
                  "hotspots": "A10,A20,A30",
                  "minimum_length": 80,
                  "maximum_length": 120,
                  "num_samples": 1
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "genie3-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A TARGET PDB HERE"
                  },
                  "target_sequence": {
                    "type": "string",
                    "title": "Target sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP"
                  },
                  "target_selection": {
                    "type": "string",
                    "title": "Target chain and residues",
                    "description": "Comma-separated PDB selections such as A1-40 or A2-158,B4-90. A single line of text.",
                    "default": "A1-40"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Interface hotspots",
                    "description": "Comma-separated target chain/residue identifiers. A single line of text.",
                    "default": "A10,A20,A30"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 80
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 120
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Binder candidates",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  }
                },
                "required": [
                  "target_pdb",
                  "target_sequence",
                  "target_selection",
                  "hotspots"
                ],
                "example": {
                  "job_name": "genie3-demo",
                  "target_pdb": "HEADER    PASTE A TARGET PDB HERE",
                  "target_sequence": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP",
                  "target_selection": "A1-40",
                  "hotspots": "A10,A20,A30",
                  "minimum_length": 80,
                  "maximum_length": 120,
                  "num_samples": 1
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/deepsp/": {
      "get": {
        "summary": "DeepSP field schema",
        "description": "Predict 30 spatial developability descriptors for an antibody from sequence alone.",
        "operationId": "deepsp_schema",
        "tags": [
          "DeepSP"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DeepSP job",
        "description": "Predict 30 spatial developability descriptors for an antibody from sequence alone. Runs DeepSP, a surrogate CNN that reproduces the spatial aggregation propensity and spatial charge map scores normally obtained from a molecular dynamics run, in each region of the variable domains, from the heavy and light chain sequences alone.",
        "operationId": "deepsp_submit",
        "tags": [
          "DeepSP"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepsp-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain variable domain",
                    "description": "Variable domain only. DeepSP was trained on Fv sequences. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain variable domain",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "deepsp-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepsp-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain variable domain",
                    "description": "Variable domain only. DeepSP was trained on Fv sequences. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain variable domain",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "deepsp-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/deepimmuno/": {
      "get": {
        "summary": "DeepImmuno field schema",
        "description": "Score how likely a peptide-MHC class I pair is to provoke a CD8 T-cell response.",
        "operationId": "deepimmuno_schema",
        "tags": [
          "DeepImmuno"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DeepImmuno job",
        "description": "Score how likely a peptide-MHC class I pair is to provoke a CD8 T-cell response. Runs the DeepImmuno convolutional model over 9- or 10-mer epitopes paired with an HLA class I allele, returning an immunogenicity score per pair. Binding prediction is a separate question: this scores whether a presented peptide is recognised, not whether it is presented.",
        "operationId": "deepimmuno_submit",
        "tags": [
          "DeepImmuno"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepimmuno-demo"
                  },
                  "epitope": {
                    "type": "string",
                    "title": "Epitope",
                    "description": "A 9-mer or 10-mer peptide. A single line of text.",
                    "maxLength": 10,
                    "default": "AAGIGILTV"
                  },
                  "hla": {
                    "type": "string",
                    "title": "HLA allele",
                    "description": "A single line of text.",
                    "maxLength": 20,
                    "default": "HLA-A*0201"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Epitope and allele pairs",
                    "description": "One pair per line, as epitope,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AAGIGILTV,HLA-A*0201\nSLYNTVATL,HLA-A*0201\nGILGFVFTL,HLA-A*0201"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "deepimmuno-demo",
                  "epitope": "AAGIGILTV",
                  "hla": "HLA-A*0201"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepimmuno-demo"
                  },
                  "epitope": {
                    "type": "string",
                    "title": "Epitope",
                    "description": "A 9-mer or 10-mer peptide. A single line of text.",
                    "maxLength": 10,
                    "default": "AAGIGILTV"
                  },
                  "hla": {
                    "type": "string",
                    "title": "HLA allele",
                    "description": "A single line of text.",
                    "maxLength": 20,
                    "default": "HLA-A*0201"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Epitope and allele pairs",
                    "description": "One pair per line, as epitope,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AAGIGILTV,HLA-A*0201\nSLYNTVATL,HLA-A*0201\nGILGFVFTL,HLA-A*0201"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "deepimmuno-demo",
                  "epitope": "AAGIGILTV",
                  "hla": "HLA-A*0201"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/tlimmuno/": {
      "get": {
        "summary": "TLimmuno2 field schema",
        "description": "Score how likely a peptide-MHC class II pair is to provoke a CD4 T-cell response.",
        "operationId": "tlimmuno_schema",
        "tags": [
          "TLimmuno2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a TLimmuno2 job",
        "description": "Score how likely a peptide-MHC class II pair is to provoke a CD4 T-cell response. Runs TLimmuno2, an LSTM model transferred from class II binding affinity data onto immunogenicity, over peptides paired with an MHC class II allele. Useful for anti-drug-response risk on a biologic as well as for vaccine epitope selection.",
        "operationId": "tlimmuno_submit",
        "tags": [
          "TLimmuno2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "tlimmuno-demo"
                  },
                  "peptide": {
                    "type": "string",
                    "title": "Peptide",
                    "description": "13 to 21 residues, the range the class II model was trained on. A single line of text.",
                    "maxLength": 21,
                    "default": "AGFKGEQGPKGEPGPK"
                  },
                  "mhc_allele": {
                    "type": "string",
                    "title": "MHC class II allele",
                    "description": "A single line of text.",
                    "maxLength": 40,
                    "default": "DRB1_0101"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Peptide and allele pairs",
                    "description": "One pair per line, as peptide,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AGFKGEQGPKGEPGPK,DRB1_0101\nPKYVKQNTLKLATGMR,DRB1_0101\nGELIGTLNAAKVPADT,DRB1_0401"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "tlimmuno-demo",
                  "peptide": "AGFKGEQGPKGEPGPK",
                  "mhc_allele": "DRB1_0101"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "tlimmuno-demo"
                  },
                  "peptide": {
                    "type": "string",
                    "title": "Peptide",
                    "description": "13 to 21 residues, the range the class II model was trained on. A single line of text.",
                    "maxLength": 21,
                    "default": "AGFKGEQGPKGEPGPK"
                  },
                  "mhc_allele": {
                    "type": "string",
                    "title": "MHC class II allele",
                    "description": "A single line of text.",
                    "maxLength": 40,
                    "default": "DRB1_0101"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Peptide and allele pairs",
                    "description": "One pair per line, as peptide,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AGFKGEQGPKGEPGPK,DRB1_0101\nPKYVKQNTLKLATGMR,DRB1_0101\nGELIGTLNAAKVPADT,DRB1_0401"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "tlimmuno-demo",
                  "peptide": "AGFKGEQGPKGEPGPK",
                  "mhc_allele": "DRB1_0101"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/netsolp/": {
      "get": {
        "summary": "NetSolP field schema",
        "description": "Predict whether a protein will be soluble and usable when expressed in E. coli.",
        "operationId": "netsolp_schema",
        "tags": [
          "NetSolP"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a NetSolP job",
        "description": "Predict whether a protein will be soluble and usable when expressed in E. coli. Runs NetSolP over a set of FASTA sequences, scoring each for solubility and for usability, which combines solubility with expressibility. The predictions come from a protein language model and need no structure.",
        "operationId": "netsolp_submit",
        "tags": [
          "NetSolP"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "netsolp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is scored independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "ESM12",
                      "ESM1b",
                      "Distilled"
                    ],
                    "default": "ESM12"
                  },
                  "prediction_type": {
                    "type": "string",
                    "title": "Prediction",
                    "description": "One of the field's option values.",
                    "enum": [
                      "S",
                      "U",
                      "SU"
                    ],
                    "default": "SU"
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "netsolp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "model_type": "ESM12",
                  "prediction_type": "SU"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "netsolp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is scored independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "ESM12",
                      "ESM1b",
                      "Distilled"
                    ],
                    "default": "ESM12"
                  },
                  "prediction_type": {
                    "type": "string",
                    "title": "Prediction",
                    "description": "One of the field's option values.",
                    "enum": [
                      "S",
                      "U",
                      "SU"
                    ],
                    "default": "SU"
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "netsolp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "model_type": "ESM12",
                  "prediction_type": "SU"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/deepstabp/": {
      "get": {
        "summary": "DeepSTABp field schema",
        "description": "Predict the melting temperature of a protein from its sequence.",
        "operationId": "deepstabp_schema",
        "tags": [
          "DeepSTABp"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DeepSTABp job",
        "description": "Predict the melting temperature of a protein from its sequence. Runs DeepSTABp, which embeds each sequence with a protein language model and predicts the melting temperature it would show in a thermal proteome profiling experiment, conditioned on the growth temperature and on whether the measurement is on cells or lysate.",
        "operationId": "deepstabp_submit",
        "tags": [
          "DeepSTABp"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepstabp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is predicted independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "growth_temperature": {
                    "type": "number",
                    "title": "Growth temperature (C)",
                    "description": "The temperature the organism was cultured at, which the model conditions on. A number, within the range given for the field.",
                    "minimum": -20.0,
                    "maximum": 110.0,
                    "default": 37.0
                  },
                  "measurement_condition": {
                    "type": "string",
                    "title": "Measurement condition",
                    "description": "One of the field's option values.",
                    "enum": [
                      "lysate",
                      "cell"
                    ],
                    "default": "lysate"
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "deepstabp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "growth_temperature": 37.0,
                  "measurement_condition": "lysate"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepstabp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is predicted independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "growth_temperature": {
                    "type": "number",
                    "title": "Growth temperature (C)",
                    "description": "The temperature the organism was cultured at, which the model conditions on. A number, within the range given for the field.",
                    "minimum": -20.0,
                    "maximum": 110.0,
                    "default": 37.0
                  },
                  "measurement_condition": {
                    "type": "string",
                    "title": "Measurement condition",
                    "description": "One of the field's option values.",
                    "enum": [
                      "lysate",
                      "cell"
                    ],
                    "default": "lysate"
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "deepstabp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "growth_temperature": 37.0,
                  "measurement_condition": "lysate"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/aggrescan3d/": {
      "get": {
        "summary": "AggreScan3D field schema",
        "description": "Map aggregation-prone patches onto a protein structure and score them.",
        "operationId": "aggrescan3d_schema",
        "tags": [
          "AggreScan3D"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a AggreScan3D job",
        "description": "Map aggregation-prone patches onto a protein structure and score them. Runs the AggreScan3D standalone package, which projects intrinsic aggregation propensities onto a structure and weights them by solvent exposure, giving a per-residue score and a total for the protein. The dynamic mode reruns the analysis over a CABS-flex ensemble instead of the single deposited conformation.",
        "operationId": "aggrescan3d_submit",
        "tags": [
          "AggreScan3D"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "aggrescan3d-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Protein PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN PDB HERE"
                  },
                  "chain": {
                    "type": "string",
                    "title": "Chain (optional)",
                    "description": "Restrict the analysis to one chain. Empty analyses the whole structure. A single line of text.",
                    "maxLength": 4
                  },
                  "distance": {
                    "type": "number",
                    "title": "Aggregation sphere radius (angstroms)",
                    "description": "Residues within this radius of each alpha carbon contribute to its score. A number, within the range given for the field.",
                    "minimum": 1.0,
                    "maximum": 20.0,
                    "default": 10.0
                  },
                  "dynamic": {
                    "type": "boolean",
                    "title": "Score over a CABS-flex ensemble",
                    "description": "Much slower, but accounts for flexibility instead of scoring one conformation. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mutate": {
                    "type": "string",
                    "title": "Mutations to score (optional)",
                    "description": "One per line, as wild-type residue, mutant residue, position, and chain, for example MW1A. Needs FoldX. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "auto_mutation": {
                    "type": "number",
                    "title": "Solubility mutations to suggest",
                    "description": "Ask A3D to propose this many stability-aware solubility mutations. 0 skips the search. Needs FoldX. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 10,
                    "default": 0
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "job_name": "aggrescan3d-demo",
                  "pdb": "HEADER    PASTE A PROTEIN PDB HERE",
                  "chain": "",
                  "distance": 10.0,
                  "dynamic": false,
                  "mutate": "",
                  "auto_mutation": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "aggrescan3d-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Protein PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN PDB HERE"
                  },
                  "chain": {
                    "type": "string",
                    "title": "Chain (optional)",
                    "description": "Restrict the analysis to one chain. Empty analyses the whole structure. A single line of text.",
                    "maxLength": 4
                  },
                  "distance": {
                    "type": "number",
                    "title": "Aggregation sphere radius (angstroms)",
                    "description": "Residues within this radius of each alpha carbon contribute to its score. A number, within the range given for the field.",
                    "minimum": 1.0,
                    "maximum": 20.0,
                    "default": 10.0
                  },
                  "dynamic": {
                    "type": "boolean",
                    "title": "Score over a CABS-flex ensemble",
                    "description": "Much slower, but accounts for flexibility instead of scoring one conformation. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mutate": {
                    "type": "string",
                    "title": "Mutations to score (optional)",
                    "description": "One per line, as wild-type residue, mutant residue, position, and chain, for example MW1A. Needs FoldX. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "auto_mutation": {
                    "type": "number",
                    "title": "Solubility mutations to suggest",
                    "description": "Ask A3D to propose this many stability-aware solubility mutations. 0 skips the search. Needs FoldX. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 10,
                    "default": 0
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "job_name": "aggrescan3d-demo",
                  "pdb": "HEADER    PASTE A PROTEIN PDB HERE",
                  "chain": "",
                  "distance": 10.0,
                  "dynamic": false,
                  "mutate": "",
                  "auto_mutation": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/dlkcat/": {
      "get": {
        "summary": "DLKcat field schema",
        "description": "Predict an enzyme turnover number from its sequence and a substrate structure.",
        "operationId": "dlkcat_schema",
        "tags": [
          "DLKcat"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DLKcat job",
        "description": "Predict an enzyme turnover number from its sequence and a substrate structure. Runs the deep-learning half of the DLKcat toolbox, which pairs a graph neural network over the substrate with a convolutional network over the enzyme sequence to predict kcat. It is trained on wild-type and mutant enzymes across many organisms, and is meant for parameterising models rather than for ranking closely related variants.",
        "operationId": "dlkcat_submit",
        "tags": [
          "DLKcat"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "dlkcat-demo"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Enzyme sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA"
                  },
                  "substrate_smiles": {
                    "type": "string",
                    "title": "Substrate SMILES",
                    "description": "The substrate as a SMILES string; DLKcat builds its molecular graph from this. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "OCC1OC(O)C(O)C(O)C1O"
                  },
                  "substrate_name": {
                    "type": "string",
                    "title": "Substrate name",
                    "description": "Carried through to the output for readability; it does not affect the prediction. A single line of text.",
                    "default": "D-glucose"
                  },
                  "additional_entries": {
                    "type": "string",
                    "title": "Additional pairs (optional)",
                    "description": "More substrate/enzyme pairs to score in the same run, one per line, as name;SMILES;sequence. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  }
                },
                "required": [
                  "protein_sequence",
                  "substrate_smiles"
                ],
                "example": {
                  "job_name": "dlkcat-demo",
                  "protein_sequence": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA",
                  "substrate_smiles": "OCC1OC(O)C(O)C(O)C1O",
                  "substrate_name": "D-glucose",
                  "additional_entries": ""
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "dlkcat-demo"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Enzyme sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA"
                  },
                  "substrate_smiles": {
                    "type": "string",
                    "title": "Substrate SMILES",
                    "description": "The substrate as a SMILES string; DLKcat builds its molecular graph from this. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "OCC1OC(O)C(O)C(O)C1O"
                  },
                  "substrate_name": {
                    "type": "string",
                    "title": "Substrate name",
                    "description": "Carried through to the output for readability; it does not affect the prediction. A single line of text.",
                    "default": "D-glucose"
                  },
                  "additional_entries": {
                    "type": "string",
                    "title": "Additional pairs (optional)",
                    "description": "More substrate/enzyme pairs to score in the same run, one per line, as name;SMILES;sequence. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  }
                },
                "required": [
                  "protein_sequence",
                  "substrate_smiles"
                ],
                "example": {
                  "job_name": "dlkcat-demo",
                  "protein_sequence": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA",
                  "substrate_smiles": "OCC1OC(O)C(O)C(O)C1O",
                  "substrate_name": "D-glucose",
                  "additional_entries": ""
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/catpred/": {
      "get": {
        "summary": "CatPred field schema",
        "description": "Predict kcat, Km, or Ki for an enzyme and substrate, with an uncertainty estimate.",
        "operationId": "catpred_schema",
        "tags": [
          "CatPred"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a CatPred job",
        "description": "Predict kcat, Km, or Ki for an enzyme and substrate, with an uncertainty estimate. Runs CatPred, which combines a pretrained protein language model with a molecular representation of the substrate and predicts a distribution rather than a point value, so each prediction carries a variance that tracks how far the query sits from the training data.",
        "operationId": "catpred_submit",
        "tags": [
          "CatPred"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "catpred-demo"
                  },
                  "parameter": {
                    "type": "string",
                    "title": "Parameter",
                    "description": "One of the field's option values.",
                    "enum": [
                      "kcat",
                      "km",
                      "ki"
                    ],
                    "default": "kcat"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Enzyme sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA"
                  },
                  "substrate_smiles": {
                    "type": "string",
                    "title": "Substrate SMILES",
                    "description": "For a Ki prediction this is the inhibitor rather than the substrate. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "OCC1OC(O)C(O)C(O)C1O"
                  },
                  "ec_number": {
                    "type": "string",
                    "title": "EC number (optional)",
                    "description": "For example 2.7.1.1. Used as a feature where the model has one. A single line of text.",
                    "maxLength": 20
                  },
                  "organism": {
                    "type": "string",
                    "title": "Organism (optional)",
                    "description": "For example Escherichia coli. A single line of text.",
                    "maxLength": 200
                  },
                  "include_uncertainty": {
                    "type": "boolean",
                    "title": "Return the predicted uncertainty",
                    "description": "Lower predicted variance goes with higher accuracy, so this is worth keeping on. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "protein_sequence",
                  "substrate_smiles"
                ],
                "example": {
                  "job_name": "catpred-demo",
                  "parameter": "kcat",
                  "protein_sequence": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA",
                  "substrate_smiles": "OCC1OC(O)C(O)C(O)C1O",
                  "ec_number": "",
                  "organism": "",
                  "include_uncertainty": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "catpred-demo"
                  },
                  "parameter": {
                    "type": "string",
                    "title": "Parameter",
                    "description": "One of the field's option values.",
                    "enum": [
                      "kcat",
                      "km",
                      "ki"
                    ],
                    "default": "kcat"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Enzyme sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA"
                  },
                  "substrate_smiles": {
                    "type": "string",
                    "title": "Substrate SMILES",
                    "description": "For a Ki prediction this is the inhibitor rather than the substrate. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "OCC1OC(O)C(O)C(O)C1O"
                  },
                  "ec_number": {
                    "type": "string",
                    "title": "EC number (optional)",
                    "description": "For example 2.7.1.1. Used as a feature where the model has one. A single line of text.",
                    "maxLength": 20
                  },
                  "organism": {
                    "type": "string",
                    "title": "Organism (optional)",
                    "description": "For example Escherichia coli. A single line of text.",
                    "maxLength": 200
                  },
                  "include_uncertainty": {
                    "type": "boolean",
                    "title": "Return the predicted uncertainty",
                    "description": "Lower predicted variance goes with higher accuracy, so this is worth keeping on. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "protein_sequence",
                  "substrate_smiles"
                ],
                "example": {
                  "job_name": "catpred-demo",
                  "parameter": "kcat",
                  "protein_sequence": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA",
                  "substrate_smiles": "OCC1OC(O)C(O)C(O)C1O",
                  "ec_number": "",
                  "organism": "",
                  "include_uncertainty": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/antibody_annotator/": {
      "get": {
        "summary": "Antibody Annotator field schema",
        "description": "Number an antibody or TCR sequence and report its regions and liabilities.",
        "operationId": "antibody_annotator_schema",
        "tags": [
          "Antibody Annotator"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Antibody Annotator job",
        "description": "Number an antibody or TCR sequence and report its regions and liabilities. Numbers each variable domain with the chosen scheme, reports the framework and CDR boundaries that follow from it, and flags the sequence motifs associated with glycosylation, deamidation, isomerisation, and oxidation in each region.",
        "operationId": "antibody_annotator_submit",
        "tags": [
          "Antibody Annotator"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "annotator-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One record per chain. Variable domains only; constant regions are not numbered. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat",
                      "chothia",
                      "martin",
                      "aho"
                    ],
                    "default": "imgt"
                  },
                  "receptor_type": {
                    "type": "string",
                    "title": "Receptor type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody",
                      "tcr",
                      "shark",
                      "unknown"
                    ],
                    "default": "antibody"
                  },
                  "report_liabilities": {
                    "type": "boolean",
                    "title": "Report sequence liabilities",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "annotator-demo",
                  "fasta": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "receptor_type": "antibody",
                  "report_liabilities": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "annotator-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One record per chain. Variable domains only; constant regions are not numbered. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat",
                      "chothia",
                      "martin",
                      "aho"
                    ],
                    "default": "imgt"
                  },
                  "receptor_type": {
                    "type": "string",
                    "title": "Receptor type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody",
                      "tcr",
                      "shark",
                      "unknown"
                    ],
                    "default": "antibody"
                  },
                  "report_liabilities": {
                    "type": "boolean",
                    "title": "Report sequence liabilities",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "annotator-demo",
                  "fasta": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "receptor_type": "antibody",
                  "report_liabilities": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/placer/": {
      "get": {
        "summary": "PLACER field schema",
        "description": "Generate an ensemble of protein-ligand poses and side-chain conformations.",
        "operationId": "placer_schema",
        "tags": [
          "PLACER"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a PLACER job",
        "description": "Generate an ensemble of protein-ligand poses and side-chain conformations. Runs PLACER (Protein-Ligand Atomistic Conformational Ensemble Resolver), a graph network that denoises corrupted atomic coordinates back to plausible ones. Given a structure and approximate knowledge of the binding site, it samples an ensemble of ligand poses and side-chain conformations rather than a single answer, with a predicted uncertainty (prmsd) per sample.",
        "operationId": "placer_submit",
        "tags": [
          "PLACER"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "placer-demo"
                  },
                  "structure_file": {
                    "type": "string",
                    "title": "Structure (PDB or mmCIF)",
                    "description": "Only mmCIF files from RCSB are correctly parsed; PDB is the safer choice otherwise. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE"
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "50-100 is a good number for docking; fewer is fine for side-chain conformations alone. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 500,
                    "default": 10
                  },
                  "predict_ligand": {
                    "type": "string",
                    "title": "Ligands to predict (optional)",
                    "description": "Comma-separated ligand IDs, as name3, name3-resno, or chain-name3-resno. Empty predicts every ligand present. A single line of text."
                  },
                  "fixed_ligand": {
                    "type": "string",
                    "title": "Ligands to hold fixed (optional)",
                    "description": "Comma-separated ligand IDs kept at their input coordinates instead of being predicted. A single line of text."
                  },
                  "target_res": {
                    "type": "string",
                    "title": "Crop-center residue (optional)",
                    "description": "A protein residue, as chain-resno. Required when the input has no ligand at all. A single line of text.",
                    "maxLength": 40
                  },
                  "exclude_common_ligands": {
                    "type": "boolean",
                    "title": "Exclude common crystallography additives",
                    "description": "Drops solvents and crystallography additives (AlphaFold 3's exclusion list) before predicting. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "predict_multi": {
                    "type": "boolean",
                    "title": "Predict every allowed ligand",
                    "description": "Scores every eligible ligand rather than only the ones named in predict_ligand. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "rerank": {
                    "type": "string",
                    "title": "Rank output by",
                    "description": "One of the field's option values.",
                    "enum": [
                      "prmsd",
                      "plddt",
                      "plddt_pde",
                      "none"
                    ],
                    "default": "prmsd"
                  },
                  "use_small_molecule": {
                    "type": "boolean",
                    "title": "Include the small molecule",
                    "description": "Off predicts side chains only (apo), ignoring any ligand in the input. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "structure_file"
                ],
                "example": {
                  "job_name": "placer-demo",
                  "structure_file": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE",
                  "num_samples": 10,
                  "predict_ligand": "",
                  "fixed_ligand": "",
                  "target_res": "",
                  "exclude_common_ligands": false,
                  "predict_multi": false,
                  "rerank": "prmsd",
                  "use_small_molecule": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "placer-demo"
                  },
                  "structure_file": {
                    "type": "string",
                    "title": "Structure (PDB or mmCIF)",
                    "description": "Only mmCIF files from RCSB are correctly parsed; PDB is the safer choice otherwise. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly.",
                    "default": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE"
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "50-100 is a good number for docking; fewer is fine for side-chain conformations alone. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 500,
                    "default": 10
                  },
                  "predict_ligand": {
                    "type": "string",
                    "title": "Ligands to predict (optional)",
                    "description": "Comma-separated ligand IDs, as name3, name3-resno, or chain-name3-resno. Empty predicts every ligand present. A single line of text."
                  },
                  "fixed_ligand": {
                    "type": "string",
                    "title": "Ligands to hold fixed (optional)",
                    "description": "Comma-separated ligand IDs kept at their input coordinates instead of being predicted. A single line of text."
                  },
                  "target_res": {
                    "type": "string",
                    "title": "Crop-center residue (optional)",
                    "description": "A protein residue, as chain-resno. Required when the input has no ligand at all. A single line of text.",
                    "maxLength": 40
                  },
                  "exclude_common_ligands": {
                    "type": "boolean",
                    "title": "Exclude common crystallography additives",
                    "description": "Drops solvents and crystallography additives (AlphaFold 3's exclusion list) before predicting. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "predict_multi": {
                    "type": "boolean",
                    "title": "Predict every allowed ligand",
                    "description": "Scores every eligible ligand rather than only the ones named in predict_ligand. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "rerank": {
                    "type": "string",
                    "title": "Rank output by",
                    "description": "One of the field's option values.",
                    "enum": [
                      "prmsd",
                      "plddt",
                      "plddt_pde",
                      "none"
                    ],
                    "default": "prmsd"
                  },
                  "use_small_molecule": {
                    "type": "boolean",
                    "title": "Include the small molecule",
                    "description": "Off predicts side chains only (apo), ignoring any ligand in the input. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  }
                },
                "required": [
                  "structure_file"
                ],
                "example": {
                  "job_name": "placer-demo",
                  "structure_file": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE",
                  "num_samples": 10,
                  "predict_ligand": "",
                  "fixed_ligand": "",
                  "target_res": "",
                  "exclude_common_ligands": false,
                  "predict_multi": false,
                  "rerank": "prmsd",
                  "use_small_molecule": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/jobs/%7Bjob_id%7D/": {
      "get": {
        "summary": "Poll a queued job",
        "operationId": "job_status",
        "tags": [
          "Jobs"
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The id returned when the job was submitted."
          }
        ],
        "responses": {
          "200": {
            "description": "The job as it stands now.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "404": {
            "description": "No job has that id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Job": {
        "type": "object",
        "required": [
          "id",
          "tool",
          "status",
          "status_url",
          "submitted_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "tool": {
            "type": "string",
            "description": "The slug of the tool that runs it."
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "succeeded",
              "failed"
            ]
          },
          "status_url": {
            "type": "string"
          },
          "submitted_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "position": {
            "type": "integer",
            "description": "Jobs ahead of this one; queued jobs only."
          },
          "result": {
            "type": "object",
            "description": "The tool's output; succeeded jobs only.",
            "additionalProperties": true
          },
          "license": {
            "type": "object",
            "description": "Terms the result came under; succeeded jobs only.",
            "properties": {
              "type": {
                "type": "string"
              },
              "details": {
                "type": "string"
              }
            }
          },
          "error": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Error"
              }
            ],
            "description": "Why it failed; failed jobs only."
          }
        }
      },
      "JobResponse": {
        "type": "object",
        "required": [
          "ok",
          "job"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "job": {
            "$ref": "#/components/schemas/Job"
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "invalid_input",
              "tool_unavailable",
              "execution_failed",
              "internal_error",
              "not_found"
            ]
          },
          "message": {
            "type": "string"
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}