POST /v1/outcomes
Submit an outcome anchored on a receipt_id. Outcomes are append-only — receipts themselves are never mutated.
See the conceptual overview at Outcomes.
Request
POST /v1/outcomes
Authorization: Bearer prxy_xxx
Content-Type: application/json
{
"receipt_id": "8c5a4e2a-9b6d-4f3e-89a3-aa3e8b1f7fc3",
"outcome": "succeeded",
"source": "agent_runner",
"score": 0.92,
"labels": ["auth-fix"],
"notes": "User reported the auth bug is gone after this turn."
}
Body fields
| Field | Type | Required | Notes |
|---|---|---|---|
receipt_id | UUID | yes | Must reference an existing receipt the caller’s tenant can see. |
outcome | enum | yes | One of 11 values (see below). |
source | enum | yes | One of 5 values (see below). |
score | float | no | 0..1 confidence. |
labels | string[] | no | Free-form tags scoped per tenant. |
notes | string | no | Hashed sha-256 server-side at write time. Raw text never persists. |
outcome enum
succeeded, partially_solved, failed, no_progress, regressed, user_satisfied, user_unsatisfied, tool_chain_succeeded, tool_chain_failed, review_pending, out_of_scope.
source enum
self_report, human_reviewer, webhook, automated_test, agent_runner.
V-27c will gate webhook and automated_test behind a signed-payload trusted-integration flow. Until then, treat them as user-supplied trust tier.
Response
{
"id": "1d2cf0fa-...",
"receipt_id": "8c5a4e2a-...",
"outcome": "succeeded",
"source": "agent_runner",
"score": 0.92,
"labels": ["auth-fix"],
"notes_hash": "sha256-...",
"created_at": "2026-05-07T18:32:01.123Z",
"memory_candidate_id": "7a92...-...-..."
}
memory_candidate_id is non-null when the outcome is positive (succeeded / partially_solved / user_satisfied / tool_chain_succeeded) and a candidate row was queued for reviewer promotion. Otherwise null.
Errors
| Status | Code | Cause |
|---|---|---|
| 400 | invalid_outcome | outcome not in the enum. |
| 400 | invalid_source | source not in the enum. |
| 400 | missing_receipt_id | receipt_id not provided. |
| 404 | receipt_not_found | receipt_id does not exist or is outside the caller’s tenant scope. |
| 409 | duplicate_outcome | An outcome with the same (receipt_id, source, outcome) already exists for this caller and append-only mode is on. |
See also
- GET /v1/receipts/:id/outcomes — list outcomes for a receipt.
- Memory candidates — what happens to positive outcomes.
- Outcomes concept — full schema and trust tiers.