Skip to main content
Docs

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

    Tools · Cheminformatics & Structure

    Off-Target Predictor

    Rank the human protein targets a molecule most resembles known actives of, with a calibrated probability and the evidence behind each rank.

    Updated November 10, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    The Off-Target Predictor answers the reverse of "what does this target bind?": for each molecule you give it, which human protein targets does it most resemble known actives of? Use it to spot likely off-target liabilities early, to suggest secondary pharmacology to test, or to look for repurposing leads.

    The results are hypotheses ranked by similarity to recorded actives, not predicted activity. A target high on the list is one worth testing, not a measured or predicted binding at any dose.

    How it works

    For every target, the job finds the recorded active most similar to your molecule, using the Tanimoto similarity of ECFP4 fingerprints (radius 2, 2,048 bits). That highest similarity ranks the targets. A calibration, fitted on held-out compounds, turns the similarity into a probability: the chance that a molecule at that similarity is a recorded active of the target. Targets with too few recorded actives are left out, and you can raise that evidence floor. It runs on CPU with RDKit and makes no network call at run time.

    The reference is a compact index built from one pinned ChEMBL release, limited to human single-protein targets and to activities with a pChEMBL value of at least 6 from assays with a high confidence score. It holds fingerprints and target links only. No structure, compound identifier, activity value or ChEMBL record link from it appears in any result, and the release used is recorded in every run.

    Inputs

    SMILES, InChI, or MOL blocks. A salt or mixture is scored on its largest fragment, the way the reference compounds were prepared, and the results list the molecule as you entered it. To prepare molecules first, use the Molecule Standardizer or Ligand Ionization & Tautomer States.

    Options:

    • top_n: how many targets to list for each molecule.
    • min_probability: a confidence cut-off. Rows below it are not listed.
    • min_target_actives: the evidence floor, the fewest recorded actives a target needs to be considered.
    • target_families: limit the ranking to chosen ChEMBL protein families, such as Kinase or Family A G protein-coupled receptor. A broad family such as Enzyme also includes its subfamilies (Kinase, Protease and so on).

    Outputs

    • targets.csv: one row per molecule and target, with the target's ChEMBL identifier, UniProt accession, name and family; the calibrated probability; the maximum Tanimoto similarity; the number of recorded actives behind the target; and an in-domain flag. A molecule that cannot be parsed gets one row with its error. Two columns describe the molecule as a whole and repeat on each of its rows: offtarget_in_domain (1 when its nearest reference compound is similar enough for the ranking to be meaningful) and offtarget_top_probability (its highest probability over every target considered, not only the listed ones).
    • molecules.smi: the molecules that were scored.
    • offtarget_reference.json: the reference's release, query and hash, and the options the run used.
    • LICENSE.txt and ATTRIBUTION.md: the data licence and the credit below.

    In a workflow, the scored molecules carry two metrics, offtarget_top_probability and offtarget_in_domain, that later filter steps can cut on, for example keeping molecules whose most likely target probability is below a limit. The full ranking stays in targets.csv for a step that reads a table.

    Limits

    • A probability means "chance of being a recorded ChEMBL active at this similarity", not activity at therapeutic exposure. Use the ranking to decide what to test.
    • The data are positive-unlabeled: a target missing from a molecule's list was not shown to be inactive, only not recorded as active.
    • Targets with few recorded actives are unreliable. Raise min_target_actives for a more conservative list.
    • Well-studied families such as kinases and G protein-coupled receptors have the most recorded actives, so they dominate the rankings. target_families narrows the list but does not correct this.
    • The method reasons by nearest analog. It does not transfer across chemotypes, so treat rows with offtarget_in_domain of 0 as weak.
    • The index is frozen to one ChEMBL release and does not follow newer data.
    • Filtering in a workflow works on whole molecules. A target-specific screen, such as dropping anything that hits one named target, is not available.

    Data and credit

    The reference data come from ChEMBL (EMBL-EBI), licensed CC BY-SA 3.0 Unported. CogniChem reduced it to fingerprints and target links and modified it; the release is recorded in each result. Please cite Zdrazil B, et al. The ChEMBL Database in 2023. Nucleic Acids Res. 2024;52:D1180–D1192 (doi:10.1093/nar/gkad1004). Target accessions are from UniProt, licensed CC BY 4.0. Every result carries LICENSE.txt and ATTRIBUTION.md.

    To list what is known about one target, use ChEMBL Target Activities. For predicted absorption, metabolism and toxicity properties use ADMET Predictor, and for rule-based filters use 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.

    Off-Target Predictor offtarget-predict

    Job type
    offtarget-predict
    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", "inchi", "molblock"

    top_ninteger

    Default: 10Limits: ≥ 1, ≤ 25

    min_probabilitynumber

    Default: 0Limits: ≥ 0, ≤ 1

    min_target_activesinteger

    Default: 25Limits: ≥ 25, ≤ 1000

    target_families[]string[]

    One of: "Adhesion", "Aminoacyltransferase", "Calcium channel auxiliary subunit alpha2delta family", "Cytochrome P450", "Electrochemical transporter", "Enzyme", "Eraser", "Family A G protein-coupled receptor", "Family B G protein-coupled receptor", "Family C G protein-coupled receptor", "Fatty acid binding protein family", "Frizzled family G protein-coupled receptor", "Group translocator", "Hydrolase", "Isomerase", "Kinase", "Ligand-gated ion channel", "Ligase", "Lyase", "Membrane receptor", "Nuclear receptor", "Other cytosolic protein", "Other ion channel", "Other membrane protein", "Other nuclear protein", "Oxidoreductase", "Phosphatase", "Phosphodiesterase", "Primary active transporter", "Protease", "Reader", "Secreted protein", "Structural protein", "Surface antigen", "Taste family G protein-coupled receptor", "Toll-like and Il-1 receptors", "Transcription factor", "Transferase", "Transmembrane 1-electron transfer carriers", "Transporter", "Unclassified protein", "Voltage-gated ion channel", "Writer"Limits: max items 43

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "input_data": ["CC(=O)Oc1ccccc1C(=O)O", "Cn1cnc2c1c(=O)n(C)c(=O)n2C"],
        "input_format": "smiles",
        "top_n": 3,
        "min_probability": 0.05,
        "min_target_actives": 25,
        "target_families": [],
    }
    
    estimate = client.jobs.estimate(job_type="offtarget-predict", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-offtarget-predict-run",
        job_type="offtarget-predict",
        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, INCHI, MOLBLOCK

    Workflow outputs

    • ArchiveZIP
    • MoleculesSMILES
    • TableCSV