Decide a case (the one inbound decision path)
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.
Authorization
ApiKeyAuth 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
length <= 200Query Parameters
"card"Value in
- "card"
- "business-central"
- "assistant"
Request Body
application/json
Value in
- "approve"
- "reject"
- "edit"
- "escalate"
0 <= valueuuiditems <= 16length <= 1000Signed email fallback link, for the email channel only.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/cases/string/decisions" \ -H "Content-Type: application/json" \ -d '{ "verb": "approve", "revision": 0 }'{ "applied": true, "card": {}}Read one case as its decision card GET
Organization API key with decision:read. The card comes from the case's owner.
Hand a case to delivery (internal) POST
Internal. A producer (Commerce) authenticates with its producer token (`DECIONIS_DELIVERY_PRODUCERS_JSON`) and may only deliver cases of the owners it holds. Core looks recipients up through Accounts, delivers in channel order (Business Central in-app, Teams, Slack, the assistant; email only notifies, or carries a signed link when the person has no other channel), deduplicates by content key and retries in the worker. 503 delivery_disabled while `DECIONIS_DELIVERY_ENABLED` is not 1.

