AxonFlow · Schema

DecideResponse

CompanyAI GovernanceAI AgentsPolicy EnforcementAudit LoggingComplianceMCPOpen Source

Properties

Name Type Description
pending_approval object Set when the call is held for a person's approval (#4370); the verdict is `needs_approval` and nothing may run.
approval_id string On an allow, the approval that admitted this call (#4370).
verdict string The PEP MUST enforce this verdict. `allow` = forward; `deny` = block; `needs_approval` = block, and the call is held for a person's approval: `pending_approval` names it and the retry spends it (#4370
decision_id string Fresh UUID per decision. Stable handle for audit-log correlation, follow-up explain calls, and PEP-side logging.
trace_id string W3C trace-context trace-id (32 lowercase hex). When the request carried a `traceparent` header, the trace-id is reused so multi-gateway-layer decisions stitch into one end-to-end trace. Otherwise a fr
stage string Echo of the request stage, for audit dashboards.
reasons array Human-readable reason strings backing the verdict. Empty on verdict=allow with no obligations. A deny with reason `unknown_constraint` keeps that code as its first entry and adds one entry per constra
obligations array PEP-side requirements that accompany an `allow` verdict (e.g. redact PII before forwarding). Always a non-nil array so PEP code can iterate without a nil-check.
evaluated_policies array Policy IDs that MATCHED during evaluation (not the total number of policies considered). Empty when no policy matched, except on an indeterminate deny (below). On `deny`, the first entry is the blocki
expires_at string When the decision expires. PEPs that cache decisions MUST re-call by this timestamp.
engine string Which policy engine authored this verdict: the ADR-065 decision plane, the only author on this route (PRD v11 §1.1). Omitted on a refusal no engine decided - an authentication failure, or a request re
subject_type string The type of principal the verdict was decided for (PRD v11 §1.6): `User` for a verified user token, `Client` when the request presented no user identity and its client credential is the principal. Omi
policy_bundle string The digest of the policy set that decided: the system corpus's restriction for this route and the organization root - the organization's active typed document composed with the deployment's baseline p
policy_packs array The add-on policy packs (PRD v11 §1.9) whose controls composed into `policy_bundle` on this route, each as `@`, sorted. Omitted when t
policy_identities array Each entry of `evaluated_policies`, in the same order, named (PRD v11 §1.14): the policy's own display name where it has one, whose it is, and for an organization's own policy or an installed pack's t
document_version integer The published version of the organization's active typed document (PRD v11 §1.14). Omitted while the organization has published nothing: `policy_bundle` names that implicit bundle by digest.
legacy_validators array A checksum validator that acted BEFORE the anchored engine decided (#4122): under an organization's recorded `pii=block` or `pii=redact` detection override, the Indonesia or India validator blocked th
View JSON Schema on GitHub

JSON Schema

axonflow-decide-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/axonflow/main/json-schema/axonflow-decide-response-schema.json",
  "title": "DecideResponse",
  "x-generated": "2026-10-09",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/axonflow-agent-openapi.yml#/components/schemas/DecideResponse",
  "type": "object",
  "required": [
    "verdict",
    "decision_id",
    "trace_id",
    "obligations",
    "evaluated_policies",
    "expires_at"
  ],
  "properties": {
    "pending_approval": {
      "$ref": "#/$defs/PendingApproval",
      "description": "Set when the call is held for a person's approval (#4370); the verdict is `needs_approval` and nothing may run."
    },
    "approval_id": {
      "type": "string",
      "format": "uuid",
      "description": "On an allow, the approval that admitted this call (#4370)."
    },
    "verdict": {
      "type": "string",
      "enum": [
        "allow",
        "deny",
        "needs_approval"
      ],
      "description": "The PEP MUST enforce this verdict. `allow` = forward;\n`deny` = block; `needs_approval` = block, and the call is held\nfor a person's approval: `pending_approval` names it and the\nretry spends it (#4370, PRD v11 §1.13). A PEP forwards only on\n`allow`. On an Enterprise deployment with the approval queue\nwired, an anchored CHALLENGE answers `needs_approval`; on the\nCommunity build, or when no approval could be queued, it is a\n`deny` whose first reason is `approval_required`.\n"
    },
    "decision_id": {
      "type": "string",
      "format": "uuid",
      "description": "Fresh UUID per decision. Stable handle for audit-log\ncorrelation, follow-up explain calls, and PEP-side logging.\n"
    },
    "trace_id": {
      "type": "string",
      "minLength": 32,
      "maxLength": 32,
      "pattern": "^[0-9a-f]{32}$",
      "description": "W3C trace-context trace-id (32 lowercase hex). When the\nrequest carried a `traceparent` header, the trace-id is\nreused so multi-gateway-layer decisions stitch into one\nend-to-end trace. Otherwise a fresh trace-id is minted.\n"
    },
    "stage": {
      "type": "string",
      "enum": [
        "llm",
        "tool",
        "agent"
      ],
      "description": "Echo of the request stage, for audit dashboards."
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Human-readable reason strings backing the verdict. Empty on\nverdict=allow with no obligations. A deny with reason\n`unknown_constraint` keeps that code as its first entry and\nadds one entry per constraint that could not be evaluated,\nthe binding one first:\n`<policy id> (<source>[, document version N]) could not be\nevaluated: <why>`, where the reason names the attributes it\ncould not establish.\nThe version is `version N` for an installed pack's policy,\nand a shipped control carries none. An id the activation did\nnot activate carries no parentheses, and a constraint whose\nunknown attribute was not recorded says `an attribute it reads`\nin place of the attribute.\n"
    },
    "obligations": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/DecisionObligation"
      },
      "description": "PEP-side requirements that accompany an `allow` verdict\n(e.g. redact PII before forwarding). Always a non-nil array\nso PEP code can iterate without a nil-check.\n"
    },
    "evaluated_policies": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Policy IDs that MATCHED during evaluation (not the total\nnumber of policies considered). Empty when no policy matched,\nexcept on an indeterminate deny (below). On `deny`, the first\nentry is the blocking policy; the rest (if any) are\nnon-blocking matches recorded for audit. On an\nindeterminate deny (reason `unknown_constraint`), the\nconstraints that could not be evaluated are the policies that\ndecided it: they come first, the binding one first, then\nwhat matched.\nOn `allow` with obligations, the entries are the policies\nthat produced the obligation. The full evaluation count\nwill be surfaced separately when the explain endpoint\n(`/api/v1/decisions/{id}/explain`) lands.\n"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "When the decision expires. PEPs that cache decisions MUST\nre-call by this timestamp.\n"
    },
    "engine": {
      "type": "string",
      "enum": [
        "anchored"
      ],
      "description": "Which policy engine authored this verdict: the ADR-065 decision\nplane, the only author on this route (PRD v11 §1.1). Omitted\non a refusal no engine decided - an authentication failure, or a\nrequest refused before the policy pass ran.\n"
    },
    "subject_type": {
      "type": "string",
      "description": "The type of principal the verdict was decided for (PRD v11 §1.6):\n`User` for a verified user token, `Client` when the request\npresented no user identity and its client credential is the\nprincipal. Omitted wherever `engine` is.\n"
    },
    "policy_bundle": {
      "type": "string",
      "description": "The digest of the policy set that decided: the system corpus's\nrestriction for this route and the organization root - the\norganization's active typed document composed with the\ndeployment's baseline permission pack, or, while it has published\nnothing, the implicit bundle of that pack and the organization\ntemplate. A rollback reinstates an earlier digest. Omitted wherever\n`engine` is.\n"
    },
    "policy_packs": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The add-on policy packs (PRD v11 §1.9) whose controls composed\ninto `policy_bundle` on this route, each as `<pack id>@<digest of\nthe pack document the deployment instantiated>`, sorted. Omitted\nwhen the deployment installs no pack or none binds on this route.\n"
    },
    "policy_identities": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/PolicyIdentity"
      },
      "description": "Each entry of `evaluated_policies`, in the same order, named (PRD\nv11 §1.14): the policy's own display name where it has one, whose\nit is, and for an organization's own policy or an installed pack's\nthe version it was published at. A shipped control carries no\nversion: `policy_bundle` identifies it. Additive:\n`evaluated_policies` stays a list of ids. Omitted when\n`evaluated_policies` is empty.\n"
    },
    "document_version": {
      "type": "integer",
      "description": "The published version of the organization's active typed\ndocument (PRD v11 §1.14). Omitted while the organization has\npublished nothing: `policy_bundle` names that implicit bundle by\ndigest.\n"
    },
    "legacy_validators": {
      "type": "array",
      "description": "A checksum validator that acted BEFORE the anchored engine decided\n(#4122): under an organization's recorded `pii=block` or\n`pii=redact` detection override, the Indonesia or India validator\nblocked the request or masked the response ahead of the decision\nplane. Omitted when none did, which is every request without\nsuch an override.\n",
      "items": {
        "type": "object",
        "required": [
          "validator",
          "action"
        ],
        "properties": {
          "validator": {
            "type": "string",
            "enum": [
              "indonesia_pii",
              "india_pii"
            ]
          },
          "action": {
            "type": "string",
            "enum": [
              "blocked",
              "masked"
            ]
          }
        }
      }
    }
  },
  "$defs": {
    "DecisionObligation": {
      "type": "object",
      "required": [
        "type"
      ],
      "description": "A PEP-side requirement attached to an `allow` verdict. Obligations are\nSELF-DESCRIBING and ENGINE-FULFILLABLE (ADR-056 / ADR-057, #2563):\n`/decide` is a pure PDP and never mutates content, so a `redact_pii`\nobligation is not \"redact this yourself with your own patterns\" — it is\n\"call the AxonFlow engine endpoint named in `fulfillment` to obtain\nengine-redacted content.\" Client-side redaction is forbidden; the\nblessed client path is `platform/shared/pep`.\n",
      "properties": {
        "type": {
          "type": "string",
          "description": "Obligation kind. Currently emitted: `redact_pii`. Future\nobligations will be added here as needed by PEP adapters.\n"
        },
        "detail": {
          "type": "string",
          "description": "Human-readable detail for audit logs."
        },
        "fulfillment": {
          "$ref": "#/$defs/ObligationFulfillment"
        }
      }
    },
    "ObligationFulfillment": {
      "type": "object",
      "description": "Names the engine call a PEP makes to discharge an obligation (since\n8.6.0). Fulfillment is a property of the contract, not of PEP-author\ndiscipline: a conforming PEP POSTs the obligation's source content to\n`endpoint` and forwards the engine-redacted content the endpoint\nreturns. There is no other blessed way to satisfy a `redact_pii`\nobligation. A PEP holding content of a type NOT in `content_types`\n(e.g. an image awaiting OCR-PII redaction) MUST fail closed rather than\nforward it unredacted.\n",
      "required": [
        "endpoint",
        "method",
        "phase"
      ],
      "properties": {
        "endpoint": {
          "type": "string",
          "description": "Engine path the PEP POSTs to in order to discharge the obligation.\nFor a request-phase `redact_pii` obligation this is\n`/api/v1/mcp/check-input`; the response-phase counterpart is\n`/api/v1/mcp/check-output`. `/decide` runs pre-call, so it only\never emits request-phase obligations.\n"
        },
        "method": {
          "type": "string",
          "description": "HTTP method to use against `endpoint`."
        },
        "phase": {
          "type": "string",
          "enum": [
            "request",
            "response"
          ],
          "description": "Which content the PEP submits. `request` = the PEP redacts the\nrequest it is about to forward (the `query` it asked `/decide`\nabout); `response` = the PEP redacts a backend response before\nreturning it. `/decide` emits only `request` obligations; the\n`response` value is part of the contract for PEP helpers that fan\nout to both phases.\n"
        },
        "content_types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The mime-types `endpoint`'s redaction detectors can handle today\n(e.g. `text/plain`). Deliberately content-type-agnostic: adding a\nmodality is a server-side detector registration plus a new entry\nhere, not a redesign of this shape.\n"
        }
      }
    },
    "PendingApproval": {
      "type": "object",
      "description": "A call held for a person's approval (#4370, PRD v11 §1.13). Pending\nis NOT allow: nothing ran, and the enforcement point must not\nforward. An approver approves the queue entry in the portal\n(Approvals), and the caller retries the same call naming\n`approval_id` (see the `X-Axonflow-Approval-Id` parameter).\n\nThe approval expires at `expires_at`: the approval requirement's\nown deadline, which the engine stamps 15 minutes after the decision\non v11. It is never extended; a retry after it is refused\n`approval_expired`.\n",
      "required": [
        "approval_id",
        "status",
        "plane",
        "retry"
      ],
      "properties": {
        "approval_id": {
          "type": "string",
          "format": "uuid",
          "description": "The queue entry's id; the retry names it."
        },
        "status": {
          "type": "string",
          "enum": [
            "pending",
            "approved"
          ],
          "description": "`pending`: nobody has decided it yet. `approved`: a person\napproved it and it is waiting for this caller's retry, which\nmust name the id.\n"
        },
        "plane": {
          "type": "string",
          "enum": [
            "mcp:request",
            "decide"
          ]
        },
        "expires_at": {
          "type": "string",
          "format": "date-time",
          "description": "When the approval lapses. Omitted on a retry of a still-pending approval."
        },
        "retry": {
          "type": "object",
          "required": [
            "header"
          ],
          "properties": {
            "header": {
              "type": "string",
              "enum": [
                "X-Axonflow-Approval-Id"
              ]
            },
            "argument": {
              "type": "string",
              "enum": [
                "approval_id"
              ],
              "description": "The MCP tool argument / MCP route body field that carries the id."
            },
            "body_field": {
              "type": "string",
              "enum": [
                "approval_id"
              ],
              "description": "The decide request field that carries the id."
            }
          }
        }
      }
    },
    "PolicyIdentity": {
      "type": "object",
      "description": "One policy a decision matched, as `policy_identities` names it (PRD\nv11 §1.14). An identifier is never presented as a name.\n",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The policy id, as `evaluated_policies` carries it."
        },
        "name": {
          "type": "string",
          "description": "The policy's own display name. Omitted when it declares none.\n"
        },
        "source": {
          "type": "string",
          "enum": [
            "shipped",
            "organization",
            "pack"
          ],
          "description": "Whose the policy is: a control the release ships (the system\ncorpus, the organization template, the deployment's baseline\npermission pack, or a recorded override's replacement of a\nshipped control), the organization's own published document, or\nan installed policy pack. Omitted for an id the engine did not\nactivate - a checksum validator's (`legacy_validators`).\n"
        },
        "version": {
          "type": "integer",
          "description": "The version an organization's own policy (its document's) or a\npack's control (the pack's) was published at. Omitted for a\nshipped control.\n"
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/axonflow-decide-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.