# Design

## Start

`small_molecule.design.start(DesignStartParams**kwargs)  -> DesignStartResponse`

**post** `/compute/v1/small-molecule/design`

Create a new design run that generates novel small molecule candidates for a protein target

### Parameters

- `num_molecules: int`

  Number of molecules to generate. Must be between 10 and 1,000,000.

- `target: Target`

  Target protein with binding pocket for small molecule design or screening

  - `entities: Iterable[TargetEntity]`

    Protein entities defining the target structure. Each entity represents a protein chain.

    - `chain_ids: SequenceNotStr[str]`

      Chain IDs for this entity

    - `type: Literal["protein"]`

      - `"protein"`

    - `value: str`

      Amino acid sequence (one-letter codes)

    - `cyclic: Optional[bool]`

      Whether the sequence is cyclic

    - `modifications: Optional[Iterable[TargetEntityModification]]`

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

      - `class TargetEntityModificationCcdModification: …`

        - `residue_index: int`

          0-based index of the residue to modify

        - `type: Literal["ccd"]`

          - `"ccd"`

        - `value: str`

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

      - `class TargetEntityModificationSmilesModification: …`

        - `residue_index: int`

          0-based index of the residue to modify

        - `type: Literal["smiles"]`

          - `"smiles"`

        - `value: str`

          SMILES string for the modification

  - `bonds: Optional[Iterable[TargetBond]]`

    Covalent bond constraints between atoms in the target complex. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `atom1: TargetBondAtom1`

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

      - `class TargetBondAtom1LigandAtom: …`

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

        - `atom_name: str`

          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: str`

          Chain ID containing the atom

        - `type: Literal["ligand_atom"]`

          - `"ligand_atom"`

      - `class TargetBondAtom1PolymerAtom: …`

        - `atom_name: str`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: str`

          Chain ID containing the atom

        - `residue_index: int`

          0-based residue index

        - `type: Literal["polymer_atom"]`

          - `"polymer_atom"`

    - `atom2: TargetBondAtom2`

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

      - `class TargetBondAtom2LigandAtom: …`

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

        - `atom_name: str`

          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: str`

          Chain ID containing the atom

        - `type: Literal["ligand_atom"]`

          - `"ligand_atom"`

      - `class TargetBondAtom2PolymerAtom: …`

        - `atom_name: str`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: str`

          Chain ID containing the atom

        - `residue_index: int`

          0-based residue index

        - `type: Literal["polymer_atom"]`

          - `"polymer_atom"`

  - `constraints: Optional[Iterable[TargetConstraint]]`

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

    - `class TargetConstraintPocketConstraint: …`

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

      - `binder_chain_id: str`

        Chain ID of the binder molecule

      - `contact_residues: Dict[str, Iterable[int]]`

        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: float`

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

      - `type: Literal["pocket"]`

        - `"pocket"`

      - `force: Optional[bool]`

        Whether to force the constraint

    - `class TargetConstraintContactConstraint: …`

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

      - `max_distance_angstrom: float`

        Maximum distance in Angstroms

      - `token1: TargetConstraintContactConstraintToken1`

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

        - `class TargetConstraintContactConstraintToken1PolymerContactToken: …`

          - `chain_id: str`

            Chain ID

          - `residue_index: int`

            0-based residue index

          - `type: Literal["polymer_contact"]`

            - `"polymer_contact"`

        - `class TargetConstraintContactConstraintToken1LigandContactToken: …`

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

          - `atom_name: str`

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

          - `chain_id: str`

            Chain ID

          - `type: Literal["ligand_contact"]`

            - `"ligand_contact"`

      - `token2: TargetConstraintContactConstraintToken2`

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

        - `class TargetConstraintContactConstraintToken2PolymerContactToken: …`

          - `chain_id: str`

            Chain ID

          - `residue_index: int`

            0-based residue index

          - `type: Literal["polymer_contact"]`

            - `"polymer_contact"`

        - `class TargetConstraintContactConstraintToken2LigandContactToken: …`

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

          - `atom_name: str`

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

          - `chain_id: str`

            Chain ID

          - `type: Literal["ligand_contact"]`

            - `"ligand_contact"`

      - `type: Literal["contact"]`

        - `"contact"`

      - `force: Optional[bool]`

        Whether to force the constraint

  - `pocket_residues: Optional[Dict[str, Iterable[int]]]`

    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 binding pocket on that chain. When provided, these residues guide pocket extraction and add a derived pocket constraint during affinity predictions. That derived constraint remains separate from any explicit pocket constraints in target.constraints. When omitted, the model auto-detects the pocket.

  - `reference_ligands: Optional[SequenceNotStr[str]]`

    Reference ligands as SMILES strings that help the model identify the binding pocket. When omitted, a set of drug-like default ligands is used for pocket detection.

- `chemical_space: Optional[Literal["enamine_real"]]`

  Chemical space to constrain generated molecules. Currently only 'enamine_real' (Enamine REAL chemical space) is supported. Additional options may be added in the future.

  - `"enamine_real"`

- `idempotency_key: Optional[str]`

  Client-provided key to prevent duplicate submissions on retries

- `molecule_filters: Optional[MoleculeFilters]`

  Molecule filtering configuration. Controls both Boltz built-in SMARTS filtering and custom filters.

  - `boltz_smarts_catalog_filter_level: Optional[Literal["recommended", "extra", "aggressive", "disabled"]]`

    Controls the stringency of Boltz's built-in SMARTS structural alert filtering, which removes molecules matching known problematic substructures. 'recommended' (default): applies a curated set of alerts balancing safety and hit rate. 'extra': adds additional alerts beyond the recommended set for stricter filtering. 'aggressive': applies the most comprehensive alert set — may reject viable molecules. 'disabled': turns off Boltz SMARTS filtering entirely; only custom_filters will be applied.

    - `"recommended"`

    - `"extra"`

    - `"aggressive"`

    - `"disabled"`

  - `custom_filters: Optional[Iterable[MoleculeFiltersCustomFilter]]`

    Custom filters to apply. Molecules must pass all filters (AND logic).

    - `class MoleculeFiltersCustomFilterLipinskiFilter: …`

      Lipinski's Rule of Five filter. Rejects molecules that violate drug-likeness criteria based on molecular weight, LogP, hydrogen bond donors, and hydrogen bond acceptors.

      - `max_hba: float`

        Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

      - `max_hbd: float`

        Maximum number of hydrogen bond donors. Lipinski threshold: 5

      - `max_logp: float`

        Maximum LogP. Lipinski threshold: 5

      - `max_mw: float`

        Maximum molecular weight (Da). Lipinski threshold: 500

      - `type: Literal["lipinski_filter"]`

        - `"lipinski_filter"`

      - `allow_single_violation: Optional[bool]`

        If true, one rule violation is allowed (classic Rule of Five). Defaults to false (all rules must pass).

    - `class MoleculeFiltersCustomFilterRdkitDescriptorFilter: …`

      Filter molecules by RDKit molecular descriptors. Each descriptor is constrained to a min/max range. Only descriptors you provide are checked — omitted descriptors are unconstrained.

      - `type: Literal["rdkit_descriptor_filter"]`

        - `"rdkit_descriptor_filter"`

      - `fraction_csp3: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterFractionCsp3]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `mol_logp: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterMolLogp]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `mol_wt: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterMolWt]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_aromatic_rings: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumAromaticRings]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_h_acceptors: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumHAcceptors]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_h_donors: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumHDonors]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_heteroatoms: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumHeteroatoms]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_rings: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumRings]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_rotatable_bonds: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumRotatableBonds]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `tpsa: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterTpsa]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

    - `class MoleculeFiltersCustomFilterSmartsCustomFilter: …`

      Filter molecules by custom SMARTS patterns. Molecules matching any pattern are rejected.

      - `patterns: SequenceNotStr[str]`

        SMARTS patterns. Molecules matching any pattern are rejected.

      - `type: Literal["smarts_custom_filter"]`

        - `"smarts_custom_filter"`

    - `class MoleculeFiltersCustomFilterSmartsCatalogFilter: …`

      Filter molecules using a predefined SMARTS catalog of structural alerts.

      - `catalog: Literal["PAINS", "PAINS_A", "PAINS_B", 11 more]`

        Predefined SMARTS catalog to apply. PAINS, BRENK, ChEMBL, and NIH catalogs reject known problematic substructures.

        - `"PAINS"`

        - `"PAINS_A"`

        - `"PAINS_B"`

        - `"PAINS_C"`

        - `"BRENK"`

        - `"CHEMBL"`

        - `"CHEMBL_BMS"`

        - `"CHEMBL_Dundee"`

        - `"CHEMBL_Glaxo"`

        - `"CHEMBL_Inpharmatica"`

        - `"CHEMBL_LINT"`

        - `"CHEMBL_MLSMR"`

        - `"CHEMBL_SureChEMBL"`

        - `"NIH"`

      - `type: Literal["smarts_catalog_filter"]`

        - `"smarts_catalog_filter"`

    - `class MoleculeFiltersCustomFilterSmilesRegexFilter: …`

      Filter molecules by regex patterns on their SMILES representation.

      - `patterns: SequenceNotStr[str]`

        Regex patterns applied to SMILES strings. Molecules matching any pattern are rejected.

      - `type: Literal["smiles_regex_filter"]`

        - `"smiles_regex_filter"`

- `workspace_id: Optional[str]`

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

### Returns

- `class DesignStartResponse: …`

  A small molecule design engine run that generates novel molecules

  - `id: str`

    Unique SmDesignRun identifier

  - `completed_at: Optional[datetime]`

  - `created_at: datetime`

  - `data_deleted_at: Optional[datetime]`

    When the input, output, and result data was permanently deleted. Null if data has not been deleted.

  - `engine: Literal["boltz-sm-design"]`

    Engine used for small molecule design

    - `"boltz-sm-design"`

  - `engine_version: str`

    Engine version used for small molecule design

  - `error: Optional[Error]`

    - `code: str`

      Machine-readable error code

    - `message: str`

      Human-readable error message

    - `details: Optional[object]`

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

  - `input: Optional[Input]`

    Pipeline input (null if data deleted)

    - `num_molecules: int`

      Number of molecules to generate. Must be between 10 and 1,000,000.

    - `target: InputTarget`

      Target protein with binding pocket for small molecule design or screening

      - `entities: List[InputTargetEntity]`

        Protein entities defining the target structure. Each entity represents a protein chain.

        - `chain_ids: List[str]`

          Chain IDs for this entity

        - `type: Literal["protein"]`

          - `"protein"`

        - `value: str`

          Amino acid sequence (one-letter codes)

        - `cyclic: Optional[bool]`

          Whether the sequence is cyclic

        - `modifications: Optional[List[InputTargetEntityModification]]`

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

          - `class InputTargetEntityModificationCcdModificationResponse: …`

            - `residue_index: int`

              0-based index of the residue to modify

            - `type: Literal["ccd"]`

              - `"ccd"`

            - `value: str`

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

          - `class InputTargetEntityModificationSmilesModificationResponse: …`

            - `residue_index: int`

              0-based index of the residue to modify

            - `type: Literal["smiles"]`

              - `"smiles"`

            - `value: str`

              SMILES string for the modification

      - `bonds: Optional[List[InputTargetBond]]`

        Covalent bond constraints between atoms in the target complex. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

        - `atom1: InputTargetBondAtom1`

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

          - `class InputTargetBondAtom1LigandAtomResponse: …`

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

            - `atom_name: str`

              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: str`

              Chain ID containing the atom

            - `type: Literal["ligand_atom"]`

              - `"ligand_atom"`

          - `class InputTargetBondAtom1PolymerAtomResponse: …`

            - `atom_name: str`

              Standardized atom name (verifiable in CIF file on RCSB)

            - `chain_id: str`

              Chain ID containing the atom

            - `residue_index: int`

              0-based residue index

            - `type: Literal["polymer_atom"]`

              - `"polymer_atom"`

        - `atom2: InputTargetBondAtom2`

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

          - `class InputTargetBondAtom2LigandAtomResponse: …`

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

            - `atom_name: str`

              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: str`

              Chain ID containing the atom

            - `type: Literal["ligand_atom"]`

              - `"ligand_atom"`

          - `class InputTargetBondAtom2PolymerAtomResponse: …`

            - `atom_name: str`

              Standardized atom name (verifiable in CIF file on RCSB)

            - `chain_id: str`

              Chain ID containing the atom

            - `residue_index: int`

              0-based residue index

            - `type: Literal["polymer_atom"]`

              - `"polymer_atom"`

      - `constraints: Optional[List[InputTargetConstraint]]`

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

        - `class InputTargetConstraintPocketConstraintResponse: …`

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

          - `binder_chain_id: str`

            Chain ID of the binder molecule

          - `contact_residues: Dict[str, List[int]]`

            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: float`

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

          - `type: Literal["pocket"]`

            - `"pocket"`

          - `force: Optional[bool]`

            Whether to force the constraint

        - `class InputTargetConstraintContactConstraintResponse: …`

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

          - `max_distance_angstrom: float`

            Maximum distance in Angstroms

          - `token1: InputTargetConstraintContactConstraintResponseToken1`

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

            - `class InputTargetConstraintContactConstraintResponseToken1PolymerContactTokenResponse: …`

              - `chain_id: str`

                Chain ID

              - `residue_index: int`

                0-based residue index

              - `type: Literal["polymer_contact"]`

                - `"polymer_contact"`

            - `class InputTargetConstraintContactConstraintResponseToken1LigandContactTokenResponse: …`

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

              - `atom_name: str`

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

              - `chain_id: str`

                Chain ID

              - `type: Literal["ligand_contact"]`

                - `"ligand_contact"`

          - `token2: InputTargetConstraintContactConstraintResponseToken2`

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

            - `class InputTargetConstraintContactConstraintResponseToken2PolymerContactTokenResponse: …`

              - `chain_id: str`

                Chain ID

              - `residue_index: int`

                0-based residue index

              - `type: Literal["polymer_contact"]`

                - `"polymer_contact"`

            - `class InputTargetConstraintContactConstraintResponseToken2LigandContactTokenResponse: …`

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

              - `atom_name: str`

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

              - `chain_id: str`

                Chain ID

              - `type: Literal["ligand_contact"]`

                - `"ligand_contact"`

          - `type: Literal["contact"]`

            - `"contact"`

          - `force: Optional[bool]`

            Whether to force the constraint

      - `pocket_residues: Optional[Dict[str, List[int]]]`

        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 binding pocket on that chain. When provided, these residues guide pocket extraction and add a derived pocket constraint during affinity predictions. That derived constraint remains separate from any explicit pocket constraints in target.constraints. When omitted, the model auto-detects the pocket.

      - `reference_ligands: Optional[List[str]]`

        Reference ligands as SMILES strings that help the model identify the binding pocket. When omitted, a set of drug-like default ligands is used for pocket detection.

    - `chemical_space: Optional[Literal["enamine_real"]]`

      Chemical space to constrain generated molecules. Currently only 'enamine_real' (Enamine REAL chemical space) is supported. Additional options may be added in the future.

      - `"enamine_real"`

    - `idempotency_key: Optional[str]`

      Client-provided key to prevent duplicate submissions on retries

    - `molecule_filters: Optional[InputMoleculeFilters]`

      Molecule filtering configuration. Controls both Boltz built-in SMARTS filtering and custom filters.

      - `boltz_smarts_catalog_filter_level: Optional[Literal["recommended", "extra", "aggressive", "disabled"]]`

        Controls the stringency of Boltz's built-in SMARTS structural alert filtering, which removes molecules matching known problematic substructures. 'recommended' (default): applies a curated set of alerts balancing safety and hit rate. 'extra': adds additional alerts beyond the recommended set for stricter filtering. 'aggressive': applies the most comprehensive alert set — may reject viable molecules. 'disabled': turns off Boltz SMARTS filtering entirely; only custom_filters will be applied.

        - `"recommended"`

        - `"extra"`

        - `"aggressive"`

        - `"disabled"`

      - `custom_filters: Optional[List[InputMoleculeFiltersCustomFilter]]`

        Custom filters to apply. Molecules must pass all filters (AND logic).

        - `class InputMoleculeFiltersCustomFilterLipinskiFilterResponse: …`

          Lipinski's Rule of Five filter. Rejects molecules that violate drug-likeness criteria based on molecular weight, LogP, hydrogen bond donors, and hydrogen bond acceptors.

          - `max_hba: float`

            Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

          - `max_hbd: float`

            Maximum number of hydrogen bond donors. Lipinski threshold: 5

          - `max_logp: float`

            Maximum LogP. Lipinski threshold: 5

          - `max_mw: float`

            Maximum molecular weight (Da). Lipinski threshold: 500

          - `type: Literal["lipinski_filter"]`

            - `"lipinski_filter"`

          - `allow_single_violation: Optional[bool]`

            If true, one rule violation is allowed (classic Rule of Five). Defaults to false (all rules must pass).

        - `class InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponse: …`

          Filter molecules by RDKit molecular descriptors. Each descriptor is constrained to a min/max range. Only descriptors you provide are checked — omitted descriptors are unconstrained.

          - `type: Literal["rdkit_descriptor_filter"]`

            - `"rdkit_descriptor_filter"`

          - `fraction_csp3: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseFractionCsp3]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `mol_logp: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseMolLogp]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `mol_wt: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseMolWt]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_aromatic_rings: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumAromaticRings]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_h_acceptors: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHAcceptors]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_h_donors: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHDonors]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_heteroatoms: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHeteroatoms]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_rings: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumRings]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_rotatable_bonds: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumRotatableBonds]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `tpsa: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseTpsa]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

        - `class InputMoleculeFiltersCustomFilterSmartsCustomFilterResponse: …`

          Filter molecules by custom SMARTS patterns. Molecules matching any pattern are rejected.

          - `patterns: List[str]`

            SMARTS patterns. Molecules matching any pattern are rejected.

          - `type: Literal["smarts_custom_filter"]`

            - `"smarts_custom_filter"`

        - `class InputMoleculeFiltersCustomFilterSmartsCatalogFilterResponse: …`

          Filter molecules using a predefined SMARTS catalog of structural alerts.

          - `catalog: Literal["PAINS", "PAINS_A", "PAINS_B", 11 more]`

            Predefined SMARTS catalog to apply. PAINS, BRENK, ChEMBL, and NIH catalogs reject known problematic substructures.

            - `"PAINS"`

            - `"PAINS_A"`

            - `"PAINS_B"`

            - `"PAINS_C"`

            - `"BRENK"`

            - `"CHEMBL"`

            - `"CHEMBL_BMS"`

            - `"CHEMBL_Dundee"`

            - `"CHEMBL_Glaxo"`

            - `"CHEMBL_Inpharmatica"`

            - `"CHEMBL_LINT"`

            - `"CHEMBL_MLSMR"`

            - `"CHEMBL_SureChEMBL"`

            - `"NIH"`

          - `type: Literal["smarts_catalog_filter"]`

            - `"smarts_catalog_filter"`

        - `class InputMoleculeFiltersCustomFilterSmilesRegexFilterResponse: …`

          Filter molecules by regex patterns on their SMILES representation.

          - `patterns: List[str]`

            Regex patterns applied to SMILES strings. Molecules matching any pattern are rejected.

          - `type: Literal["smiles_regex_filter"]`

            - `"smiles_regex_filter"`

    - `workspace_id: Optional[str]`

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

  - `livemode: bool`

    Whether this resource was created with a live API key.

  - `progress: Optional[Progress]`

    - `num_molecules_generated: int`

      Number of molecules generated so far

    - `total_molecules_to_generate: int`

      Total number of molecules requested

    - `latest_result_id: Optional[str]`

      ID of the most recently generated result

  - `started_at: Optional[datetime]`

  - `status: Literal["pending", "running", "succeeded", 2 more]`

    - `"pending"`

    - `"running"`

    - `"succeeded"`

    - `"failed"`

    - `"stopped"`

  - `stopped_at: Optional[datetime]`

  - `workspace_id: str`

    Workspace ID

  - `idempotency_key: Optional[str]`

    Client-provided idempotency key

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
response = client.small_molecule.design.start(
    num_molecules=10,
    target={
        "entities": [{
            "chain_ids": ["string"],
            "type": "protein",
            "value": "value",
        }]
    },
)
print(response.id)
```

## List

`small_molecule.design.list(DesignListParams**kwargs)  -> SyncCursorPage[DesignListResponse]`

**get** `/compute/v1/small-molecule/design`

List small molecule design runs, optionally filtered by workspace

### Parameters

- `after_id: Optional[str]`

  Return results after this ID

- `before_id: Optional[str]`

  Return results before this ID

- `limit: Optional[int]`

  Max items to return. Defaults to 100.

- `workspace_id: Optional[str]`

  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

- `class DesignListResponse: …`

  Summary of a small molecule design engine run (excludes input)

  - `id: str`

    Unique SmDesignRunSummary identifier

  - `completed_at: Optional[datetime]`

  - `created_at: datetime`

  - `data_deleted_at: Optional[datetime]`

    When the input, output, and result data was permanently deleted. Null if data has not been deleted.

  - `engine: Literal["boltz-sm-design"]`

    Engine used for small molecule design

    - `"boltz-sm-design"`

  - `engine_version: str`

    Engine version used for small molecule design

  - `error: Optional[Error]`

    - `code: str`

      Machine-readable error code

    - `message: str`

      Human-readable error message

    - `details: Optional[object]`

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

  - `livemode: bool`

    Whether this resource was created with a live API key.

  - `progress: Optional[Progress]`

    - `num_molecules_generated: int`

      Number of molecules generated so far

    - `total_molecules_to_generate: int`

      Total number of molecules requested

    - `latest_result_id: Optional[str]`

      ID of the most recently generated result

  - `started_at: Optional[datetime]`

  - `status: Literal["pending", "running", "succeeded", 2 more]`

    - `"pending"`

    - `"running"`

    - `"succeeded"`

    - `"failed"`

    - `"stopped"`

  - `stopped_at: Optional[datetime]`

  - `workspace_id: str`

    Workspace ID

  - `idempotency_key: Optional[str]`

    Client-provided idempotency key

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
page = client.small_molecule.design.list()
page = page.data[0]
print(page.id)
```

## Retrieve

`small_molecule.design.retrieve(strid, DesignRetrieveParams**kwargs)  -> DesignRetrieveResponse`

**get** `/compute/v1/small-molecule/design/{id}`

Retrieve a design run by ID, including progress and status

### Parameters

- `id: str`

- `workspace_id: Optional[str]`

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

### Returns

- `class DesignRetrieveResponse: …`

  A small molecule design engine run that generates novel molecules

  - `id: str`

    Unique SmDesignRun identifier

  - `completed_at: Optional[datetime]`

  - `created_at: datetime`

  - `data_deleted_at: Optional[datetime]`

    When the input, output, and result data was permanently deleted. Null if data has not been deleted.

  - `engine: Literal["boltz-sm-design"]`

    Engine used for small molecule design

    - `"boltz-sm-design"`

  - `engine_version: str`

    Engine version used for small molecule design

  - `error: Optional[Error]`

    - `code: str`

      Machine-readable error code

    - `message: str`

      Human-readable error message

    - `details: Optional[object]`

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

  - `input: Optional[Input]`

    Pipeline input (null if data deleted)

    - `num_molecules: int`

      Number of molecules to generate. Must be between 10 and 1,000,000.

    - `target: InputTarget`

      Target protein with binding pocket for small molecule design or screening

      - `entities: List[InputTargetEntity]`

        Protein entities defining the target structure. Each entity represents a protein chain.

        - `chain_ids: List[str]`

          Chain IDs for this entity

        - `type: Literal["protein"]`

          - `"protein"`

        - `value: str`

          Amino acid sequence (one-letter codes)

        - `cyclic: Optional[bool]`

          Whether the sequence is cyclic

        - `modifications: Optional[List[InputTargetEntityModification]]`

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

          - `class InputTargetEntityModificationCcdModificationResponse: …`

            - `residue_index: int`

              0-based index of the residue to modify

            - `type: Literal["ccd"]`

              - `"ccd"`

            - `value: str`

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

          - `class InputTargetEntityModificationSmilesModificationResponse: …`

            - `residue_index: int`

              0-based index of the residue to modify

            - `type: Literal["smiles"]`

              - `"smiles"`

            - `value: str`

              SMILES string for the modification

      - `bonds: Optional[List[InputTargetBond]]`

        Covalent bond constraints between atoms in the target complex. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

        - `atom1: InputTargetBondAtom1`

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

          - `class InputTargetBondAtom1LigandAtomResponse: …`

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

            - `atom_name: str`

              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: str`

              Chain ID containing the atom

            - `type: Literal["ligand_atom"]`

              - `"ligand_atom"`

          - `class InputTargetBondAtom1PolymerAtomResponse: …`

            - `atom_name: str`

              Standardized atom name (verifiable in CIF file on RCSB)

            - `chain_id: str`

              Chain ID containing the atom

            - `residue_index: int`

              0-based residue index

            - `type: Literal["polymer_atom"]`

              - `"polymer_atom"`

        - `atom2: InputTargetBondAtom2`

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

          - `class InputTargetBondAtom2LigandAtomResponse: …`

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

            - `atom_name: str`

              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: str`

              Chain ID containing the atom

            - `type: Literal["ligand_atom"]`

              - `"ligand_atom"`

          - `class InputTargetBondAtom2PolymerAtomResponse: …`

            - `atom_name: str`

              Standardized atom name (verifiable in CIF file on RCSB)

            - `chain_id: str`

              Chain ID containing the atom

            - `residue_index: int`

              0-based residue index

            - `type: Literal["polymer_atom"]`

              - `"polymer_atom"`

      - `constraints: Optional[List[InputTargetConstraint]]`

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

        - `class InputTargetConstraintPocketConstraintResponse: …`

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

          - `binder_chain_id: str`

            Chain ID of the binder molecule

          - `contact_residues: Dict[str, List[int]]`

            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: float`

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

          - `type: Literal["pocket"]`

            - `"pocket"`

          - `force: Optional[bool]`

            Whether to force the constraint

        - `class InputTargetConstraintContactConstraintResponse: …`

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

          - `max_distance_angstrom: float`

            Maximum distance in Angstroms

          - `token1: InputTargetConstraintContactConstraintResponseToken1`

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

            - `class InputTargetConstraintContactConstraintResponseToken1PolymerContactTokenResponse: …`

              - `chain_id: str`

                Chain ID

              - `residue_index: int`

                0-based residue index

              - `type: Literal["polymer_contact"]`

                - `"polymer_contact"`

            - `class InputTargetConstraintContactConstraintResponseToken1LigandContactTokenResponse: …`

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

              - `atom_name: str`

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

              - `chain_id: str`

                Chain ID

              - `type: Literal["ligand_contact"]`

                - `"ligand_contact"`

          - `token2: InputTargetConstraintContactConstraintResponseToken2`

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

            - `class InputTargetConstraintContactConstraintResponseToken2PolymerContactTokenResponse: …`

              - `chain_id: str`

                Chain ID

              - `residue_index: int`

                0-based residue index

              - `type: Literal["polymer_contact"]`

                - `"polymer_contact"`

            - `class InputTargetConstraintContactConstraintResponseToken2LigandContactTokenResponse: …`

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

              - `atom_name: str`

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

              - `chain_id: str`

                Chain ID

              - `type: Literal["ligand_contact"]`

                - `"ligand_contact"`

          - `type: Literal["contact"]`

            - `"contact"`

          - `force: Optional[bool]`

            Whether to force the constraint

      - `pocket_residues: Optional[Dict[str, List[int]]]`

        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 binding pocket on that chain. When provided, these residues guide pocket extraction and add a derived pocket constraint during affinity predictions. That derived constraint remains separate from any explicit pocket constraints in target.constraints. When omitted, the model auto-detects the pocket.

      - `reference_ligands: Optional[List[str]]`

        Reference ligands as SMILES strings that help the model identify the binding pocket. When omitted, a set of drug-like default ligands is used for pocket detection.

    - `chemical_space: Optional[Literal["enamine_real"]]`

      Chemical space to constrain generated molecules. Currently only 'enamine_real' (Enamine REAL chemical space) is supported. Additional options may be added in the future.

      - `"enamine_real"`

    - `idempotency_key: Optional[str]`

      Client-provided key to prevent duplicate submissions on retries

    - `molecule_filters: Optional[InputMoleculeFilters]`

      Molecule filtering configuration. Controls both Boltz built-in SMARTS filtering and custom filters.

      - `boltz_smarts_catalog_filter_level: Optional[Literal["recommended", "extra", "aggressive", "disabled"]]`

        Controls the stringency of Boltz's built-in SMARTS structural alert filtering, which removes molecules matching known problematic substructures. 'recommended' (default): applies a curated set of alerts balancing safety and hit rate. 'extra': adds additional alerts beyond the recommended set for stricter filtering. 'aggressive': applies the most comprehensive alert set — may reject viable molecules. 'disabled': turns off Boltz SMARTS filtering entirely; only custom_filters will be applied.

        - `"recommended"`

        - `"extra"`

        - `"aggressive"`

        - `"disabled"`

      - `custom_filters: Optional[List[InputMoleculeFiltersCustomFilter]]`

        Custom filters to apply. Molecules must pass all filters (AND logic).

        - `class InputMoleculeFiltersCustomFilterLipinskiFilterResponse: …`

          Lipinski's Rule of Five filter. Rejects molecules that violate drug-likeness criteria based on molecular weight, LogP, hydrogen bond donors, and hydrogen bond acceptors.

          - `max_hba: float`

            Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

          - `max_hbd: float`

            Maximum number of hydrogen bond donors. Lipinski threshold: 5

          - `max_logp: float`

            Maximum LogP. Lipinski threshold: 5

          - `max_mw: float`

            Maximum molecular weight (Da). Lipinski threshold: 500

          - `type: Literal["lipinski_filter"]`

            - `"lipinski_filter"`

          - `allow_single_violation: Optional[bool]`

            If true, one rule violation is allowed (classic Rule of Five). Defaults to false (all rules must pass).

        - `class InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponse: …`

          Filter molecules by RDKit molecular descriptors. Each descriptor is constrained to a min/max range. Only descriptors you provide are checked — omitted descriptors are unconstrained.

          - `type: Literal["rdkit_descriptor_filter"]`

            - `"rdkit_descriptor_filter"`

          - `fraction_csp3: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseFractionCsp3]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `mol_logp: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseMolLogp]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `mol_wt: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseMolWt]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_aromatic_rings: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumAromaticRings]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_h_acceptors: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHAcceptors]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_h_donors: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHDonors]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_heteroatoms: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHeteroatoms]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_rings: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumRings]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_rotatable_bonds: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumRotatableBonds]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `tpsa: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseTpsa]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

        - `class InputMoleculeFiltersCustomFilterSmartsCustomFilterResponse: …`

          Filter molecules by custom SMARTS patterns. Molecules matching any pattern are rejected.

          - `patterns: List[str]`

            SMARTS patterns. Molecules matching any pattern are rejected.

          - `type: Literal["smarts_custom_filter"]`

            - `"smarts_custom_filter"`

        - `class InputMoleculeFiltersCustomFilterSmartsCatalogFilterResponse: …`

          Filter molecules using a predefined SMARTS catalog of structural alerts.

          - `catalog: Literal["PAINS", "PAINS_A", "PAINS_B", 11 more]`

            Predefined SMARTS catalog to apply. PAINS, BRENK, ChEMBL, and NIH catalogs reject known problematic substructures.

            - `"PAINS"`

            - `"PAINS_A"`

            - `"PAINS_B"`

            - `"PAINS_C"`

            - `"BRENK"`

            - `"CHEMBL"`

            - `"CHEMBL_BMS"`

            - `"CHEMBL_Dundee"`

            - `"CHEMBL_Glaxo"`

            - `"CHEMBL_Inpharmatica"`

            - `"CHEMBL_LINT"`

            - `"CHEMBL_MLSMR"`

            - `"CHEMBL_SureChEMBL"`

            - `"NIH"`

          - `type: Literal["smarts_catalog_filter"]`

            - `"smarts_catalog_filter"`

        - `class InputMoleculeFiltersCustomFilterSmilesRegexFilterResponse: …`

          Filter molecules by regex patterns on their SMILES representation.

          - `patterns: List[str]`

            Regex patterns applied to SMILES strings. Molecules matching any pattern are rejected.

          - `type: Literal["smiles_regex_filter"]`

            - `"smiles_regex_filter"`

    - `workspace_id: Optional[str]`

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

  - `livemode: bool`

    Whether this resource was created with a live API key.

  - `progress: Optional[Progress]`

    - `num_molecules_generated: int`

      Number of molecules generated so far

    - `total_molecules_to_generate: int`

      Total number of molecules requested

    - `latest_result_id: Optional[str]`

      ID of the most recently generated result

  - `started_at: Optional[datetime]`

  - `status: Literal["pending", "running", "succeeded", 2 more]`

    - `"pending"`

    - `"running"`

    - `"succeeded"`

    - `"failed"`

    - `"stopped"`

  - `stopped_at: Optional[datetime]`

  - `workspace_id: str`

    Workspace ID

  - `idempotency_key: Optional[str]`

    Client-provided idempotency key

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
design = client.small_molecule.design.retrieve(
    id="id",
)
print(design.id)
```

## List Results

`small_molecule.design.list_results(strid, DesignListResultsParams**kwargs)  -> SyncCursorPage[DesignListResultsResponse]`

**get** `/compute/v1/small-molecule/design/{id}/results`

Retrieve paginated results from a design run

### Parameters

- `id: str`

- `after_id: Optional[str]`

  Return results after this ID

- `before_id: Optional[str]`

  Return results before this ID

- `limit: Optional[int]`

  Max results to return. Defaults to 100.

- `workspace_id: Optional[str]`

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

### Returns

- `class DesignListResultsResponse: …`

  A single designed small molecule result

  - `id: str`

    Unique result ID

  - `artifacts: Artifacts`

    - `archive: ArtifactsArchive`

      - `url: str`

        URL to download the file

      - `url_expires_at: datetime`

        When the presigned URL expires

    - `structure: ArtifactsStructure`

      - `url: str`

        URL to download the file

      - `url_expires_at: datetime`

        When the presigned URL expires

  - `created_at: datetime`

  - `metrics: Metrics`

    Scoring metrics for a designed small molecule

    - `binding_confidence: float`

      Confidence that the molecule binds the target (0-1). Primary metric for hit discovery.

    - `complex_iplddt: float`

      Interface pLDDT for the complex (0-1 float). Confidence at the binding interface.

    - `complex_plddt: float`

      pLDDT for the full complex (0-1 float).

    - `iptm: float`

      Interface predicted TM score (0-1). Confidence in relative positioning of ligand and protein.

    - `optimization_score: float`

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

    - `ptm: float`

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

    - `structure_confidence: float`

      Confidence in the predicted 3D structure (0-1).

  - `smiles: str`

    SMILES string of the designed molecule

  - `warnings: Optional[List[Warning]]`

    Warnings about potential quality issues with this result.

    - `code: str`

      Machine-readable warning code (e.g. "low_confidence", "unusual_geometry")

    - `message: str`

      Human-readable description of the warning

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
page = client.small_molecule.design.list_results(
    id="id",
)
page = page.data[0]
print(page.id)
```

## Stop

`small_molecule.design.stop(strid)  -> DesignStopResponse`

**post** `/compute/v1/small-molecule/design/{id}/stop`

Stop an in-progress design run early

### Parameters

- `id: str`

### Returns

- `class DesignStopResponse: …`

  A small molecule design engine run that generates novel molecules

  - `id: str`

    Unique SmDesignRun identifier

  - `completed_at: Optional[datetime]`

  - `created_at: datetime`

  - `data_deleted_at: Optional[datetime]`

    When the input, output, and result data was permanently deleted. Null if data has not been deleted.

  - `engine: Literal["boltz-sm-design"]`

    Engine used for small molecule design

    - `"boltz-sm-design"`

  - `engine_version: str`

    Engine version used for small molecule design

  - `error: Optional[Error]`

    - `code: str`

      Machine-readable error code

    - `message: str`

      Human-readable error message

    - `details: Optional[object]`

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

  - `input: Optional[Input]`

    Pipeline input (null if data deleted)

    - `num_molecules: int`

      Number of molecules to generate. Must be between 10 and 1,000,000.

    - `target: InputTarget`

      Target protein with binding pocket for small molecule design or screening

      - `entities: List[InputTargetEntity]`

        Protein entities defining the target structure. Each entity represents a protein chain.

        - `chain_ids: List[str]`

          Chain IDs for this entity

        - `type: Literal["protein"]`

          - `"protein"`

        - `value: str`

          Amino acid sequence (one-letter codes)

        - `cyclic: Optional[bool]`

          Whether the sequence is cyclic

        - `modifications: Optional[List[InputTargetEntityModification]]`

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

          - `class InputTargetEntityModificationCcdModificationResponse: …`

            - `residue_index: int`

              0-based index of the residue to modify

            - `type: Literal["ccd"]`

              - `"ccd"`

            - `value: str`

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

          - `class InputTargetEntityModificationSmilesModificationResponse: …`

            - `residue_index: int`

              0-based index of the residue to modify

            - `type: Literal["smiles"]`

              - `"smiles"`

            - `value: str`

              SMILES string for the modification

      - `bonds: Optional[List[InputTargetBond]]`

        Covalent bond constraints between atoms in the target complex. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

        - `atom1: InputTargetBondAtom1`

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

          - `class InputTargetBondAtom1LigandAtomResponse: …`

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

            - `atom_name: str`

              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: str`

              Chain ID containing the atom

            - `type: Literal["ligand_atom"]`

              - `"ligand_atom"`

          - `class InputTargetBondAtom1PolymerAtomResponse: …`

            - `atom_name: str`

              Standardized atom name (verifiable in CIF file on RCSB)

            - `chain_id: str`

              Chain ID containing the atom

            - `residue_index: int`

              0-based residue index

            - `type: Literal["polymer_atom"]`

              - `"polymer_atom"`

        - `atom2: InputTargetBondAtom2`

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

          - `class InputTargetBondAtom2LigandAtomResponse: …`

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

            - `atom_name: str`

              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: str`

              Chain ID containing the atom

            - `type: Literal["ligand_atom"]`

              - `"ligand_atom"`

          - `class InputTargetBondAtom2PolymerAtomResponse: …`

            - `atom_name: str`

              Standardized atom name (verifiable in CIF file on RCSB)

            - `chain_id: str`

              Chain ID containing the atom

            - `residue_index: int`

              0-based residue index

            - `type: Literal["polymer_atom"]`

              - `"polymer_atom"`

      - `constraints: Optional[List[InputTargetConstraint]]`

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

        - `class InputTargetConstraintPocketConstraintResponse: …`

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

          - `binder_chain_id: str`

            Chain ID of the binder molecule

          - `contact_residues: Dict[str, List[int]]`

            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: float`

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

          - `type: Literal["pocket"]`

            - `"pocket"`

          - `force: Optional[bool]`

            Whether to force the constraint

        - `class InputTargetConstraintContactConstraintResponse: …`

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

          - `max_distance_angstrom: float`

            Maximum distance in Angstroms

          - `token1: InputTargetConstraintContactConstraintResponseToken1`

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

            - `class InputTargetConstraintContactConstraintResponseToken1PolymerContactTokenResponse: …`

              - `chain_id: str`

                Chain ID

              - `residue_index: int`

                0-based residue index

              - `type: Literal["polymer_contact"]`

                - `"polymer_contact"`

            - `class InputTargetConstraintContactConstraintResponseToken1LigandContactTokenResponse: …`

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

              - `atom_name: str`

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

              - `chain_id: str`

                Chain ID

              - `type: Literal["ligand_contact"]`

                - `"ligand_contact"`

          - `token2: InputTargetConstraintContactConstraintResponseToken2`

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

            - `class InputTargetConstraintContactConstraintResponseToken2PolymerContactTokenResponse: …`

              - `chain_id: str`

                Chain ID

              - `residue_index: int`

                0-based residue index

              - `type: Literal["polymer_contact"]`

                - `"polymer_contact"`

            - `class InputTargetConstraintContactConstraintResponseToken2LigandContactTokenResponse: …`

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

              - `atom_name: str`

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

              - `chain_id: str`

                Chain ID

              - `type: Literal["ligand_contact"]`

                - `"ligand_contact"`

          - `type: Literal["contact"]`

            - `"contact"`

          - `force: Optional[bool]`

            Whether to force the constraint

      - `pocket_residues: Optional[Dict[str, List[int]]]`

        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 binding pocket on that chain. When provided, these residues guide pocket extraction and add a derived pocket constraint during affinity predictions. That derived constraint remains separate from any explicit pocket constraints in target.constraints. When omitted, the model auto-detects the pocket.

      - `reference_ligands: Optional[List[str]]`

        Reference ligands as SMILES strings that help the model identify the binding pocket. When omitted, a set of drug-like default ligands is used for pocket detection.

    - `chemical_space: Optional[Literal["enamine_real"]]`

      Chemical space to constrain generated molecules. Currently only 'enamine_real' (Enamine REAL chemical space) is supported. Additional options may be added in the future.

      - `"enamine_real"`

    - `idempotency_key: Optional[str]`

      Client-provided key to prevent duplicate submissions on retries

    - `molecule_filters: Optional[InputMoleculeFilters]`

      Molecule filtering configuration. Controls both Boltz built-in SMARTS filtering and custom filters.

      - `boltz_smarts_catalog_filter_level: Optional[Literal["recommended", "extra", "aggressive", "disabled"]]`

        Controls the stringency of Boltz's built-in SMARTS structural alert filtering, which removes molecules matching known problematic substructures. 'recommended' (default): applies a curated set of alerts balancing safety and hit rate. 'extra': adds additional alerts beyond the recommended set for stricter filtering. 'aggressive': applies the most comprehensive alert set — may reject viable molecules. 'disabled': turns off Boltz SMARTS filtering entirely; only custom_filters will be applied.

        - `"recommended"`

        - `"extra"`

        - `"aggressive"`

        - `"disabled"`

      - `custom_filters: Optional[List[InputMoleculeFiltersCustomFilter]]`

        Custom filters to apply. Molecules must pass all filters (AND logic).

        - `class InputMoleculeFiltersCustomFilterLipinskiFilterResponse: …`

          Lipinski's Rule of Five filter. Rejects molecules that violate drug-likeness criteria based on molecular weight, LogP, hydrogen bond donors, and hydrogen bond acceptors.

          - `max_hba: float`

            Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

          - `max_hbd: float`

            Maximum number of hydrogen bond donors. Lipinski threshold: 5

          - `max_logp: float`

            Maximum LogP. Lipinski threshold: 5

          - `max_mw: float`

            Maximum molecular weight (Da). Lipinski threshold: 500

          - `type: Literal["lipinski_filter"]`

            - `"lipinski_filter"`

          - `allow_single_violation: Optional[bool]`

            If true, one rule violation is allowed (classic Rule of Five). Defaults to false (all rules must pass).

        - `class InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponse: …`

          Filter molecules by RDKit molecular descriptors. Each descriptor is constrained to a min/max range. Only descriptors you provide are checked — omitted descriptors are unconstrained.

          - `type: Literal["rdkit_descriptor_filter"]`

            - `"rdkit_descriptor_filter"`

          - `fraction_csp3: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseFractionCsp3]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `mol_logp: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseMolLogp]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `mol_wt: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseMolWt]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_aromatic_rings: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumAromaticRings]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_h_acceptors: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHAcceptors]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_h_donors: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHDonors]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_heteroatoms: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumHeteroatoms]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_rings: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumRings]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `num_rotatable_bonds: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseNumRotatableBonds]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

          - `tpsa: Optional[InputMoleculeFiltersCustomFilterRdkitDescriptorFilterResponseTpsa]`

            Min/max range constraint for an RDKit molecular descriptor

            - `max: Optional[float]`

              Maximum allowed value (inclusive)

            - `min: Optional[float]`

              Minimum allowed value (inclusive)

        - `class InputMoleculeFiltersCustomFilterSmartsCustomFilterResponse: …`

          Filter molecules by custom SMARTS patterns. Molecules matching any pattern are rejected.

          - `patterns: List[str]`

            SMARTS patterns. Molecules matching any pattern are rejected.

          - `type: Literal["smarts_custom_filter"]`

            - `"smarts_custom_filter"`

        - `class InputMoleculeFiltersCustomFilterSmartsCatalogFilterResponse: …`

          Filter molecules using a predefined SMARTS catalog of structural alerts.

          - `catalog: Literal["PAINS", "PAINS_A", "PAINS_B", 11 more]`

            Predefined SMARTS catalog to apply. PAINS, BRENK, ChEMBL, and NIH catalogs reject known problematic substructures.

            - `"PAINS"`

            - `"PAINS_A"`

            - `"PAINS_B"`

            - `"PAINS_C"`

            - `"BRENK"`

            - `"CHEMBL"`

            - `"CHEMBL_BMS"`

            - `"CHEMBL_Dundee"`

            - `"CHEMBL_Glaxo"`

            - `"CHEMBL_Inpharmatica"`

            - `"CHEMBL_LINT"`

            - `"CHEMBL_MLSMR"`

            - `"CHEMBL_SureChEMBL"`

            - `"NIH"`

          - `type: Literal["smarts_catalog_filter"]`

            - `"smarts_catalog_filter"`

        - `class InputMoleculeFiltersCustomFilterSmilesRegexFilterResponse: …`

          Filter molecules by regex patterns on their SMILES representation.

          - `patterns: List[str]`

            Regex patterns applied to SMILES strings. Molecules matching any pattern are rejected.

          - `type: Literal["smiles_regex_filter"]`

            - `"smiles_regex_filter"`

    - `workspace_id: Optional[str]`

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

  - `livemode: bool`

    Whether this resource was created with a live API key.

  - `progress: Optional[Progress]`

    - `num_molecules_generated: int`

      Number of molecules generated so far

    - `total_molecules_to_generate: int`

      Total number of molecules requested

    - `latest_result_id: Optional[str]`

      ID of the most recently generated result

  - `started_at: Optional[datetime]`

  - `status: Literal["pending", "running", "succeeded", 2 more]`

    - `"pending"`

    - `"running"`

    - `"succeeded"`

    - `"failed"`

    - `"stopped"`

  - `stopped_at: Optional[datetime]`

  - `workspace_id: str`

    Workspace ID

  - `idempotency_key: Optional[str]`

    Client-provided idempotency key

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
response = client.small_molecule.design.stop(
    "id",
)
print(response.id)
```

## Delete Data

`small_molecule.design.delete_data(strid)  -> DesignDeleteDataResponse`

**post** `/compute/v1/small-molecule/design/{id}/delete-data`

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

### Parameters

- `id: str`

### Returns

- `class DesignDeleteDataResponse: …`

  - `id: str`

    ID of the resource whose data was deleted

  - `data_deleted: Literal[true]`

    - `true`

  - `data_deleted_at: datetime`

    When the data was deleted

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
response = client.small_molecule.design.delete_data(
    "id",
)
print(response.id)
```

## Estimate Cost

`small_molecule.design.estimate_cost(DesignEstimateCostParams**kwargs)  -> DesignEstimateCostResponse`

**post** `/compute/v1/small-molecule/design/estimate-cost`

Estimate the billed cost of a small molecule design run without creating any resource or consuming GPU. Includes the SynFlowNet generation charges implied by the scheduler iteration cap plus Boltz2 scoring for each requested molecule.

### Parameters

- `num_molecules: int`

  Number of molecules to generate. Must be between 10 and 1,000,000.

- `target: Target`

  Target protein with binding pocket for small molecule design or screening

  - `entities: Iterable[TargetEntity]`

    Protein entities defining the target structure. Each entity represents a protein chain.

    - `chain_ids: SequenceNotStr[str]`

      Chain IDs for this entity

    - `type: Literal["protein"]`

      - `"protein"`

    - `value: str`

      Amino acid sequence (one-letter codes)

    - `cyclic: Optional[bool]`

      Whether the sequence is cyclic

    - `modifications: Optional[Iterable[TargetEntityModification]]`

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

      - `class TargetEntityModificationCcdModification: …`

        - `residue_index: int`

          0-based index of the residue to modify

        - `type: Literal["ccd"]`

          - `"ccd"`

        - `value: str`

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

      - `class TargetEntityModificationSmilesModification: …`

        - `residue_index: int`

          0-based index of the residue to modify

        - `type: Literal["smiles"]`

          - `"smiles"`

        - `value: str`

          SMILES string for the modification

  - `bonds: Optional[Iterable[TargetBond]]`

    Covalent bond constraints between atoms in the target complex. Atom-level ligand references currently support ligand_ccd only; ligand_smiles is unsupported.

    - `atom1: TargetBondAtom1`

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

      - `class TargetBondAtom1LigandAtom: …`

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

        - `atom_name: str`

          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: str`

          Chain ID containing the atom

        - `type: Literal["ligand_atom"]`

          - `"ligand_atom"`

      - `class TargetBondAtom1PolymerAtom: …`

        - `atom_name: str`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: str`

          Chain ID containing the atom

        - `residue_index: int`

          0-based residue index

        - `type: Literal["polymer_atom"]`

          - `"polymer_atom"`

    - `atom2: TargetBondAtom2`

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

      - `class TargetBondAtom2LigandAtom: …`

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

        - `atom_name: str`

          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: str`

          Chain ID containing the atom

        - `type: Literal["ligand_atom"]`

          - `"ligand_atom"`

      - `class TargetBondAtom2PolymerAtom: …`

        - `atom_name: str`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: str`

          Chain ID containing the atom

        - `residue_index: int`

          0-based residue index

        - `type: Literal["polymer_atom"]`

          - `"polymer_atom"`

  - `constraints: Optional[Iterable[TargetConstraint]]`

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

    - `class TargetConstraintPocketConstraint: …`

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

      - `binder_chain_id: str`

        Chain ID of the binder molecule

      - `contact_residues: Dict[str, Iterable[int]]`

        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: float`

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

      - `type: Literal["pocket"]`

        - `"pocket"`

      - `force: Optional[bool]`

        Whether to force the constraint

    - `class TargetConstraintContactConstraint: …`

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

      - `max_distance_angstrom: float`

        Maximum distance in Angstroms

      - `token1: TargetConstraintContactConstraintToken1`

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

        - `class TargetConstraintContactConstraintToken1PolymerContactToken: …`

          - `chain_id: str`

            Chain ID

          - `residue_index: int`

            0-based residue index

          - `type: Literal["polymer_contact"]`

            - `"polymer_contact"`

        - `class TargetConstraintContactConstraintToken1LigandContactToken: …`

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

          - `atom_name: str`

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

          - `chain_id: str`

            Chain ID

          - `type: Literal["ligand_contact"]`

            - `"ligand_contact"`

      - `token2: TargetConstraintContactConstraintToken2`

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

        - `class TargetConstraintContactConstraintToken2PolymerContactToken: …`

          - `chain_id: str`

            Chain ID

          - `residue_index: int`

            0-based residue index

          - `type: Literal["polymer_contact"]`

            - `"polymer_contact"`

        - `class TargetConstraintContactConstraintToken2LigandContactToken: …`

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

          - `atom_name: str`

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

          - `chain_id: str`

            Chain ID

          - `type: Literal["ligand_contact"]`

            - `"ligand_contact"`

      - `type: Literal["contact"]`

        - `"contact"`

      - `force: Optional[bool]`

        Whether to force the constraint

  - `pocket_residues: Optional[Dict[str, Iterable[int]]]`

    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 binding pocket on that chain. When provided, these residues guide pocket extraction and add a derived pocket constraint during affinity predictions. That derived constraint remains separate from any explicit pocket constraints in target.constraints. When omitted, the model auto-detects the pocket.

  - `reference_ligands: Optional[SequenceNotStr[str]]`

    Reference ligands as SMILES strings that help the model identify the binding pocket. When omitted, a set of drug-like default ligands is used for pocket detection.

- `chemical_space: Optional[Literal["enamine_real"]]`

  Chemical space to constrain generated molecules. Currently only 'enamine_real' (Enamine REAL chemical space) is supported. Additional options may be added in the future.

  - `"enamine_real"`

- `idempotency_key: Optional[str]`

  Client-provided key to prevent duplicate submissions on retries

- `molecule_filters: Optional[MoleculeFilters]`

  Molecule filtering configuration. Controls both Boltz built-in SMARTS filtering and custom filters.

  - `boltz_smarts_catalog_filter_level: Optional[Literal["recommended", "extra", "aggressive", "disabled"]]`

    Controls the stringency of Boltz's built-in SMARTS structural alert filtering, which removes molecules matching known problematic substructures. 'recommended' (default): applies a curated set of alerts balancing safety and hit rate. 'extra': adds additional alerts beyond the recommended set for stricter filtering. 'aggressive': applies the most comprehensive alert set — may reject viable molecules. 'disabled': turns off Boltz SMARTS filtering entirely; only custom_filters will be applied.

    - `"recommended"`

    - `"extra"`

    - `"aggressive"`

    - `"disabled"`

  - `custom_filters: Optional[Iterable[MoleculeFiltersCustomFilter]]`

    Custom filters to apply. Molecules must pass all filters (AND logic).

    - `class MoleculeFiltersCustomFilterLipinskiFilter: …`

      Lipinski's Rule of Five filter. Rejects molecules that violate drug-likeness criteria based on molecular weight, LogP, hydrogen bond donors, and hydrogen bond acceptors.

      - `max_hba: float`

        Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

      - `max_hbd: float`

        Maximum number of hydrogen bond donors. Lipinski threshold: 5

      - `max_logp: float`

        Maximum LogP. Lipinski threshold: 5

      - `max_mw: float`

        Maximum molecular weight (Da). Lipinski threshold: 500

      - `type: Literal["lipinski_filter"]`

        - `"lipinski_filter"`

      - `allow_single_violation: Optional[bool]`

        If true, one rule violation is allowed (classic Rule of Five). Defaults to false (all rules must pass).

    - `class MoleculeFiltersCustomFilterRdkitDescriptorFilter: …`

      Filter molecules by RDKit molecular descriptors. Each descriptor is constrained to a min/max range. Only descriptors you provide are checked — omitted descriptors are unconstrained.

      - `type: Literal["rdkit_descriptor_filter"]`

        - `"rdkit_descriptor_filter"`

      - `fraction_csp3: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterFractionCsp3]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `mol_logp: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterMolLogp]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `mol_wt: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterMolWt]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_aromatic_rings: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumAromaticRings]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_h_acceptors: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumHAcceptors]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_h_donors: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumHDonors]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_heteroatoms: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumHeteroatoms]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_rings: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumRings]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `num_rotatable_bonds: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterNumRotatableBonds]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

      - `tpsa: Optional[MoleculeFiltersCustomFilterRdkitDescriptorFilterTpsa]`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: Optional[float]`

          Maximum allowed value (inclusive)

        - `min: Optional[float]`

          Minimum allowed value (inclusive)

    - `class MoleculeFiltersCustomFilterSmartsCustomFilter: …`

      Filter molecules by custom SMARTS patterns. Molecules matching any pattern are rejected.

      - `patterns: SequenceNotStr[str]`

        SMARTS patterns. Molecules matching any pattern are rejected.

      - `type: Literal["smarts_custom_filter"]`

        - `"smarts_custom_filter"`

    - `class MoleculeFiltersCustomFilterSmartsCatalogFilter: …`

      Filter molecules using a predefined SMARTS catalog of structural alerts.

      - `catalog: Literal["PAINS", "PAINS_A", "PAINS_B", 11 more]`

        Predefined SMARTS catalog to apply. PAINS, BRENK, ChEMBL, and NIH catalogs reject known problematic substructures.

        - `"PAINS"`

        - `"PAINS_A"`

        - `"PAINS_B"`

        - `"PAINS_C"`

        - `"BRENK"`

        - `"CHEMBL"`

        - `"CHEMBL_BMS"`

        - `"CHEMBL_Dundee"`

        - `"CHEMBL_Glaxo"`

        - `"CHEMBL_Inpharmatica"`

        - `"CHEMBL_LINT"`

        - `"CHEMBL_MLSMR"`

        - `"CHEMBL_SureChEMBL"`

        - `"NIH"`

      - `type: Literal["smarts_catalog_filter"]`

        - `"smarts_catalog_filter"`

    - `class MoleculeFiltersCustomFilterSmilesRegexFilter: …`

      Filter molecules by regex patterns on their SMILES representation.

      - `patterns: SequenceNotStr[str]`

        Regex patterns applied to SMILES strings. Molecules matching any pattern are rejected.

      - `type: Literal["smiles_regex_filter"]`

        - `"smiles_regex_filter"`

- `workspace_id: Optional[str]`

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

### Returns

- `class DesignEstimateCostResponse: …`

  Estimate response with monetary values encoded as decimal strings to preserve precision.

  - `breakdown: Breakdown`

    Cost breakdown for the billed application.

    - `application: Literal["structure_and_binding", "small_molecule_design", "small_molecule_library_screen", 3 more]`

      - `"structure_and_binding"`

      - `"small_molecule_design"`

      - `"small_molecule_library_screen"`

      - `"protein_design"`

      - `"protein_library_screen"`

      - `"adme"`

    - `cost_per_unit_usd: str`

      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: int`

      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: str`

  - `estimated_cost_usd: str`

    Estimated total cost as a decimal string

### Example

```python
import os
from boltz_api import Boltz

client = Boltz(
    api_key=os.environ.get("BOLTZ_API_KEY"),  # This is the default and can be omitted
)
response = client.small_molecule.design.estimate_cost(
    num_molecules=10,
    target={
        "entities": [{
            "chain_ids": ["string"],
            "type": "protein",
            "value": "value",
        }]
    },
)
print(response.breakdown)
```
