Skip to main content
Docs

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

    Tools · Cheminformatics & Structure

    Metabolite Enumerator

    Predict likely phase-I and phase-II metabolites of your molecules, ranked, with the biotransformation pathway behind each one.

    Updated October 1, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    The Metabolite Enumerator proposes what the body might turn a molecule into. It applies SyGMa's curated human biotransformation rules: phase I (functionalization, such as hydroxylation or dealkylation) and phase II (conjugation, such as glucuronidation or sulfation). Each candidate keeps its parent, the rules that produced it, and a score, and the candidates are ordinary molecules you can pass to ADMET Predictor, structural alerts, or docking to look for metabolite-specific liabilities.

    These are hypotheses, not observed metabolites. It runs on CPU.

    How it works

    SyGMa applies phase-I rules for phase1_cycles generations (0 to 2, default 1), then phase-II rules for phase2_cycles (0 or 1, default 1). A candidate's score is the product of the empirical probabilities of the rules along its pathway: it ranks candidates for one parent, but is not a calibrated probability. Each structure appears once per parent, with its best-scoring pathway; fragments much smaller than the parent are dropped.

    A second phase-I generation produces many more candidates (often ten times as many) and takes correspondingly longer.

    Inputs

    Up to 1,000 parent molecules as SMILES, SDF or MOL blocks, or InChI. Rules match the structure as given, so standardize tautomers first with Molecule Standardizer if they matter. Options: max_metabolites_per_parent (1 to 200, default 25, the top-scoring ones) and min_score (default 0).

    Outputs

    FileContents
    metabolites.smi, metabolites.sdfEvery kept metabolite with its id
    pathways.csvOne row per metabolite: parent, SMILES, InChIKey, score, rank, generation, phases (I, II, or I+II), and the rules applied in order

    A parent that fails to parse, or has no metabolite above min_score, gets a status row instead; the job carries on. When the cap cuts a parent's list, its rows are marked truncated. The same metabolite reached from two parents is listed under each, with duplicate_of pointing to the first.

    Screen the metabolites with ADMET Predictor or Drug-likeness & Structural Alerts.

    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.

    Metabolite Enumerator metabolite-enumerate

    Job type
    metabolite-enumerate
    Hardware
    cpu (default)
    Typical runtime
    5 min on CPU

    Payload

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

    Limits: min items 1, max items 1000

    input_formatrequiredstring

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

    phase1_cyclesinteger

    Default: 1Limits: ≥ 0, ≤ 2

    phase2_cyclesinteger

    Default: 1Limits: ≥ 0, ≤ 1

    max_metabolites_per_parentinteger

    Default: 25Limits: ≥ 1, ≤ 200

    min_scorenumber

    Default: 0Limits: ≥ 0, ≤ 1

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "input_data": ["CC(=O)Nc1ccc(O)cc1", "CCOc1ccc(NC(C)=O)cc1", "C1CC"],
        "input_format": "smiles",
        "phase1_cycles": 1,
        "phase2_cycles": 1,
        "max_metabolites_per_parent": 8,
        "min_score": 0,
    }
    
    estimate = client.jobs.estimate(job_type="metabolite-enumerate", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-metabolite-enumerate-run",
        job_type="metabolite-enumerate",
        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
    • MoleculesSMILES
    • TableCSV