Skip to content
Go to Boltz API

Library Screen

Screen an existing library of small molecules against a protein target. Results are scored by binding confidence (likelihood of binding, for hit discovery), optimization score (binding strength ranking, for lead optimization), and structure confidence.

Start a small molecule library screen
small_molecule.library_screen.start(LibraryScreenStartParams**kwargs) -> LibraryScreenStartResponse
POST/compute/v1/small-molecule/library-screen
List small molecule library screens
small_molecule.library_screen.list(LibraryScreenListParams**kwargs) -> SyncCursorPage[LibraryScreenListResponse]
GET/compute/v1/small-molecule/library-screen
Get small molecule library screen status
small_molecule.library_screen.retrieve(strid, LibraryScreenRetrieveParams**kwargs) -> LibraryScreenRetrieveResponse
GET/compute/v1/small-molecule/library-screen/{id}
Get screened small molecule candidates
small_molecule.library_screen.list_results(strid, LibraryScreenListResultsParams**kwargs) -> SyncCursorPage[LibraryScreenListResultsResponse]
GET/compute/v1/small-molecule/library-screen/{id}/results
Stop a running small molecule library screen
small_molecule.library_screen.stop(strid) -> LibraryScreenStopResponse
POST/compute/v1/small-molecule/library-screen/{id}/stop
Delete small molecule library screen data
small_molecule.library_screen.delete_data(strid) -> LibraryScreenDeleteDataResponse
POST/compute/v1/small-molecule/library-screen/{id}/delete-data
Estimate cost for a small molecule library screen
small_molecule.library_screen.estimate_cost(LibraryScreenEstimateCostParams**kwargs) -> LibraryScreenEstimateCostResponse
POST/compute/v1/small-molecule/library-screen/estimate-cost
ModelsExpand Collapse
class LibraryScreenStartResponse:

A small molecule library screening pipeline run

id: str

Unique SmScreen identifier

completed_at: Optional[datetime]
formatdate-time
created_at: datetime
formatdate-time
data_deleted_at: Optional[datetime]

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

formatdate-time
Deprecatedengine: Literal["boltzmol"]
Use pipeline instead.

Deprecated. Use pipeline instead.

Deprecatedengine_version: Literal["1.0"]
Use pipeline_version instead.

Deprecated. Use pipeline_version instead.

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)

molecules: InputMolecules
url: str

URL to download the file

formaturi
url_expires_at: datetime

When the presigned URL expires

formatdate-time
target: InputTarget

Target protein sequences 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"]
value: str

Amino acid sequence (one-letter codes)

cyclic: Optional[bool]

Whether the sequence is cyclic

modifications: Optional[List[InputTargetEntityModification]]

CCD post-translational modifications. Optional; defaults to an empty list when omitted. SMILES modifications are not supported.

residue_index: int

0-based index of the residue to modify

minimum0
type: Literal["ccd"]

Modification format. Only CCD polymer modifications are supported.

value: str

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

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.

One of the following:
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"]
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

minimum0
type: Literal["polymer_atom"]
atom2: InputTargetBondAtom2

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

One of the following:
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"]
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

minimum0
type: Literal["polymer_atom"]
constraints: Optional[List[InputTargetConstraint]]

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

One of the following:
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"]
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.

One of the following:
class InputTargetConstraintContactConstraintResponseToken1PolymerContactTokenResponse:
chain_id: str

Chain ID

residue_index: int

0-based residue index

minimum0
type: Literal["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"]
token2: InputTargetConstraintContactConstraintResponseToken2

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

One of the following:
class InputTargetConstraintContactConstraintResponseToken2PolymerContactTokenResponse:
chain_id: str

Chain ID

residue_index: int

0-based residue index

minimum0
type: Literal["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"]
type: Literal["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.

type: Optional[Literal["no_template"]]

Target is defined directly by protein sequences rather than a structure template.

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.

One of the following:
"recommended"
"extra"
"aggressive"
"disabled"
custom_filters: Optional[List[InputMoleculeFiltersCustomFilter]]

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

One of the following:
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"]
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"]
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"]
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.

One of the following:
"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"]
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"]
livemode: bool

Whether this resource was created with a live API key.

pipeline: Literal["boltzmol"]

Pipeline used for small molecule library screen

pipeline_version: Literal["1.0"]

Pipeline version used for small molecule library screen

progress: Optional[Progress]
num_molecules_failed: int

Number of accepted molecules that reached terminal failure during screening.

minimum0
num_molecules_screened: int

Number of accepted molecules that produced usable screening results.

minimum0
total_molecules_to_screen: int

Total number of molecules accepted into screening after server-side validation and filtering.

minimum0
latest_result_id: Optional[str]

ID of the most recently screened result

rejection_summary: Optional[ProgressRejectionSummary]
filtered_count: int

Number of submitted molecules removed by server-side filtering rules.

minimum0
invalid_count: int

Number of submitted molecules rejected as invalid input.

minimum0
started_at: Optional[datetime]
formatdate-time
status: Literal["pending", "running", "succeeded", 2 more]
One of the following:
"pending"
"running"
"succeeded"
"failed"
"stopped"
stopped_at: Optional[datetime]
formatdate-time
workspace_id: str

Workspace ID

idempotency_key: Optional[str]

Client-provided idempotency key

class LibraryScreenListResponse:

Summary of a small molecule library screening pipeline run (excludes input)

id: str

Unique SmScreenSummary identifier

completed_at: Optional[datetime]
formatdate-time
created_at: datetime
formatdate-time
data_deleted_at: Optional[datetime]

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

formatdate-time
Deprecatedengine: Literal["boltzmol"]
Use pipeline instead.

Deprecated. Use pipeline instead.

Deprecatedengine_version: Literal["1.0"]
Use pipeline_version instead.

Deprecated. Use pipeline_version instead.

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.

pipeline: Literal["boltzmol"]

Pipeline used for small molecule library screen

pipeline_version: Literal["1.0"]

Pipeline version used for small molecule library screen

progress: Optional[Progress]
num_molecules_failed: int

Number of accepted molecules that reached terminal failure during screening.

minimum0
num_molecules_screened: int

Number of accepted molecules that produced usable screening results.

minimum0
total_molecules_to_screen: int

Total number of molecules accepted into screening after server-side validation and filtering.

minimum0
latest_result_id: Optional[str]

ID of the most recently screened result

rejection_summary: Optional[ProgressRejectionSummary]
filtered_count: int

Number of submitted molecules removed by server-side filtering rules.

minimum0
invalid_count: int

Number of submitted molecules rejected as invalid input.

minimum0
started_at: Optional[datetime]
formatdate-time
status: Literal["pending", "running", "succeeded", 2 more]
One of the following:
"pending"
"running"
"succeeded"
"failed"
"stopped"
stopped_at: Optional[datetime]
formatdate-time
workspace_id: str

Workspace ID

idempotency_key: Optional[str]

Client-provided idempotency key

class LibraryScreenRetrieveResponse:

A small molecule library screening pipeline run

id: str

Unique SmScreen identifier

completed_at: Optional[datetime]
formatdate-time
created_at: datetime
formatdate-time
data_deleted_at: Optional[datetime]

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

formatdate-time
Deprecatedengine: Literal["boltzmol"]
Use pipeline instead.

Deprecated. Use pipeline instead.

Deprecatedengine_version: Literal["1.0"]
Use pipeline_version instead.

Deprecated. Use pipeline_version instead.

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)

molecules: InputMolecules
url: str

URL to download the file

formaturi
url_expires_at: datetime

When the presigned URL expires

formatdate-time
target: InputTarget

Target protein sequences 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"]
value: str

Amino acid sequence (one-letter codes)

cyclic: Optional[bool]

Whether the sequence is cyclic

modifications: Optional[List[InputTargetEntityModification]]

CCD post-translational modifications. Optional; defaults to an empty list when omitted. SMILES modifications are not supported.

residue_index: int

0-based index of the residue to modify

minimum0
type: Literal["ccd"]

Modification format. Only CCD polymer modifications are supported.

value: str

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

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.

One of the following:
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"]
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

minimum0
type: Literal["polymer_atom"]
atom2: InputTargetBondAtom2

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

One of the following:
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"]
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

minimum0
type: Literal["polymer_atom"]
constraints: Optional[List[InputTargetConstraint]]

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

One of the following:
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"]
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.

One of the following:
class InputTargetConstraintContactConstraintResponseToken1PolymerContactTokenResponse:
chain_id: str

Chain ID

residue_index: int

0-based residue index

minimum0
type: Literal["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"]
token2: InputTargetConstraintContactConstraintResponseToken2

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

One of the following:
class InputTargetConstraintContactConstraintResponseToken2PolymerContactTokenResponse:
chain_id: str

Chain ID

residue_index: int

0-based residue index

minimum0
type: Literal["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"]
type: Literal["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.

type: Optional[Literal["no_template"]]

Target is defined directly by protein sequences rather than a structure template.

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.

One of the following:
"recommended"
"extra"
"aggressive"
"disabled"
custom_filters: Optional[List[InputMoleculeFiltersCustomFilter]]

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

One of the following:
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"]
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"]
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"]
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.

One of the following:
"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"]
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"]
livemode: bool

Whether this resource was created with a live API key.

pipeline: Literal["boltzmol"]

Pipeline used for small molecule library screen

pipeline_version: Literal["1.0"]

Pipeline version used for small molecule library screen

progress: Optional[Progress]
num_molecules_failed: int

Number of accepted molecules that reached terminal failure during screening.

minimum0
num_molecules_screened: int

Number of accepted molecules that produced usable screening results.

minimum0
total_molecules_to_screen: int

Total number of molecules accepted into screening after server-side validation and filtering.

minimum0
latest_result_id: Optional[str]

ID of the most recently screened result

rejection_summary: Optional[ProgressRejectionSummary]
filtered_count: int

Number of submitted molecules removed by server-side filtering rules.

minimum0
invalid_count: int

Number of submitted molecules rejected as invalid input.

minimum0
started_at: Optional[datetime]
formatdate-time
status: Literal["pending", "running", "succeeded", 2 more]
One of the following:
"pending"
"running"
"succeeded"
"failed"
"stopped"
stopped_at: Optional[datetime]
formatdate-time
workspace_id: str

Workspace ID

idempotency_key: Optional[str]

Client-provided idempotency key

class LibraryScreenListResultsResponse:

Result for a single screened small molecule

id: str

Unique result ID

artifacts: Artifacts
archive: ArtifactsArchive
url: str

URL to download the file

formaturi
url_expires_at: datetime

When the presigned URL expires

formatdate-time
structure: ArtifactsStructure
url: str

URL to download the file

formaturi
url_expires_at: datetime

When the presigned URL expires

formatdate-time
ligand_structure: Optional[ArtifactsLigandStructure]
url: str

URL to download the file

formaturi
url_expires_at: datetime

When the presigned URL expires

formatdate-time
created_at: datetime
formatdate-time
metrics: Metrics

Scoring metrics for a screened 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 screened molecule

adme: Optional[Adme]

Tier 1 ADME summary values for this molecule.

lipophilicity: float

Lipophilicity score from the internal LogD prediction.

permeability: float

Permeability score for this molecule.

solubility: Literal["high-confidence", "medium-confidence", "high-risk"]

Solubility judgement for this molecule.

One of the following:
"high-confidence"
"medium-confidence"
"high-risk"
external_id: Optional[str]

Client-provided identifier for this molecule, if provided

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

class LibraryScreenStopResponse:

A small molecule library screening pipeline run

id: str

Unique SmScreen identifier

completed_at: Optional[datetime]
formatdate-time
created_at: datetime
formatdate-time
data_deleted_at: Optional[datetime]

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

formatdate-time
Deprecatedengine: Literal["boltzmol"]
Use pipeline instead.

Deprecated. Use pipeline instead.

Deprecatedengine_version: Literal["1.0"]
Use pipeline_version instead.

Deprecated. Use pipeline_version instead.

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)

molecules: InputMolecules
url: str

URL to download the file

formaturi
url_expires_at: datetime

When the presigned URL expires

formatdate-time
target: InputTarget

Target protein sequences 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"]
value: str

Amino acid sequence (one-letter codes)

cyclic: Optional[bool]

Whether the sequence is cyclic

modifications: Optional[List[InputTargetEntityModification]]

CCD post-translational modifications. Optional; defaults to an empty list when omitted. SMILES modifications are not supported.

residue_index: int

0-based index of the residue to modify

minimum0
type: Literal["ccd"]

Modification format. Only CCD polymer modifications are supported.

value: str

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

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.

One of the following:
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"]
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

minimum0
type: Literal["polymer_atom"]
atom2: InputTargetBondAtom2

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

One of the following:
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"]
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

minimum0
type: Literal["polymer_atom"]
constraints: Optional[List[InputTargetConstraint]]

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

One of the following:
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"]
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.

One of the following:
class InputTargetConstraintContactConstraintResponseToken1PolymerContactTokenResponse:
chain_id: str

Chain ID

residue_index: int

0-based residue index

minimum0
type: Literal["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"]
token2: InputTargetConstraintContactConstraintResponseToken2

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

One of the following:
class InputTargetConstraintContactConstraintResponseToken2PolymerContactTokenResponse:
chain_id: str

Chain ID

residue_index: int

0-based residue index

minimum0
type: Literal["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"]
type: Literal["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.

type: Optional[Literal["no_template"]]

Target is defined directly by protein sequences rather than a structure template.

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.

One of the following:
"recommended"
"extra"
"aggressive"
"disabled"
custom_filters: Optional[List[InputMoleculeFiltersCustomFilter]]

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

One of the following:
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"]
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"]
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"]
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.

One of the following:
"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"]
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"]
livemode: bool

Whether this resource was created with a live API key.

pipeline: Literal["boltzmol"]

Pipeline used for small molecule library screen

pipeline_version: Literal["1.0"]

Pipeline version used for small molecule library screen

progress: Optional[Progress]
num_molecules_failed: int

Number of accepted molecules that reached terminal failure during screening.

minimum0
num_molecules_screened: int

Number of accepted molecules that produced usable screening results.

minimum0
total_molecules_to_screen: int

Total number of molecules accepted into screening after server-side validation and filtering.

minimum0
latest_result_id: Optional[str]

ID of the most recently screened result

rejection_summary: Optional[ProgressRejectionSummary]
filtered_count: int

Number of submitted molecules removed by server-side filtering rules.

minimum0
invalid_count: int

Number of submitted molecules rejected as invalid input.

minimum0
started_at: Optional[datetime]
formatdate-time
status: Literal["pending", "running", "succeeded", 2 more]
One of the following:
"pending"
"running"
"succeeded"
"failed"
"stopped"
stopped_at: Optional[datetime]
formatdate-time
workspace_id: str

Workspace ID

idempotency_key: Optional[str]

Client-provided idempotency key

class LibraryScreenDeleteDataResponse:
id: str

ID of the resource whose data was deleted

data_deleted: Literal[true]
data_deleted_at: datetime

When the data was deleted

formatdate-time
class LibraryScreenEstimateCostResponse:

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", 4 more]
One of the following:
"structure_and_binding"
"small_molecule_design"
"small_molecule_library_screen"
"protein_design"
"protein_redesign"
"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 billable units in the estimate. The unit depends on the endpoint: samples for structure-and-binding, molecules for ADME, and requested proteins or molecules for design/screen endpoints.

disclaimer: str
estimated_cost_usd: str

Estimated total cost as a decimal string

Run
client.small_molecule.library_screen.run(*, molecules: Iterable[small_molecule_library_screen_start_params.Molecule], target: small_molecule_library_screen_start_params.Target, molecule_filters: small_molecule_library_screen_start_params.MoleculeFilters | None, root_dir: str | PathLike[str], name: str | None, workspace_id: str | Omit, download_mode: DownloadMode | str | None, quiet: bool, poll_interval_seconds: float) -> Path
FunctionSDK workflow