---
title: "KASP / ARMS Allele-Specific Primers"
method: POST
path: "/kasp_primer_design"
tags: ["Primers & oligos"]
---

# KASP / ARMS Allele-Specific Primers

`POST /kasp_primer_design`

## Request

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

Design KASP/ARMS allele-specific genotyping primers for a SNP: two allele-specific forward primers differing only at the 3' terminal base (one per allele), each with the standard KASP universal tail (FAM for allele A, HEX for allele B), a deliberate internal ARMS secondary mismatch near the 3' end whose strength complements that primer's own natural allele mismatch (strong↔weak), and one common downstream reverse primer sized to a chosen amplicon range. Because a forward primer reads the antisense strand, each primer's 3' base sits opposite the complement of the other allele, so the two primers get different mismatch classes and are reported separately (graded from the measured PCR yields in Kwok et al. 1990). Reuses the site's nearest-neighbor Tm engine.

## Request body

- object
  - `target` string, required: Nucleotide sequence (raw or FASTA; IUPAC accepted).
  - `snpPosition` integer, required: 1-based position of the SNP on the forward strand. Must be 18 or greater: the allele-specific primers end on the SNP, so they need at least 17 bp of upstream template to build a core from.
  - `alleleA` string, required: First allele (single base) — gets the FAM tail.
  - `alleleB` string, required: Second allele (single base) — gets the HEX tail.
  - `targetCoreTm` number: Target Tm (°C) for the allele-specific primer core (before the universal tail).
  - `minAmplicon` integer: Minimum amplicon length for the common reverse primer.
  - `maxAmplicon` integer: Maximum amplicon length for the common reverse primer.
  - `addSecondaryMismatch` boolean: Engineer the internal ARMS destabilizing mismatch near the 3' end.

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