---
title: "Design an extra-long sgRNA array"
method: POST
path: "/elsa_design"
tags: ["CRISPR"]
---

# Design an extra-long sgRNA array

`POST /elsa_design`

## Request

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

Build a multiplexed CRISPR array that expresses many sgRNAs from one cassette and shares no long stretch with itself. Twenty sgRNAs built the obvious way carry twenty copies of the same Cas9 scaffold, promoter and terminator — a construct that recombines in the cell and that synthesis vendors refuse — so this draws each transcription unit's parts from the measured non-repetitive collection of Reis et al. (2019), selecting ACROSS promoters, handles and spacers at once rather than within each type, then re-measures the assembled molecule for repeats the junctions created. Returns the sequence, an annotated GenBank file and the pool usage. Takes guides; it does not choose or score them — use crispr_grna_design and crispr_offtarget_check for that.

## Request body

- object
  - `guides` string[], required: The 20 nt protospacers, in array order, WITHOUT their PAM. Strings, or {name, sequence} objects to label each unit. Max 27 — the size of the handle collection.
  - `lmax` integer: Longest stretch any two parts in the array may share, in bp (default 12). Lower is more stable and leaves fewer parts to choose from: the handle pool offers 12 at lmax 12, 18 at 15 and 24 at 20. Run elsa_capacity first.
  - `insulate` boolean: Place a neutral spacer between transcription units. Turning it off frees the spacer pool from the selection, which can let a longer array fit at a low lmax.
  - `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)
