# Request a decision, set a stance, decide, clear a blocker, or record exact application. Resolution and application never provide human approval.

Request a decision, set a stance, decide, clear a blocker, or record exact application. Resolution and application never provide human approval.

Canonical: https://commentary.dev/docs/reference/api/mutate-review-thread-decision

`POST /api/v1/review/threads/{threadId}/decision`

Request a decision, set a stance, decide, clear a blocker, or record exact application. Resolution and application never provide human approval.

## Access

Use a credential with `commentary.comments.write`.

Provider access, workspace membership, and agent grants are enforced separately. A token does not expand access to a repository or resource. [Set up developer access](/docs/build/developer-access).

## Parameters

| Name | Location | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `threadId` | path | string | Yes |  |

## Request body

Required. Supported content types: `application/json`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `expectedVersion` | integer | Yes |  |
| `operationKey` | string | Yes | Minimum length: 8. Maximum length: 128. |
| `blockerActorKey` | string | No |  |
| `resultingRevision` | string | No |  |
| `requestDecision` | boolean | No |  |
| `action` | `"request_decision"` · `"signal"` · `"decide"` · `"clear_blocker"` · `"record_application"` | Yes |  |
| `signal` | `"agree"` · `"object"` · `"needs_clarification"` · `"blocker"` | No |  |
| `active` | boolean | No |  |
| `decision` | `"accepted_for_change"` · `"rejected"` · `"out_of_scope"` · `"clear"` | No |  |
| `reason` | string | No | Maximum length: 1000. |

## Call the endpoint

Replace path placeholders and your credential. For body operations, create `request.json` using the required fields above; this command does not invent resource identifiers or consent.

```bash
curl --request POST \
  'https://commentary.dev/api/v1/review/threads/<threadId>/decision' \
  --header 'Authorization: Bearer <your-token>' \
  --header 'Content-Type: application/json' \
  --data-binary @request.json
```

## Responses

| Status | Meaning | Payload |
| --- | --- | --- |
| `200` | Authorized review state or durable mutation receipt. | object |
| `400` | Invalid request. | See response headers or body contract |
| `401` | Authentication required. | See response headers or body contract |
| `403` | Current source, workspace, role or grant authority is required. | See response headers or body contract |
| `404` | Review or exact target is unavailable. | See response headers or body contract |
| `409` | Feature paused, stale version, or conflicting retry key. Refresh before creating a new intent. | See response headers or body contract |

### Successful response fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ok` | `true` | Yes |  |

## Recover from errors

Use the returned status and error body. Correct invalid fields before retrying; reconnect or narrow the target for authentication and permission errors. For conditional writes, reload the latest version before preparing a new request. Respect rate-limit headers and retry only when the operation’s idempotency contract permits it.

## Contract and related guidance

Operation ID: `mutateReviewThreadDecision`. [Download the OpenAPI contract](/docs/reference/openapi.json) for complete constraints and code generation. [Browse endpoints](/docs/reference/api-operations).
