---
title: "Record a hosted review decision (the same resume rail)"
method: POST
path: "/v1/review/{id}/decision"
tags: ["checkpoints"]
---

# Record a hosted review decision (the same resume rail)

`POST /v1/review/{id}/decision`

## Request

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

Record approve / revise / abandon from the hosted page. Server-side this IS POST /v1/checkpoints/{id}/resume — one implementation; the driving agent learns of the decision via the checkpoint webhooks / wait_job. 409 when the packet is no longer awaiting (superseded, expired, or already decided).

## Path parameters

- `id` string, required

## Response `200`

Decision recorded; the run resumes.

- ReviewDecisionResponse: Decision recorded; the run resumes (the SAME rail as POST /checkpoints/{id}/resume).
  - `ok` true, required
  - `stage` 'content' | 'layout' | 'motion'
  - `version` integer
  - `composeJobId` string

## Other responses

- `400`: Bad request — validation_error / invalid_cursor / invalid_query.
- `402`: Payment required — billing_required or x402 payment_*.
- `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)
