Cases

Read one case as its decision card

GET
/v1/cases/{caseId}

Organization API key with decision:read. The card comes from the case's owner.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

An organization API key. Its scopes decide what it may call; decision:shadow is the narrowest: SHADOW evaluations through POST /v1/authority/grants or its alias POST /v1/authority/enforce-and-bind only (DECISION_SHADOW_MODE_DENIED in any other mode; DECISION_SHADOW_FIELD_DENIED for a body carrying context.decionis_policy, evidence or escalation), with no integration dispatch. A key whose only scope is decision:shadow (an AgentSafe hosted gateway's) reaches exactly those two, POST /v1/auth/credential-context, POST /v1/hosted-gateway/keys/confirm and POST /v1/hosted-gateway/keys/revoke-self; every other route answers 403 HOSTED_GATEWAY_KEY_PATH_DENIED. decision:enforce is an enforced hosted gateway's key: evaluations in SHADOW or ENFORCEMENT through POST /v1/authority/grants or its alias (400 DECISION_ENFORCE_FIELD_DENIED for a body carrying context.decionis_policy; it never holds policy:write), and the grants and managed escalations they bind. A key whose scopes are decision:enforce (with or without decision:shadow) reaches exactly POST /v1/authority/enforce-and-bind, POST /v1/authority/grants, GET /v1/authority/grants/{grant_id}, POST /v1/authority/grants/{grant_id}/claims, POST /v1/authority/grants/{grant_id}/receipts, POST /v1/authority/grants/{grant_id}/reconciliations, POST /v1/execution/verify-token, POST /v1/execution/claim-token, POST /v1/execution/consume-token, POST /v1/execution/finalize-token, GET /v1/authority/escalations/{escalation_id}, DELETE /v1/authority/escalations/{escalation_id}, POST /v1/auth/credential-context, POST /v1/hosted-gateway/keys/confirm and POST /v1/hosted-gateway/keys/revoke-self, each id a UUID; every other route answers 403 HOSTED_GATEWAY_KEY_PATH_DENIED.

In: header

Path Parameters

caseId*string

<owner>:<kind>:<ref>, for example commerce:payment:<uuid> or core:escalation:<uuid>.

Lengthlength <= 200

Query Parameters

view?string
Default"card"

Value in

  • "card"
  • "business-central"
  • "assistant"

Response Body

application/json

application/json

curl -X GET "https://example.com/v1/cases/string"
{}

List the decisions waiting for a person GET

Core's façade over every case owner (Core protocol escalations, procurement referrals, policy proposals and signed findings; Commerce managed cases). Organization API key with decision:read. Case state stays with its owner; Core keeps only the owner reference and delivery receipts. Business Central asserts its signed-in user with `x-decionis-actor: entra:<tenant id>:<object id>` inside the tenant its connection credential proves; an MCP OAuth token names its own user. Without a person every card is listed with `can_decide` false. `GET /v1/protocol/decisions/awaiting-approval` is a deprecated alias on the same handler and keeps its original query and response.

Decide a case (the one inbound decision path) POST

Every channel resolves here, through DecisionActionResolver. Teams and Slack callbacks, the Business Central extension and the `decionis.cases.*` MCP tools all reach the same steps. The channel identity must belong to the workspace's tenant, resolve to a current Accounts member and hold the case's authority. When the authority requirement asks, Presence must have approved the person's passkey first (428 with `step_up_url`). The transition happens at the case's owner, with a revision check, and is applied once per case revision whichever inbox it came from. Organization API key with decision:write and a person (Business Central `x-decionis-actor` or an MCP OAuth token), or the named recipient's own Account session with the signed email `link`.