Approve or deny a paused review
POST
/api/v1/executions/{id}/review_decisions
executions:write
Records the decision on an execution that is awaiting_review (or
waiting) with needs_human_review: true, auto-claims it for the
caller if unassigned, and resumes the chosen branch. Test-mode
executions resume inline and return 200 with the final state;
live-mode executions enqueue the resume and return 202 with
resume_enqueued: true. Requires executions:write.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired |
integer |
Execution id. Scoped to the calling api_client; a foreign id returns |
Request body
The review decision (approve or deny) for the paused step.
-
decisionstring required One ofapproveddenied -
notestring
Example request
{
"decision": "approved",
"note": "Manual review confirmed; OFAC clean."
}Responses
-
200 Review decided and downstream branch ran inline (test mode)
application/json-
dataExecutionDetail-
idinteger required -
objectstring required -
workflow_idinteger required -
statusstring required Lifecycle of an execution. `queued` (batch rows not yet dispatched), `pending`, `running` and `waiting` (paused on a Wait node or adverse-action waiting period) are in flight; `awaiting_review` is paused on human review; `completed`, `failed`, `cancelled` and `skipped` are terminal. One ofqueuedpendingrunningwaitingawaiting_reviewcompletedfailedcancelledskipped -
execution_keystring, nullable -
external_referencestring, nullable -
needs_human_reviewboolean required -
assigned_to_user_idinteger, nullable The reviewer who claimed this execution, if any. -
started_atstring (date-time), nullable -
completed_atstring (date-time), nullable -
created_atstring (date-time) required -
updated_atstring (date-time), nullable -
input_contextobject The payload originally sent at trigger time, plus resolved fields such as `execution_mode`, `submitted_by_user_id`, `user_approved`, `external_reference`, (for a test-mode run of a draft) `allow_inactive` and (for a test-mode run that replays a registered test subject) `sandbox_replay`. -
resume_enqueuedboolean
-
-
metaMetaSchema: Meta
-
request_idstring required Correlation id for this request. Also sent as the `X-Request-Id` response header; quote it when contacting support.
-
200 example{ "data": { "id": 1842, "object": "execution", "workflow_id": 27, "status": "queued", "execution_key": "api_client:12:3fa85f64-5717-4562-b3fc-2c963f66afa6", "external_reference": "rv-app-20491", "needs_human_review": true, "review_status": "none", "assigned_to_user_id": 1, "started_at": "2026-05-08T18:41:05Z", "completed_at": "2026-05-08T18:41:05Z", "created_at": "2026-05-08T18:41:05Z", "updated_at": "2026-05-08T18:41:05Z", "input_context": {}, "resume_enqueued": false }, "meta": { "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f" } } -
-
202 Review decided and downstream branch enqueued (live mode)
application/json-
dataExecutionDetail-
idinteger required -
objectstring required -
workflow_idinteger required -
statusstring required Lifecycle of an execution. `queued` (batch rows not yet dispatched), `pending`, `running` and `waiting` (paused on a Wait node or adverse-action waiting period) are in flight; `awaiting_review` is paused on human review; `completed`, `failed`, `cancelled` and `skipped` are terminal. One ofqueuedpendingrunningwaitingawaiting_reviewcompletedfailedcancelledskipped -
execution_keystring, nullable -
external_referencestring, nullable -
needs_human_reviewboolean required -
assigned_to_user_idinteger, nullable The reviewer who claimed this execution, if any. -
started_atstring (date-time), nullable -
completed_atstring (date-time), nullable -
created_atstring (date-time) required -
updated_atstring (date-time), nullable -
input_contextobject The payload originally sent at trigger time, plus resolved fields such as `execution_mode`, `submitted_by_user_id`, `user_approved`, `external_reference`, (for a test-mode run of a draft) `allow_inactive` and (for a test-mode run that replays a registered test subject) `sandbox_replay`. -
resume_enqueuedboolean
-
-
metaMetaSchema: Meta
-
request_idstring required Correlation id for this request. Also sent as the `X-Request-Id` response header; quote it when contacting support.
-
202 example{ "data": { "id": 1842, "object": "execution", "workflow_id": 27, "status": "queued", "execution_key": "api_client:12:3fa85f64-5717-4562-b3fc-2c963f66afa6", "external_reference": "rv-app-20491", "needs_human_review": true, "review_status": "none", "assigned_to_user_id": 1, "started_at": "2026-05-08T18:41:05Z", "completed_at": "2026-05-08T18:41:05Z", "created_at": "2026-05-08T18:41:05Z", "updated_at": "2026-05-08T18:41:05Z", "input_context": {}, "resume_enqueued": true }, "meta": { "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f" } } -
-
401 Missing, malformed, expired or revoked bearer token. The
WWW-Authenticateheader carries the RFC 6750 challenge.application/json401 example{ "error": { "code": "unauthorized", "message": "A valid bearer token is required.", "details": [], "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f", "doc_url": "https://cascades.crscreditapi.com/docs/api/errors/unauthorized" } } -
403
insufficient_scope,review_assigned_elsewhereorlive_mode_forbiddenapplication/json403 example{ "error": { "code": "review_assigned_elsewhere", "message": "This review is assigned to another user.", "details": [], "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f", "doc_url": "https://cascades.crscreditapi.com/docs/api/errors/review_assigned_elsewhere" } } -
404 Resource does not exist or belongs to another tenant / api_client
application/json404 example{ "error": { "code": "not_found", "message": "The requested resource was not found.", "details": [], "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f", "doc_url": "https://cascades.crscreditapi.com/docs/api/errors/not_found" } } -
409
review_not_pendingorreview_already_decidedapplication/json409 example{ "error": { "code": "review_not_pending", "message": "Execution is not awaiting human review.", "details": [], "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f", "doc_url": "https://cascades.crscreditapi.com/docs/api/errors/review_not_pending" } } -
422
validation_failed—decisionmust beapprovedordeniedapplication/json422 example{ "error": { "code": "validation_failed", "message": "The request could not be processed.", "details": [ { "field": "decision", "message": "must be approved or denied" } ], "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f", "doc_url": "https://cascades.crscreditapi.com/docs/api/errors/validation_failed" } } -
429 Rate limit exceeded (60 req/min per IP on
/api/v1, 600 req/hour per token prefix, or 300 req/5 min per IP globally). The body is the standard error envelope andRetry-Aftergives the seconds until the window resets.application/json429 example{ "error": { "code": "rate_limited", "message": "Rate limit exceeded. Retry later.", "details": [], "request_id": "7d4c2f48-9a1b-4c3d-8e2f-1a2b3c4d5e6f", "doc_url": "https://cascades.crscreditapi.com/docs/api/errors/rate_limited" } }