Skip to main content
Docs

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

    Tools · Computational Biology

    Sequence Mutator

    Apply point substitutions such as T315I to a protein sequence and get the wild type plus one sequence per variant, with every expected residue checked.

    Updated October 7, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    Sequence Mutator turns one protein sequence plus a list of substitutions into sequences you can fold. It emits the wild type unchanged and one sequence per variant, so a comparison keeps both arms in step.

    Writing a variant

    Each substitution is the residue you expect, its position, and the residue to put there: T315I. Join substitutions with + to combine them in a single variant, so T315I+E255K is one sequence carrying both changes, while T315I and E255K on separate lines are two sequences carrying one change each. An HGVS-style p. prefix is accepted and dropped, and names are normalized to upper case, so p.t315i and T315I are the same variant.

    Only substitutions between the 20 standard amino acids are supported. Stops, insertions, deletions and frameshifts are rejected rather than guessed at.

    Numbering

    Literature numbering rarely matches the indices of the construct you paste. first_residue_number is the number of the sequence's first residue, so a fragment that starts at residue 250 lines up with variants written in that numbering.

    Every substitution names the residue it expects, and that residue is checked against the sequence at its position. A wrong numbering offset fails with the residue actually found — T315I expects T at 315, but the sequence has A — instead of silently mutating a different site. This is the point of writing the expected residue at all.

    Inputs

    One protein sequence as one-letter codes: raw text or a single FASTA record, up to 5,000 residues. Whitespace and a trailing * are ignored and a FASTA header is read but not kept. Up to 50 variants, each combining at most 20 substitutions.

    Outputs

    • wild_type.fasta: the sequence as given, unchanged.
    • variants.fasta: every variant in one file, plus variants/<name>.fasta per variant.
    • summary.json: for each record, its id, the substitutions applied, the sequence and its file.

    A variant's name is its canonical substitution list (T315I+E255K), and that name is the record id, so later steps can tell the arms apart.

    Fold the results with ESMFold2: bind the wild type directly, or run one fold per variant. Each folded structure takes its variant's name, so downstream docking and comparison keep the arms labeled.

    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.

    Sequence Mutator sequence-mutate

    Job type
    sequence-mutate
    Hardware
    cpu (default)
    Typical runtime
    1 min on CPU

    Payload

    Payload fields
    FieldTypeDescription
    sequencerequiredstring | object
    mutations[]requiredstring[]

    Limits: min items 1, max items 50

    first_residue_numberinteger

    Default: 1Limits: ≥ -10000, ≤ 100000

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "sequence": ">synthetic_fragment residues 250-320\nMKVLAESDRQMKVLAGSDRQMKVLAGSDRQMKVLAGSDRQMKVLAGSDRQMKVLAGSDRQMKVLATSDRQM",
        "mutations": ["T315I", "E255K", "T315I+E255K"],
        "first_residue_number": 250,
    }
    
    estimate = client.jobs.estimate(job_type="sequence-mutate", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-sequence-mutate-run",
        job_type="sequence-mutate",
        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

    • Protein sequences · optionalFASTA, RAW

    Workflow outputs

    • ArchiveZIP
    • Protein sequencesFASTA
    • Protein sequencesFASTA