CAIN-42 is in Public Beta. Expect changes, and do not rely on it as your only control for anything critical. What beta means
CAIN-42 CAIN Studio

API reference · schema

Decision

12 fields · used by 1 operations

Last reviewed 2026-10-14

Fields

FieldTypeMeaning
decision_id requiredstring
verdict requiredstringRun the tool only when this starts with ALLOWED. REQUIRE_APPROVAL means held for a human; BLOCKED means refused.
blocked requiredbooleantrue only for a refusal. A held action is blocked=false and still must not run: check verdict, not this field alone.
enforcing requiredboolean
modestringenforce or shadow
approval_id['string', 'null']set when the action is held: POST /fabric/approvals/{approval_id}/approve with a key other than the agent's own, then send the same call again
path['string', 'null']
service['string', 'null']
chain_id['string', 'null']
schema_versioninteger
principalobject
stages requiredarray of object

Smallest valid example

{
  "decision_id": "fd_dd061dadd0a2473d9b4c0827",
  "verdict": "REQUIRE_APPROVAL",
  "blocked": false,
  "enforcing": false,
  "stages": [
    {}
  ]
}

Used by 1 operation

POST/fabric/decisionsAsk the control plane to decide on a proposed action

JSON Schema

Show the raw definition
{
  "type": "object",
  "required": [
    "decision_id",
    "verdict",
    "blocked",
    "enforcing",
    "stages"
  ],
  "properties": {
    "decision_id": {
      "type": "string",
      "example": "fd_dd061dadd0a2473d9b4c0827"
    },
    "verdict": {
      "type": "string",
      "description": "Run the tool only when this starts with ALLOWED. REQUIRE_APPROVAL means held for a human; BLOCKED means refused.",
      "example": "REQUIRE_APPROVAL"
    },
    "blocked": {
      "type": "boolean",
      "description": "true only for a refusal. A held action is blocked=false and still must not run: check verdict, not this field alone."
    },
    "enforcing": {
      "type": "boolean"
    },
    "mode": {
      "type": "string",
      "description": "enforce or shadow"
    },
    "approval_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "set when the action is held: POST /fabric/approvals/{approval_id}/approve with a key other than the agent's own, then send the same call again"
    },
    "path": {
      "type": [
        "string",
        "null"
      ]
    },
    "service": {
      "type": [
        "string",
        "null"
      ]
    },
    "chain_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "schema_version": {
      "type": "integer"
    },
    "principal": {
      "type": "object",
      "additionalProperties": true
    },
    "stages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "stage": {
            "type": "string",
            "description": "identity, intent, policy, authorization, risk, trust, ..."
          },
          "verdict": {
            "type": "string",
            "description": "allow, deny, require_approval, skipped, not_configured, deferred"
          },
          "enforcing": {
            "type": "boolean",
            "description": "false means the stage only recorded what it saw"
          },
          "ran": {
            "type": "boolean"
          },
          "detail": {
            "type": "string",
            "description": "the reason, in plain words"
          },
          "data": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}

Try CAIN-42 on your own agents

Create a free account and every new account starts with a 7-day trial of the full platform. Or try the sandbox first, with no account at all.

Create a free account →  ·  Try the sandbox  ·  See the whole ecosystem