---
title: "Append an agent-reported Fulfillment status for an exact approved proposal."
method: POST
path: "/api/v1/interactions/{interactionId}/fulfillment"
tags: ["Interactions"]
---

# Append an agent-reported Fulfillment status for an exact approved proposal.

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

## Request

- Base URL: `https://commentary.dev`
- URL: `https://commentary.dev/api/v1/interactions/{interactionId}/fulfillment`
- Auth: HTTP bearer

Requires ownership or explicit fulfillment authority, exact Decision/revision/action/fingerprint binding, and Idempotency-Key. Later reports correct history without rewriting it.

## Path parameters

- `interactionId` string, required

## Headers

- `Idempotency-Key` string, required
- `X-Correlation-Id` string
- `X-Commentary-Workspace-Id` string

## Request body

- object
  - `decisionId` string, required
  - `revisionId` string, required
  - `actionId` string, required
  - `proposalFingerprint` string, required
  - `status` 'received' | 'started' | 'completed' | 'failed' | 'unknown', required
  - `evidence` object, nullable: Sanitized JSON evidence, at most 8 KiB; credentials and raw logs are forbidden.

## Response `200`

Successful response.

- object

## Other responses

- `201`: Successful response.
- `400`: The request was invalid.
- `401`: Authentication is required.
- `403`: The token or session does not have permission for this resource.
- `404`: The resource was not found.
- `409`: Approval, fingerprint, lifecycle, expiry, or idempotency conflict.
- `410`: Interaction content was purged.
- `429`: The request was rate limited.

---

[API](https://skmtc.dev/commentary/apis/commentary-public-api.md) · [All operations](https://skmtc.dev/commentary/apis/commentary-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/commentary/apis/commentary-public-api/revisions/7aaafc198c52?raw)
