---
title: "Read a hosted review packet (token-authenticated page data)"
method: GET
path: "/v1/review/{id}"
tags: ["checkpoints"]
---

# Read a hosted review packet (token-authenticated page data)

`GET /v1/review/{id}`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/review/{id}`
- Auth: none required

The checkpoint page's data: stage artifact (rendered from the packet's own snapshot), presigned stills, critic verdicts, the money triple, the recorded decision once resolved, and the run's v1→vN version stack. Authenticated by the packet's reviewToken (?token=) — the URL from the checkpoint.ready webhook / get_checkpoint. Expired or already-answered packets still render (with their decision), never an error page.

## Path parameters

- `id` string, required

## Response `200`

The review packet + version stack.

- ReviewPacketResponse
  - `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.
  - `createdAt` number, required
  - `updatedAt` number, required
  - `versionStack` object[], required: The run's v1→vN gate history — per-version status + decision summaries.
    - `id` string, required
    - `version` integer, required
    - `stage` 'content' | 'layout' | 'motion'
    - `status` string, required
    - `decision` string
    - `createdAt` number, required

## Other responses

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