# Design

## Start

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

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

### Body Parameters

- `num_molecules: number`

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

- `target: object { entities, bonds, constraints, 2 more }`

  Target protein with binding pocket for small molecule design or screening

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

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

    - `chain_ids: array of string`

      Chain IDs for this entity

    - `type: "protein"`

      - `"protein"`

    - `value: string`

      Amino acid sequence (one-letter codes)

    - `cyclic: optional boolean`

      Whether the sequence is cyclic

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

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

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

        - `residue_index: number`

          0-based index of the residue to modify

        - `type: "ccd"`

          - `"ccd"`

        - `value: string`

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

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

        - `residue_index: number`

          0-based index of the residue to modify

        - `type: "smiles"`

          - `"smiles"`

        - `value: string`

          SMILES string for the modification

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

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

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

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

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

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

        - `atom_name: string`

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

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

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

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

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

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

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

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

        - `atom_name: string`

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

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

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

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

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

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

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

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

      - `binder_chain_id: string`

        Chain ID of the binder molecule

      - `contact_residues: map[array of number]`

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

      - `max_distance_angstrom: number`

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

      - `type: "pocket"`

        - `"pocket"`

      - `force: optional boolean`

        Whether to force the constraint

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

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

      - `max_distance_angstrom: number`

        Maximum distance in Angstroms

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

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

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

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

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

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

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

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `type: "contact"`

        - `"contact"`

      - `force: optional boolean`

        Whether to force the constraint

  - `pocket_residues: optional map[array of number]`

    Binding pocket residues, keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the 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 array of string`

    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 "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 string`

  Client-provided key to prevent duplicate submissions on retries

- `molecule_filters: optional object { boltz_smarts_catalog_filter_level, custom_filters }`

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

  - `boltz_smarts_catalog_filter_level: optional "recommended" or "extra" or "aggressive" or "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 array of object { max_hba, max_hbd, max_logp, 3 more }  or object { type, fraction_csp3, mol_logp, 8 more }  or object { patterns, type }  or 2 more`

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

    - `LipinskiFilter = object { max_hba, max_hbd, max_logp, 3 more }`

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

        Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

      - `max_hbd: number`

        Maximum number of hydrogen bond donors. Lipinski threshold: 5

      - `max_logp: number`

        Maximum LogP. Lipinski threshold: 5

      - `max_mw: number`

        Maximum molecular weight (Da). Lipinski threshold: 500

      - `type: "lipinski_filter"`

        - `"lipinski_filter"`

      - `allow_single_violation: optional boolean`

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

    - `RdkitDescriptorFilter = object { type, fraction_csp3, mol_logp, 8 more }`

      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: "rdkit_descriptor_filter"`

        - `"rdkit_descriptor_filter"`

      - `fraction_csp3: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `mol_logp: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `mol_wt: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_aromatic_rings: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_h_acceptors: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_h_donors: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_heteroatoms: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_rings: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_rotatable_bonds: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `tpsa: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

    - `SmartsCustomFilter = object { patterns, type }`

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

      - `patterns: array of string`

        SMARTS patterns. Molecules matching any pattern are rejected.

      - `type: "smarts_custom_filter"`

        - `"smarts_custom_filter"`

    - `SmartsCatalogFilter = object { catalog, type }`

      Filter molecules using a predefined SMARTS catalog of structural alerts.

      - `catalog: "PAINS" or "PAINS_A" or "PAINS_B" or 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: "smarts_catalog_filter"`

        - `"smarts_catalog_filter"`

    - `SmilesRegexFilter = object { patterns, type }`

      Filter molecules by regex patterns on their SMILES representation.

      - `patterns: array of string`

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

      - `type: "smiles_regex_filter"`

        - `"smiles_regex_filter"`

- `workspace_id: optional string`

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

### Returns

- `id: string`

  Unique SmDesignRun identifier

- `completed_at: string`

- `created_at: string`

- `data_deleted_at: string`

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

- `engine: "boltz-sm-design"`

  Engine used for small molecule design

  - `"boltz-sm-design"`

- `engine_version: string`

  Engine version used for small molecule design

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

  - `code: string`

    Machine-readable error code

  - `message: string`

    Human-readable error message

  - `details: optional unknown`

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

- `input: object { num_molecules, target, chemical_space, 3 more }`

  Pipeline input (null if data deleted)

  - `num_molecules: number`

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

  - `target: object { entities, bonds, constraints, 2 more }`

    Target protein with binding pocket for small molecule design or screening

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

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

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

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

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

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

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

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

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

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

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

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

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

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

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID containing the atom

          - `type: "ligand_atom"`

            - `"ligand_atom"`

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

          - `atom_name: string`

            Standardized atom name (verifiable in CIF file on RCSB)

          - `chain_id: string`

            Chain ID containing the atom

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_atom"`

            - `"polymer_atom"`

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

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

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID containing the atom

          - `type: "ligand_atom"`

            - `"ligand_atom"`

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

          - `atom_name: string`

            Standardized atom name (verifiable in CIF file on RCSB)

          - `chain_id: string`

            Chain ID containing the atom

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_atom"`

            - `"polymer_atom"`

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

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

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

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

        - `binder_chain_id: string`

          Chain ID of the binder molecule

        - `contact_residues: map[array of number]`

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

        - `max_distance_angstrom: number`

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

        - `type: "pocket"`

          - `"pocket"`

        - `force: optional boolean`

          Whether to force the constraint

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

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

        - `max_distance_angstrom: number`

          Maximum distance in Angstroms

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

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

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

            - `chain_id: string`

              Chain ID

            - `residue_index: number`

              0-based residue index

            - `type: "polymer_contact"`

              - `"polymer_contact"`

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

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

            - `atom_name: string`

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

            - `chain_id: string`

              Chain ID

            - `type: "ligand_contact"`

              - `"ligand_contact"`

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

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

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

            - `chain_id: string`

              Chain ID

            - `residue_index: number`

              0-based residue index

            - `type: "polymer_contact"`

              - `"polymer_contact"`

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

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

            - `atom_name: string`

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

            - `chain_id: string`

              Chain ID

            - `type: "ligand_contact"`

              - `"ligand_contact"`

        - `type: "contact"`

          - `"contact"`

        - `force: optional boolean`

          Whether to force the constraint

    - `pocket_residues: optional map[array of number]`

      Binding pocket residues, keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the 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 array of string`

      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 "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 string`

    Client-provided key to prevent duplicate submissions on retries

  - `molecule_filters: optional object { boltz_smarts_catalog_filter_level, custom_filters }`

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

    - `boltz_smarts_catalog_filter_level: optional "recommended" or "extra" or "aggressive" or "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 array of object { max_hba, max_hbd, max_logp, 3 more }  or object { type, fraction_csp3, mol_logp, 8 more }  or object { patterns, type }  or 2 more`

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

      - `LipinskiFilterResponse = object { max_hba, max_hbd, max_logp, 3 more }`

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

          Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

        - `max_hbd: number`

          Maximum number of hydrogen bond donors. Lipinski threshold: 5

        - `max_logp: number`

          Maximum LogP. Lipinski threshold: 5

        - `max_mw: number`

          Maximum molecular weight (Da). Lipinski threshold: 500

        - `type: "lipinski_filter"`

          - `"lipinski_filter"`

        - `allow_single_violation: optional boolean`

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

      - `RdkitDescriptorFilterResponse = object { type, fraction_csp3, mol_logp, 8 more }`

        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: "rdkit_descriptor_filter"`

          - `"rdkit_descriptor_filter"`

        - `fraction_csp3: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `mol_logp: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `mol_wt: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_aromatic_rings: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_h_acceptors: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_h_donors: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_heteroatoms: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_rings: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_rotatable_bonds: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `tpsa: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

      - `SmartsCustomFilterResponse = object { patterns, type }`

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

        - `patterns: array of string`

          SMARTS patterns. Molecules matching any pattern are rejected.

        - `type: "smarts_custom_filter"`

          - `"smarts_custom_filter"`

      - `SmartsCatalogFilterResponse = object { catalog, type }`

        Filter molecules using a predefined SMARTS catalog of structural alerts.

        - `catalog: "PAINS" or "PAINS_A" or "PAINS_B" or 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: "smarts_catalog_filter"`

          - `"smarts_catalog_filter"`

      - `SmilesRegexFilterResponse = object { patterns, type }`

        Filter molecules by regex patterns on their SMILES representation.

        - `patterns: array of string`

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

        - `type: "smiles_regex_filter"`

          - `"smiles_regex_filter"`

  - `workspace_id: optional string`

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

- `livemode: boolean`

  Whether this resource was created with a live API key.

- `progress: object { num_molecules_generated, total_molecules_to_generate, latest_result_id }`

  - `num_molecules_generated: number`

    Number of molecules generated so far

  - `total_molecules_to_generate: number`

    Total number of molecules requested

  - `latest_result_id: optional string`

    ID of the most recently generated result

- `started_at: string`

- `status: "pending" or "running" or "succeeded" or 2 more`

  - `"pending"`

  - `"running"`

  - `"succeeded"`

  - `"failed"`

  - `"stopped"`

- `stopped_at: string`

- `workspace_id: string`

  Workspace ID

- `idempotency_key: optional string`

  Client-provided idempotency key

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design \
    -H 'Content-Type: application/json' \
    -H "x-api-key: $BOLTZ_API_KEY" \
    -d '{
          "num_molecules": 10,
          "target": {
            "entities": [
              {
                "chain_ids": [
                  "string"
                ],
                "type": "protein",
                "value": "value"
              }
            ]
          }
        }'
```

## List

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

List small molecule design runs, optionally filtered by workspace

### Query Parameters

- `after_id: optional string`

  Return results after this ID

- `before_id: optional string`

  Return results before this ID

- `limit: optional number`

  Max items to return. Defaults to 100.

- `workspace_id: optional string`

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

### Returns

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

  - `id: string`

    Unique SmDesignRunSummary identifier

  - `completed_at: string`

  - `created_at: string`

  - `data_deleted_at: string`

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

  - `engine: "boltz-sm-design"`

    Engine used for small molecule design

    - `"boltz-sm-design"`

  - `engine_version: string`

    Engine version used for small molecule design

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

    - `code: string`

      Machine-readable error code

    - `message: string`

      Human-readable error message

    - `details: optional unknown`

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

  - `livemode: boolean`

    Whether this resource was created with a live API key.

  - `progress: object { num_molecules_generated, total_molecules_to_generate, latest_result_id }`

    - `num_molecules_generated: number`

      Number of molecules generated so far

    - `total_molecules_to_generate: number`

      Total number of molecules requested

    - `latest_result_id: optional string`

      ID of the most recently generated result

  - `started_at: string`

  - `status: "pending" or "running" or "succeeded" or 2 more`

    - `"pending"`

    - `"running"`

    - `"succeeded"`

    - `"failed"`

    - `"stopped"`

  - `stopped_at: string`

  - `workspace_id: string`

    Workspace ID

  - `idempotency_key: optional string`

    Client-provided idempotency key

- `first_id: string`

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

- `has_more: boolean`

- `last_id: string`

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

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Retrieve

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

Retrieve a design run by ID, including progress and status

### Path Parameters

- `id: string`

### Query Parameters

- `workspace_id: optional string`

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

### Returns

- `id: string`

  Unique SmDesignRun identifier

- `completed_at: string`

- `created_at: string`

- `data_deleted_at: string`

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

- `engine: "boltz-sm-design"`

  Engine used for small molecule design

  - `"boltz-sm-design"`

- `engine_version: string`

  Engine version used for small molecule design

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

  - `code: string`

    Machine-readable error code

  - `message: string`

    Human-readable error message

  - `details: optional unknown`

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

- `input: object { num_molecules, target, chemical_space, 3 more }`

  Pipeline input (null if data deleted)

  - `num_molecules: number`

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

  - `target: object { entities, bonds, constraints, 2 more }`

    Target protein with binding pocket for small molecule design or screening

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

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

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

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

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

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

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

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

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

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

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

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

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

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

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID containing the atom

          - `type: "ligand_atom"`

            - `"ligand_atom"`

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

          - `atom_name: string`

            Standardized atom name (verifiable in CIF file on RCSB)

          - `chain_id: string`

            Chain ID containing the atom

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_atom"`

            - `"polymer_atom"`

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

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

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID containing the atom

          - `type: "ligand_atom"`

            - `"ligand_atom"`

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

          - `atom_name: string`

            Standardized atom name (verifiable in CIF file on RCSB)

          - `chain_id: string`

            Chain ID containing the atom

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_atom"`

            - `"polymer_atom"`

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

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

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

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

        - `binder_chain_id: string`

          Chain ID of the binder molecule

        - `contact_residues: map[array of number]`

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

        - `max_distance_angstrom: number`

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

        - `type: "pocket"`

          - `"pocket"`

        - `force: optional boolean`

          Whether to force the constraint

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

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

        - `max_distance_angstrom: number`

          Maximum distance in Angstroms

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

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

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

            - `chain_id: string`

              Chain ID

            - `residue_index: number`

              0-based residue index

            - `type: "polymer_contact"`

              - `"polymer_contact"`

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

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

            - `atom_name: string`

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

            - `chain_id: string`

              Chain ID

            - `type: "ligand_contact"`

              - `"ligand_contact"`

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

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

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

            - `chain_id: string`

              Chain ID

            - `residue_index: number`

              0-based residue index

            - `type: "polymer_contact"`

              - `"polymer_contact"`

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

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

            - `atom_name: string`

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

            - `chain_id: string`

              Chain ID

            - `type: "ligand_contact"`

              - `"ligand_contact"`

        - `type: "contact"`

          - `"contact"`

        - `force: optional boolean`

          Whether to force the constraint

    - `pocket_residues: optional map[array of number]`

      Binding pocket residues, keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the 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 array of string`

      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 "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 string`

    Client-provided key to prevent duplicate submissions on retries

  - `molecule_filters: optional object { boltz_smarts_catalog_filter_level, custom_filters }`

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

    - `boltz_smarts_catalog_filter_level: optional "recommended" or "extra" or "aggressive" or "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 array of object { max_hba, max_hbd, max_logp, 3 more }  or object { type, fraction_csp3, mol_logp, 8 more }  or object { patterns, type }  or 2 more`

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

      - `LipinskiFilterResponse = object { max_hba, max_hbd, max_logp, 3 more }`

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

          Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

        - `max_hbd: number`

          Maximum number of hydrogen bond donors. Lipinski threshold: 5

        - `max_logp: number`

          Maximum LogP. Lipinski threshold: 5

        - `max_mw: number`

          Maximum molecular weight (Da). Lipinski threshold: 500

        - `type: "lipinski_filter"`

          - `"lipinski_filter"`

        - `allow_single_violation: optional boolean`

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

      - `RdkitDescriptorFilterResponse = object { type, fraction_csp3, mol_logp, 8 more }`

        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: "rdkit_descriptor_filter"`

          - `"rdkit_descriptor_filter"`

        - `fraction_csp3: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `mol_logp: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `mol_wt: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_aromatic_rings: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_h_acceptors: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_h_donors: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_heteroatoms: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_rings: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_rotatable_bonds: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `tpsa: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

      - `SmartsCustomFilterResponse = object { patterns, type }`

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

        - `patterns: array of string`

          SMARTS patterns. Molecules matching any pattern are rejected.

        - `type: "smarts_custom_filter"`

          - `"smarts_custom_filter"`

      - `SmartsCatalogFilterResponse = object { catalog, type }`

        Filter molecules using a predefined SMARTS catalog of structural alerts.

        - `catalog: "PAINS" or "PAINS_A" or "PAINS_B" or 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: "smarts_catalog_filter"`

          - `"smarts_catalog_filter"`

      - `SmilesRegexFilterResponse = object { patterns, type }`

        Filter molecules by regex patterns on their SMILES representation.

        - `patterns: array of string`

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

        - `type: "smiles_regex_filter"`

          - `"smiles_regex_filter"`

  - `workspace_id: optional string`

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

- `livemode: boolean`

  Whether this resource was created with a live API key.

- `progress: object { num_molecules_generated, total_molecules_to_generate, latest_result_id }`

  - `num_molecules_generated: number`

    Number of molecules generated so far

  - `total_molecules_to_generate: number`

    Total number of molecules requested

  - `latest_result_id: optional string`

    ID of the most recently generated result

- `started_at: string`

- `status: "pending" or "running" or "succeeded" or 2 more`

  - `"pending"`

  - `"running"`

  - `"succeeded"`

  - `"failed"`

  - `"stopped"`

- `stopped_at: string`

- `workspace_id: string`

  Workspace ID

- `idempotency_key: optional string`

  Client-provided idempotency key

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design/$ID \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## List Results

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

Retrieve paginated results from a design run

### Path Parameters

- `id: string`

### Query Parameters

- `after_id: optional string`

  Return results after this ID

- `before_id: optional string`

  Return results before this ID

- `limit: optional number`

  Max results to return. Defaults to 100.

- `workspace_id: optional string`

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

### Returns

- `data: array of object { id, artifacts, created_at, 3 more }`

  - `id: string`

    Unique result ID

  - `artifacts: object { archive, structure }`

    - `archive: object { url, url_expires_at }`

      - `url: string`

        URL to download the file

      - `url_expires_at: string`

        When the presigned URL expires

    - `structure: object { url, url_expires_at }`

      - `url: string`

        URL to download the file

      - `url_expires_at: string`

        When the presigned URL expires

  - `created_at: string`

  - `metrics: object { binding_confidence, complex_iplddt, complex_plddt, 4 more }`

    Scoring metrics for a designed small molecule

    - `binding_confidence: number`

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

    - `complex_iplddt: number`

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

    - `complex_plddt: number`

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

    - `iptm: number`

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

    - `optimization_score: number`

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

    - `ptm: number`

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

    - `structure_confidence: number`

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

  - `smiles: string`

    SMILES string of the designed molecule

  - `warnings: optional array of object { code, message }`

    Warnings about potential quality issues with this result.

    - `code: string`

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

    - `message: string`

      Human-readable description of the warning

- `first_id: string`

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

- `has_more: boolean`

- `last_id: string`

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

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design/$ID/results \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Stop

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

Stop an in-progress design run early

### Path Parameters

- `id: string`

### Returns

- `id: string`

  Unique SmDesignRun identifier

- `completed_at: string`

- `created_at: string`

- `data_deleted_at: string`

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

- `engine: "boltz-sm-design"`

  Engine used for small molecule design

  - `"boltz-sm-design"`

- `engine_version: string`

  Engine version used for small molecule design

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

  - `code: string`

    Machine-readable error code

  - `message: string`

    Human-readable error message

  - `details: optional unknown`

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

- `input: object { num_molecules, target, chemical_space, 3 more }`

  Pipeline input (null if data deleted)

  - `num_molecules: number`

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

  - `target: object { entities, bonds, constraints, 2 more }`

    Target protein with binding pocket for small molecule design or screening

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

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

      - `chain_ids: array of string`

        Chain IDs for this entity

      - `type: "protein"`

        - `"protein"`

      - `value: string`

        Amino acid sequence (one-letter codes)

      - `cyclic: optional boolean`

        Whether the sequence is cyclic

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

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

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

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "ccd"`

            - `"ccd"`

          - `value: string`

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

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

          - `residue_index: number`

            0-based index of the residue to modify

          - `type: "smiles"`

            - `"smiles"`

          - `value: string`

            SMILES string for the modification

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

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

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

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

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID containing the atom

          - `type: "ligand_atom"`

            - `"ligand_atom"`

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

          - `atom_name: string`

            Standardized atom name (verifiable in CIF file on RCSB)

          - `chain_id: string`

            Chain ID containing the atom

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_atom"`

            - `"polymer_atom"`

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

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

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID containing the atom

          - `type: "ligand_atom"`

            - `"ligand_atom"`

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

          - `atom_name: string`

            Standardized atom name (verifiable in CIF file on RCSB)

          - `chain_id: string`

            Chain ID containing the atom

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_atom"`

            - `"polymer_atom"`

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

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

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

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

        - `binder_chain_id: string`

          Chain ID of the binder molecule

        - `contact_residues: map[array of number]`

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

        - `max_distance_angstrom: number`

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

        - `type: "pocket"`

          - `"pocket"`

        - `force: optional boolean`

          Whether to force the constraint

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

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

        - `max_distance_angstrom: number`

          Maximum distance in Angstroms

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

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

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

            - `chain_id: string`

              Chain ID

            - `residue_index: number`

              0-based residue index

            - `type: "polymer_contact"`

              - `"polymer_contact"`

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

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

            - `atom_name: string`

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

            - `chain_id: string`

              Chain ID

            - `type: "ligand_contact"`

              - `"ligand_contact"`

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

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

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

            - `chain_id: string`

              Chain ID

            - `residue_index: number`

              0-based residue index

            - `type: "polymer_contact"`

              - `"polymer_contact"`

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

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

            - `atom_name: string`

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

            - `chain_id: string`

              Chain ID

            - `type: "ligand_contact"`

              - `"ligand_contact"`

        - `type: "contact"`

          - `"contact"`

        - `force: optional boolean`

          Whether to force the constraint

    - `pocket_residues: optional map[array of number]`

      Binding pocket residues, keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the 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 array of string`

      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 "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 string`

    Client-provided key to prevent duplicate submissions on retries

  - `molecule_filters: optional object { boltz_smarts_catalog_filter_level, custom_filters }`

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

    - `boltz_smarts_catalog_filter_level: optional "recommended" or "extra" or "aggressive" or "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 array of object { max_hba, max_hbd, max_logp, 3 more }  or object { type, fraction_csp3, mol_logp, 8 more }  or object { patterns, type }  or 2 more`

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

      - `LipinskiFilterResponse = object { max_hba, max_hbd, max_logp, 3 more }`

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

          Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

        - `max_hbd: number`

          Maximum number of hydrogen bond donors. Lipinski threshold: 5

        - `max_logp: number`

          Maximum LogP. Lipinski threshold: 5

        - `max_mw: number`

          Maximum molecular weight (Da). Lipinski threshold: 500

        - `type: "lipinski_filter"`

          - `"lipinski_filter"`

        - `allow_single_violation: optional boolean`

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

      - `RdkitDescriptorFilterResponse = object { type, fraction_csp3, mol_logp, 8 more }`

        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: "rdkit_descriptor_filter"`

          - `"rdkit_descriptor_filter"`

        - `fraction_csp3: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `mol_logp: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `mol_wt: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_aromatic_rings: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_h_acceptors: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_h_donors: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_heteroatoms: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_rings: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `num_rotatable_bonds: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

        - `tpsa: optional object { max, min }`

          Min/max range constraint for an RDKit molecular descriptor

          - `max: optional number`

            Maximum allowed value (inclusive)

          - `min: optional number`

            Minimum allowed value (inclusive)

      - `SmartsCustomFilterResponse = object { patterns, type }`

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

        - `patterns: array of string`

          SMARTS patterns. Molecules matching any pattern are rejected.

        - `type: "smarts_custom_filter"`

          - `"smarts_custom_filter"`

      - `SmartsCatalogFilterResponse = object { catalog, type }`

        Filter molecules using a predefined SMARTS catalog of structural alerts.

        - `catalog: "PAINS" or "PAINS_A" or "PAINS_B" or 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: "smarts_catalog_filter"`

          - `"smarts_catalog_filter"`

      - `SmilesRegexFilterResponse = object { patterns, type }`

        Filter molecules by regex patterns on their SMILES representation.

        - `patterns: array of string`

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

        - `type: "smiles_regex_filter"`

          - `"smiles_regex_filter"`

  - `workspace_id: optional string`

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

- `livemode: boolean`

  Whether this resource was created with a live API key.

- `progress: object { num_molecules_generated, total_molecules_to_generate, latest_result_id }`

  - `num_molecules_generated: number`

    Number of molecules generated so far

  - `total_molecules_to_generate: number`

    Total number of molecules requested

  - `latest_result_id: optional string`

    ID of the most recently generated result

- `started_at: string`

- `status: "pending" or "running" or "succeeded" or 2 more`

  - `"pending"`

  - `"running"`

  - `"succeeded"`

  - `"failed"`

  - `"stopped"`

- `stopped_at: string`

- `workspace_id: string`

  Workspace ID

- `idempotency_key: optional string`

  Client-provided idempotency key

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design/$ID/stop \
    -X POST \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Delete Data

**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.

### Path Parameters

- `id: string`

### Returns

- `id: string`

  ID of the resource whose data was deleted

- `data_deleted: true`

  - `true`

- `data_deleted_at: string`

  When the data was deleted

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design/$ID/delete-data \
    -X POST \
    -H "x-api-key: $BOLTZ_API_KEY"
```

## Estimate Cost

**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.

### Body Parameters

- `num_molecules: number`

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

- `target: object { entities, bonds, constraints, 2 more }`

  Target protein with binding pocket for small molecule design or screening

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

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

    - `chain_ids: array of string`

      Chain IDs for this entity

    - `type: "protein"`

      - `"protein"`

    - `value: string`

      Amino acid sequence (one-letter codes)

    - `cyclic: optional boolean`

      Whether the sequence is cyclic

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

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

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

        - `residue_index: number`

          0-based index of the residue to modify

        - `type: "ccd"`

          - `"ccd"`

        - `value: string`

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

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

        - `residue_index: number`

          0-based index of the residue to modify

        - `type: "smiles"`

          - `"smiles"`

        - `value: string`

          SMILES string for the modification

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

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

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

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

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

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

        - `atom_name: string`

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

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

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

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

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

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

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

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

        - `atom_name: string`

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

        - `chain_id: string`

          Chain ID containing the atom

        - `type: "ligand_atom"`

          - `"ligand_atom"`

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

        - `atom_name: string`

          Standardized atom name (verifiable in CIF file on RCSB)

        - `chain_id: string`

          Chain ID containing the atom

        - `residue_index: number`

          0-based residue index

        - `type: "polymer_atom"`

          - `"polymer_atom"`

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

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

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

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

      - `binder_chain_id: string`

        Chain ID of the binder molecule

      - `contact_residues: map[array of number]`

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

      - `max_distance_angstrom: number`

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

      - `type: "pocket"`

        - `"pocket"`

      - `force: optional boolean`

        Whether to force the constraint

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

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

      - `max_distance_angstrom: number`

        Maximum distance in Angstroms

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

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

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

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

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

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

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

          - `chain_id: string`

            Chain ID

          - `residue_index: number`

            0-based residue index

          - `type: "polymer_contact"`

            - `"polymer_contact"`

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

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

          - `atom_name: string`

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

          - `chain_id: string`

            Chain ID

          - `type: "ligand_contact"`

            - `"ligand_contact"`

      - `type: "contact"`

        - `"contact"`

      - `force: optional boolean`

        Whether to force the constraint

  - `pocket_residues: optional map[array of number]`

    Binding pocket residues, keyed by chain ID. Each key is a chain ID (e.g. "A") and the value is an array of 0-indexed residue indices that define the 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 array of string`

    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 "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 string`

  Client-provided key to prevent duplicate submissions on retries

- `molecule_filters: optional object { boltz_smarts_catalog_filter_level, custom_filters }`

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

  - `boltz_smarts_catalog_filter_level: optional "recommended" or "extra" or "aggressive" or "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 array of object { max_hba, max_hbd, max_logp, 3 more }  or object { type, fraction_csp3, mol_logp, 8 more }  or object { patterns, type }  or 2 more`

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

    - `LipinskiFilter = object { max_hba, max_hbd, max_logp, 3 more }`

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

        Maximum number of hydrogen bond acceptors. Lipinski threshold: 10

      - `max_hbd: number`

        Maximum number of hydrogen bond donors. Lipinski threshold: 5

      - `max_logp: number`

        Maximum LogP. Lipinski threshold: 5

      - `max_mw: number`

        Maximum molecular weight (Da). Lipinski threshold: 500

      - `type: "lipinski_filter"`

        - `"lipinski_filter"`

      - `allow_single_violation: optional boolean`

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

    - `RdkitDescriptorFilter = object { type, fraction_csp3, mol_logp, 8 more }`

      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: "rdkit_descriptor_filter"`

        - `"rdkit_descriptor_filter"`

      - `fraction_csp3: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `mol_logp: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `mol_wt: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_aromatic_rings: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_h_acceptors: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_h_donors: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_heteroatoms: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_rings: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `num_rotatable_bonds: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

      - `tpsa: optional object { max, min }`

        Min/max range constraint for an RDKit molecular descriptor

        - `max: optional number`

          Maximum allowed value (inclusive)

        - `min: optional number`

          Minimum allowed value (inclusive)

    - `SmartsCustomFilter = object { patterns, type }`

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

      - `patterns: array of string`

        SMARTS patterns. Molecules matching any pattern are rejected.

      - `type: "smarts_custom_filter"`

        - `"smarts_custom_filter"`

    - `SmartsCatalogFilter = object { catalog, type }`

      Filter molecules using a predefined SMARTS catalog of structural alerts.

      - `catalog: "PAINS" or "PAINS_A" or "PAINS_B" or 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: "smarts_catalog_filter"`

        - `"smarts_catalog_filter"`

    - `SmilesRegexFilter = object { patterns, type }`

      Filter molecules by regex patterns on their SMILES representation.

      - `patterns: array of string`

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

      - `type: "smiles_regex_filter"`

        - `"smiles_regex_filter"`

- `workspace_id: optional string`

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

### Returns

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

  Cost breakdown for the billed application.

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

    - `"structure_and_binding"`

    - `"small_molecule_design"`

    - `"small_molecule_library_screen"`

    - `"protein_design"`

    - `"protein_library_screen"`

    - `"adme"`

  - `cost_per_unit_usd: string`

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

  - `num_units: number`

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

- `disclaimer: string`

- `estimated_cost_usd: string`

  Estimated total cost as a decimal string

### Example

```http
curl https://api.boltz.bio/compute/v1/small-molecule/design/estimate-cost \
    -H 'Content-Type: application/json' \
    -H "x-api-key: $BOLTZ_API_KEY" \
    -d '{
          "num_molecules": 10,
          "target": {
            "entities": [
              {
                "chain_ids": [
                  "string"
                ],
                "type": "protein",
                "value": "value"
              }
            ]
          }
        }'
```
