# Structure And Binding

## Start

**post** `/compute/v1/predictions/structure-and-binding`

Submit a prediction job that produces 3D structure coordinates and confidence scores for the input molecular complex, with optional binding metrics.

### Body Parameters

- `input: object { entities, binding, bonds, 3 more }`

  - `entities: array of object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or 2 more`

    Entities (proteins, RNA, DNA, ligands) forming the complex to predict. Order determines chain assignment.

    - `ProteinEntity = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Post-translational modifications. Optional; defaults to an empty list when omitted.

        - `CcdModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `RnaEntity = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "rna"`

        - `"rna"`

      - `value: string`

        RNA nucleotide sequence (A, C, G, U, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `DnaEntity = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "dna"`

        - `"dna"`

      - `value: string`

        DNA nucleotide sequence (A, C, G, T, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `LigandCcdEntity = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_ccd"`

        - `"ligand_ccd"`

      - `value: string`

        CCD code (e.g., ATP, ADP)

    - `LigandSmilesEntity = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_smiles"`

        - `"ligand_smiles"`

      - `value: string`

        SMILES string representing the ligand

  - `binding: optional object { binder_chain_id, type }  or object { binder_chain_ids, type }`

    - `LigandProteinBinding = object { binder_chain_id, type }`

      - `binder_chain_id: string`

        Chain ID of the ligand binder (must have exactly 1 copy, <50 atoms, and only ligands+proteins in entities)

      - `type: "ligand_protein_binding"`

        - `"ligand_protein_binding"`

    - `ProteinProteinBinding = object { binder_chain_ids, type }`

      - `binder_chain_ids: array of string`

        Chain IDs of the protein binders

      - `type: "protein_protein_binding"`

        - `"protein_protein_binding"`

  - `bonds: optional array of object { atom1, atom2 }`

    Bond constraints between atoms. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `atom1: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtom = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtom = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

    - `atom2: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtom = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtom = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

  - `constraints: optional array of object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }  or object { max_distance_angstrom, token1, token2, 2 more }`

    Structural constraints (pocket and contact). Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `PocketConstraint = object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }`

      Constrains the binder to interact with specific pocket residues on the target.

      - `binder_chain_id: string`

        Chain ID of the binder molecule

      - `contact_residues: map[array of number]`

        Binding pocket residues keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the pocket on that chain.

      - `max_distance_angstrom: number`

        Maximum allowed distance in Angstroms between binder and pocket residues. Typical range: 4-8 A.

      - `type: "pocket"`

        - `"pocket"`

      - `force: optional boolean`

        Whether to force the constraint

    - `ContactConstraint = object { max_distance_angstrom, token1, token2, 2 more }`

      Contact constraint between two tokens. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `max_distance_angstrom: number`

        Maximum distance in Angstroms

      - `token1: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactToken = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactToken = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `token2: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactToken = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactToken = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `type: "contact"`

        - `"contact"`

      - `force: optional boolean`

        Whether to force the constraint

  - `model_options: optional object { recycling_steps, sampling_steps, step_scale }`

    - `recycling_steps: optional number`

      The number of recycling steps to use for prediction. Default is 3.

    - `sampling_steps: optional number`

      The number of sampling steps to use for prediction. Default is 200.

    - `step_scale: optional number`

      Diffusion step scale (temperature). Controls sampling diversity — higher values produce more varied structures. Default is 1.638.

  - `num_samples: optional number`

    Number of structure samples to generate

- `model: "boltz-2.1"`

  Model to use for prediction

  - `"boltz-2.1"`

- `idempotency_key: optional string`

  Client-provided key to prevent duplicate submissions on retries

- `workspace_id: optional string`

  Target workspace ID (admin keys only; ignored for workspace keys)

### Returns

- `id: string`

  Unique prediction identifier

- `completed_at: string`

- `created_at: string`

- `data_deleted_at: string`

  When the input/output data was deleted, or null if still available

- `error: object { code, message, details }`

  Error details when failed

  - `code: string`

    Machine-readable error code

  - `message: string`

    Human-readable error message

  - `details: optional unknown`

    Additional field-level error details keyed by input path, when available.

- `expires_at: string`

  When this resource and its associated data will be permanently deleted. Null while still in progress.

- `input: object { entities, binding, bonds, 3 more }`

  Prediction input (null if data deleted)

  - `entities: array of object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or 2 more`

    Entities (proteins, RNA, DNA, ligands) forming the complex to predict. Order determines chain assignment.

    - `ProteinEntityResponse = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Post-translational modifications. Optional; defaults to an empty list when omitted.

        - `CcdModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `RnaEntityResponse = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "rna"`

        - `"rna"`

      - `value: string`

        RNA nucleotide sequence (A, C, G, U, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `DnaEntityResponse = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "dna"`

        - `"dna"`

      - `value: string`

        DNA nucleotide sequence (A, C, G, T, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `LigandCcdEntityResponse = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_ccd"`

        - `"ligand_ccd"`

      - `value: string`

        CCD code (e.g., ATP, ADP)

    - `LigandSmilesEntityResponse = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_smiles"`

        - `"ligand_smiles"`

      - `value: string`

        SMILES string representing the ligand

  - `binding: optional object { binder_chain_id, type }  or object { binder_chain_ids, type }`

    - `LigandProteinBindingResponse = object { binder_chain_id, type }`

      - `binder_chain_id: string`

        Chain ID of the ligand binder (must have exactly 1 copy, <50 atoms, and only ligands+proteins in entities)

      - `type: "ligand_protein_binding"`

        - `"ligand_protein_binding"`

    - `ProteinProteinBindingResponse = object { binder_chain_ids, type }`

      - `binder_chain_ids: array of string`

        Chain IDs of the protein binders

      - `type: "protein_protein_binding"`

        - `"protein_protein_binding"`

  - `bonds: optional array of object { atom1, atom2 }`

    Bond constraints between atoms. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `atom1: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtomResponse = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtomResponse = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

    - `atom2: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtomResponse = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtomResponse = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

  - `constraints: optional array of object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }  or object { max_distance_angstrom, token1, token2, 2 more }`

    Structural constraints (pocket and contact). Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `PocketConstraintResponse = object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }`

      Constrains the binder to interact with specific pocket residues on the target.

      - `binder_chain_id: string`

        Chain ID of the binder molecule

      - `contact_residues: map[array of number]`

        Binding pocket residues keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the pocket on that chain.

      - `max_distance_angstrom: number`

        Maximum allowed distance in Angstroms between binder and pocket residues. Typical range: 4-8 A.

      - `type: "pocket"`

        - `"pocket"`

      - `force: optional boolean`

        Whether to force the constraint

    - `ContactConstraintResponse = object { max_distance_angstrom, token1, token2, 2 more }`

      Contact constraint between two tokens. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `max_distance_angstrom: number`

        Maximum distance in Angstroms

      - `token1: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactTokenResponse = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactTokenResponse = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `token2: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactTokenResponse = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactTokenResponse = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `type: "contact"`

        - `"contact"`

      - `force: optional boolean`

        Whether to force the constraint

  - `model_options: optional object { recycling_steps, sampling_steps, step_scale }`

    - `recycling_steps: optional number`

      The number of recycling steps to use for prediction. Default is 3.

    - `sampling_steps: optional number`

      The number of sampling steps to use for prediction. Default is 200.

    - `step_scale: optional number`

      Diffusion step scale (temperature). Controls sampling diversity — higher values produce more varied structures. Default is 1.638.

  - `num_samples: optional number`

    Number of structure samples to generate

- `livemode: boolean`

  Whether this resource was created with a live API key.

- `model: "boltz-2.1"`

  Model used for prediction

  - `"boltz-2.1"`

- `output: object { all_sample_results, best_sample, archive, binding_metrics }`

  Prediction output when succeeded

  - `all_sample_results: array of object { metrics, structure }`

    Per-sample structure results

    - `metrics: object { complex_ipde, complex_iplddt, complex_pde, 6 more }`

      - `complex_ipde: number`

        Complex interface predicted distance error. Lower is better.

      - `complex_iplddt: number`

        Complex interface pLDDT (0-1 float). Confidence at inter-chain interfaces.

      - `complex_pde: number`

        Complex predicted distance error. Lower is better.

      - `complex_plddt: number`

        Complex pLDDT (0-1 float). Per-residue confidence averaged over the complex.

      - `iptm: number`

        Interface predicted TM score (0-1). Confidence in domain interfaces.

      - `ligand_iptm: number`

        Ligand interface pTM (0-1). Only present when ligands are included.

      - `protein_iptm: number`

        Protein-protein interface pTM (0-1). Only present for multi-protein complexes.

      - `ptm: number`

        Predicted TM score (0-1). Global structure quality.

      - `structure_confidence: number`

        Overall structure confidence (0-1).

    - `structure: object { url, url_expires_at }`

      - `url: string`

        URL to download the file

      - `url_expires_at: string`

        When the presigned URL expires

  - `best_sample: object { metrics, structure }`

    - `metrics: object { complex_ipde, complex_iplddt, complex_pde, 6 more }`

      - `complex_ipde: number`

        Complex interface predicted distance error. Lower is better.

      - `complex_iplddt: number`

        Complex interface pLDDT (0-1 float). Confidence at inter-chain interfaces.

      - `complex_pde: number`

        Complex predicted distance error. Lower is better.

      - `complex_plddt: number`

        Complex pLDDT (0-1 float). Per-residue confidence averaged over the complex.

      - `iptm: number`

        Interface predicted TM score (0-1). Confidence in domain interfaces.

      - `ligand_iptm: number`

        Ligand interface pTM (0-1). Only present when ligands are included.

      - `protein_iptm: number`

        Protein-protein interface pTM (0-1). Only present for multi-protein complexes.

      - `ptm: number`

        Predicted TM score (0-1). Global structure quality.

      - `structure_confidence: number`

        Overall structure confidence (0-1).

    - `structure: object { url, url_expires_at }`

      - `url: string`

        URL to download the file

      - `url_expires_at: string`

        When the presigned URL expires

  - `archive: optional object { url, url_expires_at }`

    - `url: string`

      URL to download the file

    - `url_expires_at: string`

      When the presigned URL expires

  - `binding_metrics: optional object { binding_confidence, optimization_score, type }  or object { binding_confidence, type }`

    - `LigandProteinBindingMetrics = object { binding_confidence, optimization_score, type }`

      - `binding_confidence: number`

        Confidence that binding occurs (0-1). Primary metric for hit discovery.

      - `optimization_score: number`

        Binding strength ranking score for lead optimization. Higher values indicate stronger predicted binding.

      - `type: "ligand_protein_binding_metrics"`

        - `"ligand_protein_binding_metrics"`

    - `ProteinProteinBindingMetrics = object { binding_confidence, type }`

      - `binding_confidence: number`

        Confidence that binding occurs (0-1). Primary metric for hit discovery.

      - `type: "protein_protein_binding_metrics"`

        - `"protein_protein_binding_metrics"`

- `started_at: string`

- `status: "pending" or "running" or "succeeded" or "failed"`

  - `"pending"`

  - `"running"`

  - `"succeeded"`

  - `"failed"`

- `version: string`

  Model version used for prediction

- `workspace_id: string`

  Workspace ID

- `idempotency_key: optional string`

  Client-provided idempotency key

### Example

```http
curl https://api.boltz.bio/compute/v1/predictions/structure-and-binding \
    -H 'Content-Type: application/json' \
    -H "x-api-key: $BOLTZ_API_KEY" \
    -d '{
          "input": {
            "entities": [
              {
                "chain_ids": [
                  "string"
                ],
                "type": "protein",
                "value": "value"
              }
            ]
          },
          "model": "boltz-2.1"
        }'
```

## List

**get** `/compute/v1/predictions/structure-and-binding`

List structure and binding predictions, optionally filtered by workspace

### Query Parameters

- `after_id: optional string`

  Return results after this ID

- `before_id: optional string`

  Return results before this ID

- `limit: optional number`

  Max items to return. Defaults to 100.

- `workspace_id: optional string`

  Filter by workspace ID. Only used with admin API keys. If not provided, defaults to the workspace associated with the API key, or the default workspace for admin keys.

### Returns

- `data: array of object { id, completed_at, created_at, 10 more }`

  - `id: string`

    Unique prediction identifier

  - `completed_at: string`

  - `created_at: string`

  - `data_deleted_at: string`

    When the input/output data was deleted, or null if still available

  - `error: object { code, message, details }`

    Error details when failed

    - `code: string`

      Machine-readable error code

    - `message: string`

      Human-readable error message

    - `details: optional unknown`

      Additional field-level error details keyed by input path, when available.

  - `expires_at: string`

    When this resource and its associated data will be permanently deleted. Null while still in progress.

  - `livemode: boolean`

    Whether this resource was created with a live API key.

  - `model: "boltz-2.1"`

    Model used for prediction

    - `"boltz-2.1"`

  - `started_at: string`

  - `status: "pending" or "running" or "succeeded" or "failed"`

    - `"pending"`

    - `"running"`

    - `"succeeded"`

    - `"failed"`

  - `version: string`

    Model version used for prediction

  - `workspace_id: string`

    Workspace ID

  - `idempotency_key: optional string`

    Client-provided idempotency key

- `first_id: string`

  ID of the first item. Use as before_id for the previous page.

- `has_more: boolean`

- `last_id: string`

  ID of the last item. Use as after_id for the next page.

### Example

```http
curl https://api.boltz.bio/compute/v1/predictions/structure-and-binding \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Retrieve

**get** `/compute/v1/predictions/structure-and-binding/{id}`

Retrieve a prediction by ID, including its status and results.

### Path Parameters

- `id: string`

### Query Parameters

- `workspace_id: optional string`

  Workspace ID. Only used with admin API keys. Ignored (or validated) for workspace-scoped keys.

### Returns

- `id: string`

  Unique prediction identifier

- `completed_at: string`

- `created_at: string`

- `data_deleted_at: string`

  When the input/output data was deleted, or null if still available

- `error: object { code, message, details }`

  Error details when failed

  - `code: string`

    Machine-readable error code

  - `message: string`

    Human-readable error message

  - `details: optional unknown`

    Additional field-level error details keyed by input path, when available.

- `expires_at: string`

  When this resource and its associated data will be permanently deleted. Null while still in progress.

- `input: object { entities, binding, bonds, 3 more }`

  Prediction input (null if data deleted)

  - `entities: array of object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or 2 more`

    Entities (proteins, RNA, DNA, ligands) forming the complex to predict. Order determines chain assignment.

    - `ProteinEntityResponse = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Post-translational modifications. Optional; defaults to an empty list when omitted.

        - `CcdModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `RnaEntityResponse = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "rna"`

        - `"rna"`

      - `value: string`

        RNA nucleotide sequence (A, C, G, U, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `DnaEntityResponse = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "dna"`

        - `"dna"`

      - `value: string`

        DNA nucleotide sequence (A, C, G, T, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModificationResponse = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `LigandCcdEntityResponse = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_ccd"`

        - `"ligand_ccd"`

      - `value: string`

        CCD code (e.g., ATP, ADP)

    - `LigandSmilesEntityResponse = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_smiles"`

        - `"ligand_smiles"`

      - `value: string`

        SMILES string representing the ligand

  - `binding: optional object { binder_chain_id, type }  or object { binder_chain_ids, type }`

    - `LigandProteinBindingResponse = object { binder_chain_id, type }`

      - `binder_chain_id: string`

        Chain ID of the ligand binder (must have exactly 1 copy, <50 atoms, and only ligands+proteins in entities)

      - `type: "ligand_protein_binding"`

        - `"ligand_protein_binding"`

    - `ProteinProteinBindingResponse = object { binder_chain_ids, type }`

      - `binder_chain_ids: array of string`

        Chain IDs of the protein binders

      - `type: "protein_protein_binding"`

        - `"protein_protein_binding"`

  - `bonds: optional array of object { atom1, atom2 }`

    Bond constraints between atoms. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `atom1: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtomResponse = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtomResponse = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

    - `atom2: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtomResponse = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtomResponse = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

  - `constraints: optional array of object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }  or object { max_distance_angstrom, token1, token2, 2 more }`

    Structural constraints (pocket and contact). Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `PocketConstraintResponse = object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }`

      Constrains the binder to interact with specific pocket residues on the target.

      - `binder_chain_id: string`

        Chain ID of the binder molecule

      - `contact_residues: map[array of number]`

        Binding pocket residues keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the pocket on that chain.

      - `max_distance_angstrom: number`

        Maximum allowed distance in Angstroms between binder and pocket residues. Typical range: 4-8 A.

      - `type: "pocket"`

        - `"pocket"`

      - `force: optional boolean`

        Whether to force the constraint

    - `ContactConstraintResponse = object { max_distance_angstrom, token1, token2, 2 more }`

      Contact constraint between two tokens. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `max_distance_angstrom: number`

        Maximum distance in Angstroms

      - `token1: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactTokenResponse = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactTokenResponse = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `token2: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactTokenResponse = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactTokenResponse = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `type: "contact"`

        - `"contact"`

      - `force: optional boolean`

        Whether to force the constraint

  - `model_options: optional object { recycling_steps, sampling_steps, step_scale }`

    - `recycling_steps: optional number`

      The number of recycling steps to use for prediction. Default is 3.

    - `sampling_steps: optional number`

      The number of sampling steps to use for prediction. Default is 200.

    - `step_scale: optional number`

      Diffusion step scale (temperature). Controls sampling diversity — higher values produce more varied structures. Default is 1.638.

  - `num_samples: optional number`

    Number of structure samples to generate

- `livemode: boolean`

  Whether this resource was created with a live API key.

- `model: "boltz-2.1"`

  Model used for prediction

  - `"boltz-2.1"`

- `output: object { all_sample_results, best_sample, archive, binding_metrics }`

  Prediction output when succeeded

  - `all_sample_results: array of object { metrics, structure }`

    Per-sample structure results

    - `metrics: object { complex_ipde, complex_iplddt, complex_pde, 6 more }`

      - `complex_ipde: number`

        Complex interface predicted distance error. Lower is better.

      - `complex_iplddt: number`

        Complex interface pLDDT (0-1 float). Confidence at inter-chain interfaces.

      - `complex_pde: number`

        Complex predicted distance error. Lower is better.

      - `complex_plddt: number`

        Complex pLDDT (0-1 float). Per-residue confidence averaged over the complex.

      - `iptm: number`

        Interface predicted TM score (0-1). Confidence in domain interfaces.

      - `ligand_iptm: number`

        Ligand interface pTM (0-1). Only present when ligands are included.

      - `protein_iptm: number`

        Protein-protein interface pTM (0-1). Only present for multi-protein complexes.

      - `ptm: number`

        Predicted TM score (0-1). Global structure quality.

      - `structure_confidence: number`

        Overall structure confidence (0-1).

    - `structure: object { url, url_expires_at }`

      - `url: string`

        URL to download the file

      - `url_expires_at: string`

        When the presigned URL expires

  - `best_sample: object { metrics, structure }`

    - `metrics: object { complex_ipde, complex_iplddt, complex_pde, 6 more }`

      - `complex_ipde: number`

        Complex interface predicted distance error. Lower is better.

      - `complex_iplddt: number`

        Complex interface pLDDT (0-1 float). Confidence at inter-chain interfaces.

      - `complex_pde: number`

        Complex predicted distance error. Lower is better.

      - `complex_plddt: number`

        Complex pLDDT (0-1 float). Per-residue confidence averaged over the complex.

      - `iptm: number`

        Interface predicted TM score (0-1). Confidence in domain interfaces.

      - `ligand_iptm: number`

        Ligand interface pTM (0-1). Only present when ligands are included.

      - `protein_iptm: number`

        Protein-protein interface pTM (0-1). Only present for multi-protein complexes.

      - `ptm: number`

        Predicted TM score (0-1). Global structure quality.

      - `structure_confidence: number`

        Overall structure confidence (0-1).

    - `structure: object { url, url_expires_at }`

      - `url: string`

        URL to download the file

      - `url_expires_at: string`

        When the presigned URL expires

  - `archive: optional object { url, url_expires_at }`

    - `url: string`

      URL to download the file

    - `url_expires_at: string`

      When the presigned URL expires

  - `binding_metrics: optional object { binding_confidence, optimization_score, type }  or object { binding_confidence, type }`

    - `LigandProteinBindingMetrics = object { binding_confidence, optimization_score, type }`

      - `binding_confidence: number`

        Confidence that binding occurs (0-1). Primary metric for hit discovery.

      - `optimization_score: number`

        Binding strength ranking score for lead optimization. Higher values indicate stronger predicted binding.

      - `type: "ligand_protein_binding_metrics"`

        - `"ligand_protein_binding_metrics"`

    - `ProteinProteinBindingMetrics = object { binding_confidence, type }`

      - `binding_confidence: number`

        Confidence that binding occurs (0-1). Primary metric for hit discovery.

      - `type: "protein_protein_binding_metrics"`

        - `"protein_protein_binding_metrics"`

- `started_at: string`

- `status: "pending" or "running" or "succeeded" or "failed"`

  - `"pending"`

  - `"running"`

  - `"succeeded"`

  - `"failed"`

- `version: string`

  Model version used for prediction

- `workspace_id: string`

  Workspace ID

- `idempotency_key: optional string`

  Client-provided idempotency key

### Example

```http
curl https://api.boltz.bio/compute/v1/predictions/structure-and-binding/$ID \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Delete Data

**post** `/compute/v1/predictions/structure-and-binding/{id}/delete-data`

Permanently delete the input, output, and result data associated with this prediction. The prediction record itself is retained with a `data_deleted_at` timestamp. This action is irreversible.

### Path Parameters

- `id: string`

### Returns

- `id: string`

  ID of the resource whose data was deleted

- `data_deleted: true`

  - `true`

- `data_deleted_at: string`

  When the data was deleted

### Example

```http
curl https://api.boltz.bio/compute/v1/predictions/structure-and-binding/$ID/delete-data \
    -X POST \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Estimate Cost

**post** `/compute/v1/predictions/structure-and-binding/estimate-cost`

Estimate the cost of a prediction without creating any resource or consuming GPU.

### Body Parameters

- `input: object { entities, binding, bonds, 3 more }`

  - `entities: array of object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or object { chain_ids, type, value, 2 more }  or 2 more`

    Entities (proteins, RNA, DNA, ligands) forming the complex to predict. Order determines chain assignment.

    - `ProteinEntity = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Post-translational modifications. Optional; defaults to an empty list when omitted.

        - `CcdModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `RnaEntity = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "rna"`

        - `"rna"`

      - `value: string`

        RNA nucleotide sequence (A, C, G, U, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `DnaEntity = object { chain_ids, type, value, 2 more }`

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "dna"`

        - `"dna"`

      - `value: string`

        DNA nucleotide sequence (A, C, G, T, N)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

      - `modifications: optional array of object { residue_index, type, value }  or object { residue_index, type, value }`

        Chemical modifications. Optional; defaults to an empty list when omitted.

        - `CcdModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

            CCD code from RCSB PDB (e.g. 'MSE' for selenomethionine, 'SEP' for phosphoserine)

        - `SmilesModification = object { residue_index, type, value }`

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

    - `LigandCcdEntity = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_ccd"`

        - `"ligand_ccd"`

      - `value: string`

        CCD code (e.g., ATP, ADP)

    - `LigandSmilesEntity = object { chain_ids, type, value }`

      - `chain_ids: array of string`

        Chain IDs for this ligand

      - `type: "ligand_smiles"`

        - `"ligand_smiles"`

      - `value: string`

        SMILES string representing the ligand

  - `binding: optional object { binder_chain_id, type }  or object { binder_chain_ids, type }`

    - `LigandProteinBinding = object { binder_chain_id, type }`

      - `binder_chain_id: string`

        Chain ID of the ligand binder (must have exactly 1 copy, <50 atoms, and only ligands+proteins in entities)

      - `type: "ligand_protein_binding"`

        - `"ligand_protein_binding"`

    - `ProteinProteinBinding = object { binder_chain_ids, type }`

      - `binder_chain_ids: array of string`

        Chain IDs of the protein binders

      - `type: "protein_protein_binding"`

        - `"protein_protein_binding"`

  - `bonds: optional array of object { atom1, atom2 }`

    Bond constraints between atoms. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `atom1: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtom = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtom = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

    - `atom2: object { atom_name, chain_id, type }  or object { atom_name, chain_id, residue_index, type }`

      Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `LigandAtom = object { atom_name, chain_id, type }`

        Ligand atom reference. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB). Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

      - `PolymerAtom = object { atom_name, chain_id, residue_index, type }`

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

  - `constraints: optional array of object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }  or object { max_distance_angstrom, token1, token2, 2 more }`

    Structural constraints (pocket and contact). Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `PocketConstraint = object { binder_chain_id, contact_residues, max_distance_angstrom, 2 more }`

      Constrains the binder to interact with specific pocket residues on the target.

      - `binder_chain_id: string`

        Chain ID of the binder molecule

      - `contact_residues: map[array of number]`

        Binding pocket residues keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the pocket on that chain.

      - `max_distance_angstrom: number`

        Maximum allowed distance in Angstroms between binder and pocket residues. Typical range: 4-8 A.

      - `type: "pocket"`

        - `"pocket"`

      - `force: optional boolean`

        Whether to force the constraint

    - `ContactConstraint = object { max_distance_angstrom, token1, token2, 2 more }`

      Contact constraint between two tokens. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

      - `max_distance_angstrom: number`

        Maximum distance in Angstroms

      - `token1: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactToken = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactToken = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `token2: object { chain_id, residue_index, type }  or object { atom_name, chain_id, type }`

        Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

        - `PolymerContactToken = object { chain_id, residue_index, type }`

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

        - `LigandContactToken = object { atom_name, chain_id, type }`

          Ligand contact token. Atom-level ligand references currently support ligand_ccd entities only; ligand_smiles is unsupported.

          - `atom_name: string`

            Atom name. Atom-level references to ligand_smiles entities are currently unsupported; use ligand_ccd instead.

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `type: "contact"`

        - `"contact"`

      - `force: optional boolean`

        Whether to force the constraint

  - `model_options: optional object { recycling_steps, sampling_steps, step_scale }`

    - `recycling_steps: optional number`

      The number of recycling steps to use for prediction. Default is 3.

    - `sampling_steps: optional number`

      The number of sampling steps to use for prediction. Default is 200.

    - `step_scale: optional number`

      Diffusion step scale (temperature). Controls sampling diversity — higher values produce more varied structures. Default is 1.638.

  - `num_samples: optional number`

    Number of structure samples to generate

- `model: "boltz-2.1"`

  Model to use for prediction

  - `"boltz-2.1"`

- `idempotency_key: optional string`

  Client-provided key to prevent duplicate submissions on retries

- `workspace_id: optional string`

  Target workspace ID (admin keys only; ignored for workspace keys)

### Returns

- `breakdown: object { application, cost_per_unit_usd, num_units }`

  Cost breakdown for the billed application.

  - `application: "structure_and_binding" or "small_molecule_design" or "small_molecule_library_screen" or 3 more`

    - `"structure_and_binding"`

    - `"small_molecule_design"`

    - `"small_molecule_library_screen"`

    - `"protein_design"`

    - `"protein_library_screen"`

    - `"adme"`

  - `cost_per_unit_usd: string`

    Estimated cost per displayed unit as a decimal string, rounded up to 4 decimal places. This may include token-size multipliers or generation overhead; estimated_cost_usd is the authoritative total.

  - `num_units: number`

    Number of units shown for the estimate. For structure-and-binding, this is the requested number of samples. For protein and small-molecule design/screen endpoints, this is the requested number of proteins or molecules.

- `disclaimer: string`

- `estimated_cost_usd: string`

  Estimated total cost as a decimal string

### Example

```http
curl https://api.boltz.bio/compute/v1/predictions/structure-and-binding/estimate-cost \
    -H 'Content-Type: application/json' \
    -H "x-api-key: $BOLTZ_API_KEY" \
    -d '{
          "input": {
            "entities": [
              {
                "chain_ids": [
                  "string"
                ],
                "type": "protein",
                "value": "value"
              }
            ]
          },
          "model": "boltz-2.1"
        }'
```
