Skip to main content
Docs

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

    Tools · Computational Biology

    Binding ΔΔG

    Rank antibody variants by the predicted change in binding free energy on an antibody-antigen complex, scored zero-shot with inverse-folding log-probabilities.

    Updated October 20, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    Binding ΔΔG closes the loop that variant generation leaves open: you have a parent antibody and a list of variants — from Sequence Mutator, from a design run, or from your own notes — and you want to know which ones are worth expressing. The job scores every variant against the fixed parent on one antibody-antigen complex and returns a ranked table of predicted changes in binding free energy, each with an uncertainty estimate.

    How the score works

    Each variant is scored with ProteinMPNN inverse-folding log-probabilities on the same backbone as the parent: per-position conditional probabilities of the variant residues given the complex structure, compared with the parent's residues at the mutated positions. No mutant structure is built and nothing is trained per target — the per-structure baseline largely cancels, and what remains is the parent-relative binding signal. Log-odds are converted to kcal/mol at room temperature, and several stochastic passes (fresh decoder noise each pass, shared between the parent and every variant within a pass) give a mean and a standard deviation per variant. The table ranks by the mean, lowest first: a negative ΔΔG predicts tighter binding than the parent.

    Because the score is parent-relative, it rank-orders variants within one campaign. It is not an absolute affinity predictor, and it does not replace experimental validation.

    Inputs

    • Complex: one antibody-antigen structure as a PDB file — a crystal structure or a predicted complex both work. Upload it or bind it from an upstream structure step.
    • Parent sequence: the chain you are mutating, as one-letter codes or one FASTA record. It must match a chain of the complex exactly, tags included; the scoring runs on that chain with everything else held fixed.
    • Variants, either way you prefer:
      • Mutation strings in the Sequence Mutator syntax — one per line, T315I, joined with + for combined variants. Positions are the complex chain's own residue numbers (insertion codes included), and each stated wild-type residue is checked against that chain when the job runs, so a numbering offset fails with the residue actually found.
      • Variant sequences — one FASTA record per variant, each the parent length; positions that differ from the parent become the scored substitutions.

    first_residue_number lines literature numbering up with the construct, as in Sequence Mutator. Up to 50 variants and 20 substitutions per variant; sequences are capped at 5 000 residues.

    Outputs

    • predictions.csv: one row per variant — variant name, mean ΔΔG, standard deviation across passes, and rank.
    • sequences.fasta: the scored parent (WT) and every variant, so the survivors can be folded or modeled downstream.
    • summary.json: the matched chain, the scoring settings, and per-variant rows.

    In a workflow, the predictions port carries the binding_ddg_kcal_mol metric, so a filter step can keep the stabilizing variants, and the sequences port binds straight into ESMFold2 or Boltz-2 for the survivors.

    Honest limits

    • The uncertainty is signal, not noise: a high standard deviation across passes often separates binders from non-binders better than the point prediction alone.
    • Structure quality matters much less here than in de novo scoring, because the parent-relative baseline cancels — but a wildly wrong complex still gives meaningless ranks.
    • Scores support prioritization. Express the top variants.

    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.

    Binding ΔΔG binding-ddg

    Job type
    binding-ddg
    Hardware
    t4 (default)l4a10l40sa100-40gba100-80gbh100h200b200
    Typical runtime
    10 min on Nvidia T4

    Payload

    Provide exactly one of: mutations, variant_sequences.

    Payload fields
    FieldTypeDescription
    complexrequiredfile_object
    parent_sequencerequiredstring | object
    mutations[]string[]

    Limits: min items 1, max items 50

    variant_sequences[]string[]

    Limits: min items 1, max items 50

    first_residue_numberinteger

    Default: 1Limits: ≥ -10000, ≤ 100000

    num_samplesinteger

    Default: 8Limits: ≥ 1, ≤ 32

    File fields take {"name": "x.pdb", "content_b64": "…"} or a stored artifact, {"$artifact": {"id": "art-…", "port": "…"}}. Files are up to 25 MiB each.

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "complex": {
            "name": "complex.pdb",
            "content_b64": "<file contents, base64>",
        },
        "parent_sequence": "ACDEFGHIKLMN",
        "mutations": ["A1V", "K9R", "A1V+K9R"],
    }
    
    estimate = client.jobs.estimate(job_type="binding-ddg", payload=payload, resource="t4")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-binding-ddg-run",
        job_type="binding-ddg",
        payload=payload,
        resource="t4",
    )
    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

    • Protein structurePDB
    • Protein sequences · optionalFASTA, RAW
    • Protein sequences (list) · optionalFASTA, RAW

    Workflow outputs

    • ArchiveZIP
    • TableCSV
    • Protein sequencesFASTA