---
title: "Report what the host did after an action decision"
method: POST
path: "/v1/receipts"
tags: ["decisions"]
---

# Report what the host did after an action decision

`POST /v1/receipts`

## Request

- Base URL: `https://api.contextdb.ai`
- URL: `https://api.contextdb.ai/v1/receipts`
- Auth: HTTP bearer

Attaches one terminal, host-reported execution receipt to the durable
`decision_id` returned by `recall_for_action`. ContextDB records the
report but does not inspect the downstream system. Structured fields
only: free-text payloads are not accepted. Acting after an `ask` or
`abstain` decision is retained with `policy_alignment=violated`.

## Headers

- `Idempotency-Key` string, required

## Request body

- ExecutionReceiptRequest
  - `user_id` string, required: End-user memory partition key. Not an identity assertion.
  - `decision_id` string, uuid, required
  - `action_name` string, required: Stable action category, such as appointment.book
  - `status` 'succeeded' | 'failed' | 'skipped', required
  - `external_ref` string: Optional opaque non-PII identifier in the downstream system
  - `error_code` string: Structured failure code; allowed only when status is failed

## Response `200`

The terminal execution receipt

- ExecutionReceiptResponse
  - `decision_id` string, uuid, required
  - `outcome` 'act' | 'ask' | 'abstain', required
  - `receipt` ExecutionReceipt, required
    - `id` string, uuid, required
    - `decision_id` string, uuid, required
    - `action_name` string, required
    - `status` 'succeeded' | 'failed' | 'skipped', required
    - `policy_alignment` 'aligned' | 'violated', required: Violated when the host attempted execution after ask or abstain
    - `external_ref` string, nullable, required
    - `error_code` string, nullable, required
    - `request_id` string, required
    - `created_at` string, date-time, required

## Other responses

- `400`: Malformed request or failed validation
- `401`: Missing, malformed, unknown, or revoked API key
- `403`: Authenticated but not allowed (entitlement or billing state)
- `404`: Target not found in the caller's partition (or missing)
- `409`: The decision already has a terminal receipt, or the Idempotency-Key conflicts with an earlier request.
- `429`: The client IP/project exceeded its request rate, or the project's idempotency retention capacity is full until older keys expire.
- `503`: Memory or metadata store unreachable

---

[API](https://skmtc.dev/contextdb/apis/contextdb-cloud-data-plane-api.md) · [All operations](https://skmtc.dev/contextdb/apis/contextdb-cloud-data-plane-api/llms.txt) · [OpenAPI document](https://skmtc.dev/contextdb/apis/contextdb-cloud-data-plane-api/revisions/9e441d2e21a7?raw)
