Complete outcome
Closes and bills ONE outcome run. This is the only way to close a run; POST /signal/outcome never accepts complete.
Closes the run only. If a step carried a composite, that occurrence still needs its own POST /signal/composite/complete.
Authorization
apiKey Organisation-scoped key from Settings → API Keys.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
The completion-only shape: { customerId, runId }, plus the common member / idempotencyKey fields every signal accepts and an optional custom object. No agentKey, no usage, no composite — this closes an EXISTING run that an earlier step signal already opened, so there is no step behind THIS request and nothing here to price.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/signal/outcome/complete" \ -H "Content-Type: application/json" \ -d '{ "customerId": "cus_abc123", "runId": "ticket_9021" }'{ "statusCode": 200, "statusDetail": { "status": "SUCCESS", "message": "OK" }, "result": { "status": "COMPLETED", "usageLog": null, "rawId": "raw_4k8w2r" }}{ "statusCode": 202, "statusDetail": { "status": "SUCCESS", "message": "Signal accepted for processing." }, "result": { "queued": true, "messageId": "msg_2f4a1b8c", "rawId": "raw_4k8w2r" }}{ "statusCode": 400, "statusDetail": { "status": "ERROR", "message": "Request body must be valid JSON." }, "result": {}}{ "statusCode": 401, "statusDetail": { "status": "ERROR", "message": "Invalid API key." }, "result": {}}{ "statusCode": 404, "statusDetail": { "status": "ERROR", "message": "No customer with id \"cus_abc123\"." }, "result": {}}{ "statusCode": 409, "statusDetail": { "status": "ERROR", "message": "Outcome \"Resolved ticket\" has already been completed." }, "result": {}}{ "statusCode": 422, "statusDetail": { "status": "ERROR", "message": "No credit with agent key \"summarize\" exists in this workspace." }, "result": {}}{ "statusCode": 500, "statusDetail": { "status": "ERROR", "message": "Could not complete the request." }, "result": {}}Record outcome POST
Records one step of a multi-call workflow. `agentKey` names the OutcomeStep. `runId` is required and groups every signal of one run — a step may repeat freely. This only records the step; it never bills. Close and bill the run with a separate call to [`POST /signal/outcome/complete`](/docs/api-reference/signals/completeOutcomeSignal). If the model has both cache-read and cache-write rates, `cacheTokens` carries the cache-**read** tokens only (billed at the cache-read rate); send cache-write tokens separately as `cacheWriteTokens`.
Record wallet POST
Debits the customer's wallet at the model's provider cost. No `agentKey` — this meters money, not a named entitlement — and no `composite`. The wallet may go negative; a signal is never refused for lack of funds. If the model has both cache-read and cache-write rates, `cacheTokens` carries the cache-**read** tokens only (billed at the cache-read rate); send cache-write tokens separately as `cacheWriteTokens`.