---
title: "CpG island finder"
method: POST
path: "/cpg_islands"
tags: ["Analysis"]
---

# CpG island finder

`POST /cpg_islands`

## Request

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

Find CpG islands by either published definition: Gardiner-Garden & Frommer 1987 (GC > 50%, observed/expected CpG > 0.6, >= 200 bp — the original, which also calls many Alu repeats) or Takai & Jones 2002 (GC >= 55%, obs/exp >= 0.65, >= 500 bp — written to exclude them). Windows are merged only where the merged region STILL meets the criteria, so every island returned satisfies the definition it is reported under. Reports the CpG DINUCLEOTIDE count separately from GC content, because conflating the two is the usual way this number goes wrong.

## Request body

- object
  - `sequence` string, required: DNA to scan (raw or FASTA). Max 5,000,000 bases.
  - `preset` 'gardiner-garden' | 'takai-jones': Which published criteria to apply. "gardiner-garden": Gardiner-Garden & Frommer 1987 (GC > 50%, obs/exp > 0.6, >= 200 bp; thresholds strict, as the paper states them) "takai-jones": Takai & Jones 2002 (GC >= 55%, obs/exp >= 0.65, >= 500 bp; excludes most Alu)
  - `minGcPct` number: Override the preset's GC threshold, 0-100.
  - `minObsExp` number: Override the preset's observed/expected CpG threshold.
  - `minLength` integer: Override the preset's minimum island length, bp.
  - `windowSize` integer: Scanning window in bp. 200 is Takai & Jones' window, and it is used for both presets so the two differ only in their thresholds (Gardiner-Garden & Frommer's 1987 paper scanned 100 bp windows).
  - `mergeGap` integer: Join passing regions closer than this, when the joined region still passes. Takai & Jones use 100.

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