# Record one immutable human Decision against an exact proposal action.

Requires exact revisionId, actionId, proposal fingerprint, current strong If-Match, and Idempotency-Key. The first valid result is immutable; replay never retargets a later revision. A Decision is int

Canonical: https://commentary.dev/docs/reference/api/create-interaction-decision

`POST /api/v1/interactions/{interactionId}/decisions`

Requires exact revisionId, actionId, proposal fingerprint, current strong If-Match, and Idempotency-Key. The first valid result is immutable; replay never retargets a later revision. A Decision is intent, not Fulfillment or execution evidence.

## Access

Use a credential with the authentication scheme documented in the API contract.

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 |
| --- | --- | --- | --- | --- |
| `interactionId` | path | string | Yes | Opaque Interaction id. |
| `If-Match` | header | string | Yes |  |
| `Idempotency-Key` | header | string | Yes |  |

## Request body

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

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revisionId` | string | Yes |  |
| `actionId` | string | Yes |  |
| `proposalFingerprint` | string | Yes |  |
| `outcome` | `"approve"` · `"reject"` · `"abstain"` · `"conflict"` · `"acknowledge"` · `"choose"` · `"answer"` · `"comment"` · `"request_revision"` · `"snooze"` | Yes |  |
| `consequence` | object or null | No |  |

## 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/interactions/<interactionId>/decisions' \
  --header 'Authorization: Bearer <your-token>' \
  --header 'Content-Type: application/json' \
  --data-binary @request.json
```

## Responses

| Status | Meaning | Payload |
| --- | --- | --- |
| `200` | Successful response. | object |
| `201` | Successful response. | object |
| `400` | The request was invalid. | [ExternalError](/docs/reference/schemas/external-error) |
| `401` | Authentication is required. | [ExternalError](/docs/reference/schemas/external-error) |
| `403` | The token or session does not have permission for this resource. | [ExternalError](/docs/reference/schemas/external-error) |
| `404` | The resource was not found. | [ExternalError](/docs/reference/schemas/external-error) |
| `409` | Revision, action, fingerprint, revocation, or idempotency conflict. | See response headers or body contract |
| `410` | Proposal expired or content was purged. | See response headers or body contract |
| `412` | If-Match is stale or malformed. | See response headers or body contract |
| `428` | If-Match is required. | See response headers or body contract |
| `429` | The request was rate limited. | [ExternalError](/docs/reference/schemas/external-error) |

### Successful response fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | [InteractionDecisionResult](/docs/reference/schemas/interaction-decision-result) | No |  |

## 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: `createInteractionDecision`. [Download the OpenAPI contract](/docs/reference/openapi.json) for complete constraints and code generation. [Browse endpoints](/docs/reference/api-operations).
