---
title: "Assemble a multi-gene operon and check it"
method: POST
path: "/operon_design"
tags: ["Enzymes & cloning"]
---

# Assemble a multi-gene operon and check it

`POST /operon_design`

## Request

- Base URL: `https://seqbench.com/api/v1`
- URL: `https://seqbench.com/api/v1/operon_design`
- Auth: none required

Build a polycistronic operon from a promoter, a list of CDSs with their RBSs, spacers and a terminator — optionally recoding every CDS for a host — then scan the ASSEMBLED molecule for internal promoters, Shine-Dalgarno sequences, terminators, out-of-frame start codons and repeats. Scanning the product rather than the parts is the point: these elements are very often created BY THE JOIN between two parts, so checking each part alone finds nothing. Returns the sequence, an annotated GenBank file, and every element found. Assigns no translation rate — use rbs_library_design to choose RBSs, then rbs_predict to rank the result.

## Request body

- object
  - `genes` object[], required: The genes, in order (max 12).
    - `name` string: Label for the CDS feature.
    - `cds` string, required: The coding sequence, as DNA.
    - `rbs` string: Ribosome binding site placed in front of this gene. Omit for a consensus default, or pass "" for none.
  - `promoter` string: Promoter placed at the 5' end.
  - `terminator` string: Terminator placed at the 3' end.
  - `spacer` string: Sequence inserted between one CDS and the next gene's RBS.
  - `optimiseFor` 'ecoli' | 'human' | 'yeast' | 'cho' | 'pichia' | 'insect' | 'arabidopsis' | 'zebrafish': Recode every CDS with this host's most-frequent codons. The rewrite is checked to translate back to the same protein, and skipped for that gene if it does not. This is a determinate recoding, NOT a yield prediction — published codon-optimisation algorithms are close to a coin flip on whether they raise or lower real expression.
  - `name` string: LOCUS name for the GenBank output.
  - `includeGenbank` boolean: Return the annotated GenBank file.

## Response `200`

Tool ran successfully.

- SuccessResponse: Standard success envelope returned by every single-tool call.
  - `ok` unknown, required
  - `tool` string, required: The tool slug that ran.
  - `result` object, required: Tool-specific output object. Its shape depends on the tool — call `GET /{tool}` or see the docs for each tool's fields.
  - `gate` GateResult
    - `pass` boolean, required: True if and only if every hard check passed.
    - `checks` GateCheck[], required
      - `id` string, required
      - `label` string, required
      - `severity` 'hard' | 'soft', required
      - `pass` boolean, required
      - `message` string, required
      - `value` number
      - `threshold` string
    - `notChecked` string[], required: Honest list of what this gate does NOT verify.
  - `provenance` Provenance, required
    - `apiVersion` string, required
    - `tool` union, required: Tool slug, or an array of slugs (one per step) for a workflow.
      - string
      - string[]
    - `generatedAt` string, date-time, required: ISO 8601 timestamp of when the result was generated.

## Other responses

- `400`: Invalid argument or the tool could not run.
- `404`: Unknown tool.
- `429`: Rate limited (metered tools only). Body carries code `rate_limited` and retryable `true`; honor the Retry-After header.
- `503`: A metered tool is momentarily at capacity. The identical request should succeed after Retry-After; body carries code `upstream_unavailable`.

---

[API](https://skmtc.dev/seqbench/apis/seqbench-api.md) · [All operations](https://skmtc.dev/seqbench/apis/seqbench-api/llms.txt) · [OpenAPI document](https://skmtc.dev/seqbench/apis/seqbench-api/revisions/132575216865?raw)
