List checkpoints (scope to a compose job or project)
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.
API key auth. Prefix cf_live_ for production orgs, cf_test_ for sandbox.
In: header
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/checkpoints"{ "data": [ { "id": "string", "projectId": "string", "composeJobId": "string", "briefId": "string", "kind": "gate", "stage": "content", "version": 0, "status": "awaiting", "artifact": null, "stillUrls": [ "string" ], "criticVerdicts": null, "quote": { "thisStepUsd": 0, "jobSpendSoFarUsd": 0, "estimatedJourneyTotalUsd": 0 }, "revisionCycle": 0, "decision": null, "reviewMode": "agent", "reviewUrl": "string", "createdAt": 0, "updatedAt": 0 } ], "pagination": { "hasMore": true, "nextCursor": "string", "prevCursor": "string" }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}Read a hosted review packet (token-authenticated page data) GET
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.
Record a hosted review decision (the same resume rail) POST
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).