---
title: "Answer a held checkpoint (approve / revise / abandon)"
method: POST
path: "/v1/checkpoints/{id}/resume"
tags: ["checkpoints"]
---

# Answer a held checkpoint (approve / revise / abandon)

`POST /v1/checkpoints/{id}/resume`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/checkpoints/{id}/resume`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.cueframe.ai/api/auth/mcp/authorize`, token URL `https://api.cueframe.ai/api/auth/mcp/token`, scopes: `projects:write`)
  - API key in header `PAYMENT-SIGNATURE`

The A1 review grammar: one `decision` for the gate, optionally carrying anchored `comments` ({beatId} or {timecodeMs} anchors; per-anchor verdict approve|revise|lock — lock freezes the element contractually) and/or `edits` (your revised stage artifact). `revise` loops IN-JOB: the director revises and re-presents this same gate with a new packet (version+1); the brief quote states the included revision cycles — beyond them, revise is refused 402 with the path forward. `abandon` ends the run. Approve-with-comments is legal: the notes record without gating.

## Path parameters

- `id` string, required

## Request body

- CheckpointResumeRequest: POST /checkpoints/:id/resume body — the A1 review grammar.
  - `decision` 'approve' | 'revise' | 'abandon', required: The ONE verdict for this gate (GitHub review grammar). approve = proceed (comments allowed — they record as taste signal without gating); revise = the director revises per comments/edits and RE-PRESENTS this same gate (in-job, no re-meter); abandon = end the run.
  - `comments` CheckpointComment[]
    - `anchor` union, required: What the comment is about: a plan beat (content gate) or a timecode on the artifact (layout/motion gates).
      - object
        - `beatId` string, required
      - object
        - `timecodeMs` integer, required
    - `verdict` 'approve' | 'revise' | 'lock', required: Per-anchor verdict under the single gate decision. `lock` = contractually frozen — the director touching a locked element is a defect, surfaced as a lock_violation verdict on the next packet (the no-discard machinery).
    - `note` string
  - `edits` unknown
  - `globalNote` string

## Response `200`

Decision recorded; the run resumes.

- CheckpointResumeResponse: POST /checkpoints/:id/resume response.
  - `ok` true, required

## Other responses

- `400`: Bad request — validation_error / invalid_cursor / invalid_query.
- `401`: Missing or invalid Authorization header.
- `402`: Payment required — billing_required or x402 payment_*.
- `403`: Forbidden — permission insufficient.
- `404`: Resource not found.
- `409`: Conflict — stale_etag / idempotency_conflict / suggestions_already_complete.
- `429`: Rate limited. Retry-After header present.
- `500`: Internal error.

---

[API](https://skmtc.dev/cueframe/apis/cueframe-api.md) · [All operations](https://skmtc.dev/cueframe/apis/cueframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cueframe/apis/cueframe-api/revisions/8f9bfe362b4a?raw)
