---
title: "Diagnostic digest planner"
method: POST
path: "/diagnostic_digest"
tags: ["Enzymes & cloning"]
---

# Diagnostic digest planner

`POST /diagnostic_digest`

## Request

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

Pick the restriction digest that tells your intended construct apart from the wrong ones on a screening gel. Digests every candidate, works out which bands would actually resolve at the chosen agarose percentage (size ratio, the gel's resolving window, and whether a band is too faint to score), and ranks single enzymes — then buffer-checked pairs if no single one works. The criterion is separating the INTENDED construct from every alternative; telling the alternatives apart from each other is reported as a bonus. Get the alternatives from assembly_outcomes.

## Request body

- object
  - `intended` string, required: The construct you designed, raw or FASTA.
  - `alternatives` object[], required: The wrong constructs to screen against, 1-12. assembly_outcomes emits these ready-made as `forDiagnosticDigest`.
    - `label` string: What this wrong construct is ("empty vector", "insert reversed").
    - `sequence` string, required: Its full sequence, raw or FASTA.
  - `circular` boolean: Treat every candidate as a circular plasmid.
  - `agarosePercent` number: Agarose percentage of the screening gel. Snapped to the nearest tabulated value (0.5, 0.7, 1, 1.2, 1.5, 2) and the one used is reported back, since the resolving window is what decides which bands separate.
  - `enzymes` string[]: Restrict the search to these enzymes (e.g. the ones on your bench). Default is the whole curated set of 49. An unrecognized name is rejected rather than skipped, so "does not discriminate" always means it was actually tried.
  - `includePairs` 'auto' | 'always' | 'never': Whether to search double digests. "auto" adds them only when no single enzyme separates everything.
  - `maxSuggestions` number: How many ranked options to return.

## 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)
