---
title: "List checkpoints (scope to a compose job or project)"
method: GET
path: "/v1/checkpoints"
tags: ["checkpoints"]
---

# List checkpoints (scope to a compose job or project)

`GET /v1/checkpoints`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/checkpoints`
- 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:read`)
  - API key in header `PAYMENT-SIGNATURE`

The version stack of approval packets, newest first. Scope with ?composeJobId= to see one run's gate history (v1→vN with per-version status + decisions) or ?projectId= for everything reviewable in a project.

## Query parameters

- `limit` integer
- `after` string
- `composeJobId` string
- `projectId` string

## Response `200`

Paginated checkpoints.

- CheckpointListResponse
  - `data` CheckpointResponse[], required
    - `id` string, required
    - `projectId` string, required
    - `composeJobId` string
    - `briefId` string
    - `kind` 'gate' | 'score', required
    - `stage` 'content' | 'layout' | 'motion'
    - `version` integer, required
    - `status` 'awaiting' | 'approved' | 'revised' | 'abandoned' | 'expired' | 'superseded', required
    - `artifact` unknown, required
    - `stillUrls` string[]: Presigned storyboard/eval stills — the packet's visual evidence (may be GC'd by the retention sweep after the job goes terminal; the decision record is immortal).
    - `criticVerdicts` unknown
    - `quote` CheckpointQuote
      - `thisStepUsd` number, required: What approving costs NEXT (the render at the final gate; $0 earlier).
      - `jobSpendSoFarUsd` number, required: What has SETTLED so far — $0 while the run is live (compose is charge-on-delivery on both rails), so abandoning at a gate charges nothing.
      - `estimatedJourneyTotalUsd` number, required: The same journey number the Brief quoted.
    - `revisionCycle` integer, required: Revise cycles this gate has consumed. The brief quote states the included count (revisionCyclesIncluded); beyond it, resume(revise) is refused with a typed error.
    - `decision` unknown
    - `reviewMode` 'agent' | 'hosted': How this packet is decided (from the Brief's gates). 'hosted' = the review PAGE captures the decision; absent/'agent' = the decision flows back through the driving agent.
    - `reviewUrl` string: Hosted review-page URL (present when reviewMode is 'hosted') — a human decides from this link, no account or agent session; the recorded decision rides the SAME resume rail, and the agent learns of it via checkpoint webhooks / wait_job.
    - `createdAt` number, required
    - `updatedAt` number, required
  - `pagination` PaginationMeta, required: Cursor pagination metadata.
    - `hasMore` boolean, required
    - `nextCursor` string, nullable, required
    - `prevCursor` string, nullable, required

## Other responses

- `400`: Bad request — validation_error / invalid_cursor / invalid_query.
- `401`: Missing or invalid Authorization header.
- `402`: Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).
- `403`: Forbidden — permission insufficient.
- `404`: Resource not found.
- `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)
