---
title: "Which product is in this tube (mixture from one Sanger read)"
method: POST
path: "/outcome_deconvolve"
tags: ["Alignment & variants"]
---

# Which product is in this tube (mixture from one Sanger read)

`POST /outcome_deconvolve`

## Request

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

Decompose one Sanger trace into fractions over a set of candidate molecules — the intended construct, the empty backbone, a double insert, a flipped part — instead of onto a generic indel ladder. Non-negative least squares against the candidates' own sequences, so no molecule is ever assigned a negative share. Reports the R² of the fit, which is what says whether the tube holds anything outside the candidate set, and GROUPS candidates the read cannot tell apart rather than splitting their share between them. Feed it the alternatives from assembly_outcomes.

## Request body

- object
  - `readBases` string, required: Base calls of the read, e.g. from parse_sanger_trace.
  - `readChannels` array[], required: Per-base [A, C, G, T] intensities, one row per called base, read at that base's peak location.
    - number[]
  - `candidates` object[], required: The molecules this reaction could have produced, as { id, label, sequence, circular? }. Between 2 and 24; assembly_outcomes' intended plus alternatives is the intended source.

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