Skip to main content
Docs

Search guides and API endpoints, for example “Idempotency-Key” or “submit job”.

    Tools · Cheminformatics & Structure

    Ligand Ionization & Tautomer States

    Enumerate plausible protonation and tautomer states of small molecules at a target pH with estimated populations
    On this page

    Prices, workflows, and method papersOpen in the app

    Run it from the API

    Submit with Submit a job and the job_type below. Price it first with Estimate job reservation cost: submitting reserves that amount from your wallet, and the charge settles at the actual runtime.

    Ligand Ionization & Tautomer States ligand-ionize

    Job type
    ligand-ionize
    Hardware
    cpu (default)
    Typical runtime
    5 min on CPU

    Payload

    Payload fields
    FieldTypeDescription
    input_data[]required(string | object)[]

    Limits: min items 1, max items 10000

    input_formatrequiredstring

    One of: "smiles", "sdf", "molblock", "inchi"

    phnumber

    Default: 7.4Limits: ≥ 0, ≤ 14

    precisionnumber

    Default: 1Limits: ≥ 0, ≤ 3

    tautomer_modestring

    Default: "none"One of: "none", "canonical", "enumerate"

    max_states_per_parentinteger

    Default: 8Limits: ≥ 1, ≤ 128

    min_populationnumber

    Default: 0.01Limits: ≥ 0, ≤ 0.5

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "input_data": [
            "CC(=O)O",
            "N[C@@H](Cc1c[nH]cn1)C(=O)O",
            "Nc1ccncc1",
            "Oc1ccccn1",
        ],
        "input_format": "smiles",
        "ph": 7.4,
        "precision": 1,
        "tautomer_mode": "canonical",
        "max_states_per_parent": 8,
        "min_population": 0.01,
    }
    
    estimate = client.jobs.estimate(job_type="ligand-ionize", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-ligand-ionize-run",
        job_type="ligand-ionize",
        payload=payload,
        resource="cpu",
    )
    status = client.jobs.wait(job.process_id)
    if status.status == "completed":
        client.jobs.result(job.process_id, save_path=".")

    Sample data from the job catalog; long values are shortened here. Each job_name must be unique among your jobs.

    Workflow inputs

    • Molecules (list)SMILES, SDF, MOLBLOCK, INCHI

    Workflow outputs

    • ArchiveZIP
    • TableCSV
    • MoleculesSMILES