Skip to main content
Docs

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

    Tools · Computational Biology

    RFdiffusion3

    Generate all-atom protein backbones from a length or an input structure with RFdiffusion3, with motif, ligand, hotspot, symmetry, cyclic-peptide and partial-diffusion conditioning.

    Updated October 20, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    RFdiffusion3 generates new protein backbones. You can ask for nothing more than a length, or give it an input structure and ask it to scaffold a motif, design around a ligand, build a binder against chosen hotspots, or perturb the structure into nearby alternatives. It makes backbones, not sequences: the usual next steps are sequence design with MPNN and a refold to check the result.

    How it works

    RFdiffusion3 is an all-atom diffusion model from the RosettaCommons Foundry, released with its weights under a BSD license. It starts from noise and denoises over a fixed number of steps, with the conditioning you supply held fixed along the way. Each design is an independent sample, so a run of several designs gives you several different answers to the same question.

    Inputs

    There are two starting points.

    • From scratch: a length (110) or a range (100-120). Add cyclic or dihedral symmetry for assemblies of identical chains, a head-to-tail cyclic peptide, or a preference for regular secondary structure.
    • From an input structure: a PDB or mmCIF file, used in one of four ways.
      • A contig says which input residues to keep and how many residues to design between them, for example A1-80,10,/0,B5-12, where /0 starts a new chain.
      • Unindexed motif residues are kept fixed while the model decides where they sit in the sequence, which suits active-site scaffolding; they need a contig or a length.
      • A ligand lists the components in the structure to design around.
      • Partial diffusion adds a chosen amount of noise to the structure and denoises it, producing variants near the input instead of new backbones.

    For motifs and targets you can also choose which atoms stay fixed, which motif residues may change sequence, hotspot residues a binder should contact, and whether to redesign motif side chains. Residues use the chain and numbering of the input file.

    Outputs

    • designs/: each design as a PDB file and as the original mmCIF.
    • design_metrics.csv: per design, the number of residues, radius of gyration, helix, sheet and loop fractions, chain breaks, the largest deviation of the backbone's CA–CA distances from the ideal 3.8 Å bond length, backbone and side-chain clashes, ligand clashes when a ligand is present, and for partial diffusion the CA RMSD to the input. A metric the model did not compute is left blank.
    • summary.json: the settings and every design with its metrics.

    In a workflow, the designs port binds into the backbones input of MPNN Sequence Design and carries the radius of gyration (and, for partial diffusion, the RMSD to the input) as metrics, so a filter step can drop designs before sequence design.

    Limits

    • Metrics are sanity checks. Few chain breaks and clashes mean the backbone is well formed, not that it will fold or work. Design sequences, refold them, and compare with the backbone.
    • Hydrogen-bond conditioning is not offered, because the tool it needs is licensed for academic use only.
    • A contig refers to residues of an input structure, so a design from scratch uses a length instead.
    • A cyclic peptide cannot be combined with symmetry or partial diffusion, and symmetric designs are sampled one at a time, so they take longer.
    • More designs and more diffusion steps cost proportionally more.

    RFdiffusion3NA extends it to RNA and DNA and to protein-nucleic-acid complexes, MPNN Sequence Design designs sequences for the backbones, ESMFold2, RoseTTAFold3 and Boltz-2 refold them, BoltzGen and FreeBindCraft design binders against a target, and RFAntibody designs antibodies.

    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.

    RFdiffusion3 rfd3-design

    Job type
    rfd3-design
    Hardware
    t4l4a10l40s (default)a100-40gba100-80gbh100h200b200
    Typical runtime
    30 min on Nvidia L40S

    Payload

    Payload fields
    FieldTypeDescription
    input_structurefile_object
    contigstring

    Limits: min length 1, max length 1000

    lengthinteger | string
    ligandstring

    Limits: pattern ^[A-Za-z0-9]{1,3}(,[A-Za-z0-9]{1,3}){0,9}$

    unindexstring

    Limits: min length 1, max length 500

    select_fixed_atomsboolean | string | map<string, string>
    select_unfixed_sequencestring

    Limits: min length 1, max length 500

    select_hotspotsstring | map<string, string>
    symmetryobject
    symmetry.idrequiredstring

    Limits: pattern ^[CD][0-9]{1,2}$

    symmetry.is_symmetric_motifboolean
    symmetry.is_unsym_motifstring

    Limits: max length 200

    cyclic_chains[]string[]

    Limits: min items 1, max items 1

    partial_tnumber

    Limits: ≥ 1, ≤ 30

    is_non_loopyboolean
    redesign_motif_sidechainsboolean

    Default: false

    num_designsinteger

    Default: 8Limits: ≥ 1, ≤ 50

    num_timestepsinteger

    Default: 200Limits: ≥ 20, ≤ 400

    seedinteger

    Limits: ≥ 1, ≤ 2147483647

    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 = {
        "length": "110-120",
        "num_designs": 2,
        "num_timesteps": 200,
        "is_non_loopy": True,
        "seed": 7,
    }
    
    estimate = client.jobs.estimate(job_type="rfd3-design", payload=payload, resource="l40s")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-rfd3-design-run",
        job_type="rfd3-design",
        payload=payload,
        resource="l40s",
    )
    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 structure · optionalPDB, CIF

    Workflow outputs

    • ArchiveZIP
    • TableCSV
    • StructuresPDB