Called by an enforcement adapter — the V2 middleware’s
HttpDecideClient, the Node adapter or sidecar, or the Kong plugin —
once per protected action, before the action is forwarded. The adapter
authenticates with its own per-adapter bearer (issued at adapter
registration). The caller’s access token travels separately, inside
the body as presented_authorization; identity, tenant and scopes are
derived only from that verified token, never from other body fields.
The request’s surface claims (surface.canonical_resource_uri,
platform, environment, bundle version and digest) are compared with
what MudraID has registered for the authenticated adapter. Any
authentication or binding failure answers one neutral 401.
The decision runs a fixed gate order: contract → identity/tenant →
authority/delegation → containment → risk → entitlement → governance.
It is deny-closed: an authoritative negative is deny; a missing,
stale, conflicting or unavailable required fact, or a breached
deadline, is not_safely_decided; only a decision where every gate
passes on fresh facts is allow. An allow authorizes one forward
(directive: forward_once); every other outcome carries
directive: block. Adapters treat any non-200 as “could not consult
the authority” and deny.
When the adapter sends an execution snapshot, the decision is bound
to the digest of the exact request bytes it will forward. Decision
responses can carry an RS256 signature; signing is a deployment
setting and is off by default, so do not assume a response is signed.
The canonical action resolved from the signed bundle:
action_id, action_version, mapping_id, mapping_version,
required_scopes. (protected_action is accepted as an alias.)
RS256 decision signature. Present only when decision signing is enabled.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"MudraID","description":"A trust layer for AI agents. Verifiable identity, scoped access, and fast revocation for agent-to-API calls.","colors":{"primary":"#4F46E5","light":"#818CF8","dark":"#3730A3"},"logo":{"light":"https://mintcdn.com/decryptogen/z-Oj43wlHE8zplz5/logo/light.png?fit=max\u0026auto=format\u0026n=z-Oj43wlHE8zplz5\u0026q=85\u0026s=0c6c21890a4cafe2c104b7662de241dd","dark":"https://mintcdn.com/decryptogen/c55QGh_jKgDanCLK/logo/dark.png?fit=max\u0026auto=format\u0026n=c55QGh_jKgDanCLK\u0026q=85\u0026s=e23c37fad98bb4b4cfdd81c18c0f9927"},"favicon":"https://mintcdn.com/decryptogen/HDWn3R8cmMvdFoEj/favicon.png?fit=max\u0026auto=format\u0026n=HDWn3R8cmMvdFoEj\u0026q=85\u0026s=0d72142173735dabb31eb3c139604740","navbar":{"primary":{"type":"button","label":"Get Started","href":"/guides/get-started/what-is-mudraid"}},"footer":{"socials":{"x":"https://x.com/mudraid","linkedin":"https://www.linkedin.com/company/mudraid","youtube":"https://www.youtube.com/@mudraid"},"links":[{"header":"Product","items":[{"label":"Overview","href":"/overview/introduction"},{"label":"Security","href":"/security/overview"},{"label":"Pricing","href":"https://mudraid.ai/pricing"}]},{"header":"Developers","items":[{"label":"Documentation","href":"/overview/introduction"},{"label":"API reference","href":"/api-reference/introduction"},{"label":"SDKs","href":"/sdks/python-sdk/overview"}]},{"header":"Company","items":[{"label":"About","href":"https://mudraid.ai/about"},{"label":"Contact","href":"https://mudraid.ai/contact"}]},{"header":"Legal","items":[{"label":"Terms \u0026 Conditions","href":"https://mudraid.ai/terms"},{"label":"Privacy Policy","href":"https://mudraid.ai/privacy"}]}]},"seo":{"metatags":{"og:type":"website","og:site_name":"MudraID","og:title":"MudraID — a trust layer for AI agents","og:description":"Verifiable identity, scoped access, and fast revocation for agent-to-API calls.","og:image":"https://docs.mudraid.ai/images/og-cover.png","twitter:card":"summary_large_image","twitter:title":"MudraID — a trust layer for AI agents","twitter:description":"Verifiable identity, scoped access, and fast revocation for agent-to-API calls.","twitter:image":"https://docs.mudraid.ai/images/og-cover.png"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"decryptogen","hasAudioNarration":false,"actualSubdomain":"decryptogen","customDomains":["docs.mudraid.ai"],"gitSource":{"type":"github","owner":"decryptellix","repo":"mudraid-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6acc951d1ea505514a77d0c0","clientVersion":"0.0.4117","searchFilterCounts":[{"language":"default","tag":"For developers","count":23},{"language":"default","tag":"API Reference","count":8},{"language":"default","tag":"Overview","count":7},{"language":"default","tag":"For decision-makers","count":7},{"language":"default","tag":"Resources","count":6},{"language":"default","tag":"Public Contracts","count":6},{"language":"default","tag":"Agent Developer","count":4},{"language":"default","tag":"Concepts","count":4},{"language":"default","tag":"Platform Operator","count":4},{"language":"default","tag":"FastAPI Middleware","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"img[src*=\"/logo/\"]{height:48px!important;max-height:48px!important;width:auto!important}footer{background:radial-gradient(circle at top left, #102A5C 0%, #050816 45%, #02040A 100%)!important}footer p,footer a,footer li,footer span,footer small,footer strong,footer h2,footer h3,footer h4{color:#E5E7EB!important}footer a:hover{color:#FFFFFF!important}footer img[src*=\"/logo/\"]{content:url(\"/logo/white-v3.png\");height:50px!important;max-height:50px!important}footer :has(>img[src*=\"/logo/\"])::after{content:\"Secure identity and trust infrastructure for AI agents. Verify agents, delegate authority, and scale automation with confidence.\";display:block;max-width:22rem;margin-top:0.75rem;color:#9CA3AF;font-size:0.875rem;line-height:1.6}"}],"page":{"pagePath":"api-reference/enforcement/decide-one-protected-action","slug":"/api-reference/enforcement/decide-one-protected-action","pageMetadata":{"title":"Decide one protected action","description":"Called by an enforcement adapter — the V2 middleware's\n`HttpDecideClient`, the Node adapter or sidecar, or the Kong plugin —\nonce per protected action, before the action is forwarded. The adapter\nauthenticates with its own per-adapter bearer (issued at adapter\nregistration). The caller's access token travels separately, inside\nthe body as `presented_authorization`; identity, tenant and scopes are\nderived only from that verified token, never from other body fields.\n\nThe request's surface claims (`surface.canonical_resource_uri`,\nplatform, environment, bundle version and digest) are compared with\nwhat MudraID has registered for the authenticated adapter. Any\nauthentication or binding failure answers one neutral `401`.\n\nThe decision runs a fixed gate order: contract → identity/tenant →\nauthority/delegation → containment → risk → entitlement → governance.\nIt is **deny-closed**: an authoritative negative is `deny`; a missing,\nstale, conflicting or unavailable required fact, or a breached\ndeadline, is `not_safely_decided`; only a decision where every gate\npasses on fresh facts is `allow`. An `allow` authorizes one forward\n(`directive: forward_once`); every other outcome carries\n`directive: block`. Adapters treat any non-`200` as \"could not consult\nthe authority\" and deny.\n\nWhen the adapter sends an `execution` snapshot, the decision is bound\nto the digest of the exact request bytes it will forward. Decision\nresponses can carry an RS256 `signature`; signing is a deployment\nsetting and is off by default, so do not assume a response is signed.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1/adapter/enforcement/decide","href":"/api-reference/enforcement/decide-one-protected-action","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Called by an enforcement adapter — the V2 middleware’s\\n\", _jsx(_components.code, {\n children: \"HttpDecideClient\"\n }), \", the Node adapter or sidecar, or the Kong plugin —\\nonce per protected action, before the action is forwarded. The adapter\\nauthenticates with its own per-adapter bearer (issued at adapter\\nregistration). The caller’s access token travels separately, inside\\nthe body as \", _jsx(_components.code, {\n children: \"presented_authorization\"\n }), \"; identity, tenant and scopes are\\nderived only from that verified token, never from other body fields.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The request’s surface claims (\", _jsx(_components.code, {\n children: \"surface.canonical_resource_uri\"\n }), \",\\nplatform, environment, bundle version and digest) are compared with\\nwhat MudraID has registered for the authenticated adapter. Any\\nauthentication or binding failure answers one neutral \", _jsx(_components.code, {\n children: \"401\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The decision runs a fixed gate order: contract → identity/tenant →\\nauthority/delegation → containment → risk → entitlement → governance.\\nIt is \", _jsx(_components.strong, {\n children: \"deny-closed\"\n }), \": an authoritative negative is \", _jsx(_components.code, {\n children: \"deny\"\n }), \"; a missing,\\nstale, conflicting or unavailable required fact, or a breached\\ndeadline, is \", _jsx(_components.code, {\n children: \"not_safely_decided\"\n }), \"; only a decision where every gate\\npasses on fresh facts is \", _jsx(_components.code, {\n children: \"allow\"\n }), \". An \", _jsx(_components.code, {\n children: \"allow\"\n }), \" authorizes one forward\\n(\", _jsx(_components.code, {\n children: \"directive: forward_once\"\n }), \"); every other outcome carries\\n\", _jsx(_components.code, {\n children: \"directive: block\"\n }), \". Adapters treat any non-\", _jsx(_components.code, {\n children: \"200\"\n }), \" as “could not consult\\nthe authority” and deny.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"When the adapter sends an \", _jsx(_components.code, {\n children: \"execution\"\n }), \" snapshot, the decision is bound\\nto the digest of the exact request bytes it will forward. Decision\\nresponses can carry an RS256 \", _jsx(_components.code, {\n children: \"signature\"\n }), \"; signing is a deployment\\nsetting and is off by default, so do not assume a response is signed.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Decide one protected action","description":"Called by an enforcement adapter — the V2 middleware's\n`HttpDecideClient`, the Node adapter or sidecar, or the Kong plugin —\nonce per protected action, before the action is forwarded. The adapter\nauthenticates with its own per-adapter bearer (issued at adapter\nregistration). The caller's access token travels separately, inside\nthe body as `presented_authorization`; identity, tenant and scopes are\nderived only from that verified token, never from other body fields.\n\nThe request's surface claims (`surface.canonical_resource_uri`,\nplatform, environment, bundle version and digest) are compared with\nwhat MudraID has registered for the authenticated adapter. Any\nauthentication or binding failure answers one neutral `401`.\n\nThe decision runs a fixed gate order: contract → identity/tenant →\nauthority/delegation → containment → risk → entitlement → governance.\nIt is **deny-closed**: an authoritative negative is `deny`; a missing,\nstale, conflicting or unavailable required fact, or a breached\ndeadline, is `not_safely_decided`; only a decision where every gate\npasses on fresh facts is `allow`. An `allow` authorizes one forward\n(`directive: forward_once`); every other outcome carries\n`directive: block`. Adapters treat any non-`200` as \"could not consult\nthe authority\" and deny.\n\nWhen the adapter sends an `execution` snapshot, the decision is bound\nto the digest of the exact request bytes it will forward. Decision\nresponses can carry an RS256 `signature`; signing is a deployment\nsetting and is off by default, so do not assume a response is signed.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1/adapter/enforcement/decide","href":"/api-reference/enforcement/decide-one-protected-action","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["enforcement"],"summary":"Decide one protected action","description":"Called by an enforcement adapter — the V2 middleware's\n`HttpDecideClient`, the Node adapter or sidecar, or the Kong plugin —\nonce per protected action, before the action is forwarded. The adapter\nauthenticates with its own per-adapter bearer (issued at adapter\nregistration). The caller's access token travels separately, inside\nthe body as `presented_authorization`; identity, tenant and scopes are\nderived only from that verified token, never from other body fields.\n\nThe request's surface claims (`surface.canonical_resource_uri`,\nplatform, environment, bundle version and digest) are compared with\nwhat MudraID has registered for the authenticated adapter. Any\nauthentication or binding failure answers one neutral `401`.\n\nThe decision runs a fixed gate order: contract → identity/tenant →\nauthority/delegation → containment → risk → entitlement → governance.\nIt is **deny-closed**: an authoritative negative is `deny`; a missing,\nstale, conflicting or unavailable required fact, or a breached\ndeadline, is `not_safely_decided`; only a decision where every gate\npasses on fresh facts is `allow`. An `allow` authorizes one forward\n(`directive: forward_once`); every other outcome carries\n`directive: block`. Adapters treat any non-`200` as \"could not consult\nthe authority\" and deny.\n\nWhen the adapter sends an `execution` snapshot, the decision is bound\nto the digest of the exact request bytes it will forward. Decision\nresponses can carry an RS256 `signature`; signing is a deployment\nsetting and is off by default, so do not assume a response is signed.\n","security":["1536875c-0045-4ae3-b114-248ecda4597a"],"requestBody":"9748de96-1e20-4759-8aa8-f9bb3ed120ba","responses":{"200":"7da42ff4-0c60-43e2-b0ee-901ffd5e68e3","401":"921777c9-f725-4ee2-8957-ae7cd06a8a98","402":"5396454b-a304-4c24-84e4-525ad2dde19a","409":"e257bc35-eced-4495-af90-36ebb73cda95","422":"3799f6f6-c451-4952-a9ae-4c760bfd1c73","503":"97fb6d9b-249a-4365-997b-e4f03464615f"},"method":"post","type":"path","servers":["0cb9675d-7dfb-4618-b1d0-a6d2d223da37"],"path":"/api/v1/adapter/enforcement/decide","baseUrlOptions":["https://api.mudraid.ai"],"title":"Decide one protected action","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"description":"Strict, bounded envelope; unknown top-level fields are refused with\n`422`. One of `schema_version` or `schema` must name a supported\nrequest contract.\n","properties":{"schema_version":{"type":"string","enum":["mudraid.enforce.decide-request/1","2.0"],"uniqueKey":"schema_version","typeLabel":"enum\u003cstring>"},"schema":{"type":"string","description":"Older spelling of `schema_version`, still read.","uniqueKey":"schema","typeLabel":"string"},"decision_id":{"type":"string","description":"Caller-chosen request identity; one durable decision per id.","uniqueKey":"decision_id","typeLabel":"string"},"requested_at":{"type":"string","format":"date-time","uniqueKey":"requested_at","typeLabel":"string\u003cdate-time>"},"deadline_at":{"type":"string","format":"date-time","description":"Clamped to a server ceiling; the server receive time is the decision clock.","uniqueKey":"deadline_at","typeLabel":"string\u003cdate-time>"},"environment":{"type":"string","uniqueKey":"environment","typeLabel":"string"},"correlation_id":{"type":"string","uniqueKey":"correlation_id","typeLabel":"string"},"presented_authorization":{"type":"string","maxLength":8192,"description":"The protected request's `Authorization` header (`Bearer \u003caccess\ntoken>`). Without it the decision is `deny` (`credential_missing`).\n","uniqueKey":"presented_authorization","typeLabel":"string"},"surface":{"type":"object","additionalProperties":false,"properties":{"platform_id":{"type":"string","uniqueKey":"surface.platform_id","typeLabel":"string"},"environment":{"type":"string","uniqueKey":"surface.environment","typeLabel":"string"},"canonical_resource_uri":{"type":"string","description":"Must equal the resource registered for this adapter.","uniqueKey":"surface.canonical_resource_uri","typeLabel":"string"}},"uniqueKey":"surface","typeLabel":"object"},"request":{"type":"object","additionalProperties":false,"description":"How the protected request arrived (evidence only).","properties":{"transport":{"type":"string","uniqueKey":"request.transport","typeLabel":"string"},"http_method":{"type":"string","uniqueKey":"request.http_method","typeLabel":"string"},"path":{"type":"string","uniqueKey":"request.path","typeLabel":"string"}},"uniqueKey":"request","typeLabel":"object"},"execution":{"type":"object","additionalProperties":false,"required":["profile","body_sha256","content_type"],"description":"The exact bytes the adapter will forward if allowed.","properties":{"profile":{"type":"string","enum":["mudraid.execution.request/1"],"isRequired":true,"uniqueKey":"execution.profile","typeLabel":"enum\u003cstring>"},"body_sha256":{"type":"string","pattern":"^[0-9a-f]{64}$","isRequired":true,"uniqueKey":"execution.body_sha256","typeLabel":"string"},"content_type":{"type":"string","isRequired":true,"uniqueKey":"execution.content_type","typeLabel":"string"},"body_base64":{"type":"string","uniqueKey":"execution.body_base64","typeLabel":"string"}},"uniqueKey":"execution","typeLabel":"object"},"action":{"type":"object","description":"The canonical action resolved from the signed bundle:\n`action_id`, `action_version`, `mapping_id`, `mapping_version`,\n`required_scopes`. (`protected_action` is accepted as an alias.)\n","uniqueKey":"action","typeLabel":"object"},"protected_action":{"type":"object","uniqueKey":"protected_action","typeLabel":"object"},"adapter":{"type":"object","description":"Adapter `type` and `version`.","uniqueKey":"adapter","typeLabel":"object"},"bundle":{"type":"object","description":"Active bundle `version` and lowercase SHA-256 `payload_digest`.","uniqueKey":"bundle","typeLabel":"object"},"evaluation":{"type":"object","description":"Evaluation `mode` (default `live_required`).","uniqueKey":"evaluation","typeLabel":"object"},"evidence":{"type":"object","description":"Evidence fields such as `idempotency_key`.","uniqueKey":"evidence","typeLabel":"object"},"trace":{"type":"object","description":"Trace fields such as `correlation_id`.","uniqueKey":"trace","typeLabel":"object"},"token_context":{"type":"object","description":"Accepted for compatibility; its identity fields are ignored.","uniqueKey":"token_context","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"schema":"\u003cstring>","decision_id":"\u003cstring>","requested_at":"2023-11-07T05:31:56Z","deadline_at":"2023-11-07T05:31:56Z","environment":"\u003cstring>","correlation_id":"\u003cstring>","presented_authorization":"\u003cstring>","surface":{"platform_id":"\u003cstring>","environment":"\u003cstring>","canonical_resource_uri":"\u003cstring>"},"request":{"transport":"\u003cstring>","http_method":"\u003cstring>","path":"\u003cstring>"},"action":{},"protected_action":{},"adapter":{},"bundle":{},"evaluation":{},"evidence":{},"trace":{},"token_context":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"7da42ff4-0c60-43e2-b0ee-901ffd5e68e3":{"description":"Decision produced (which may be `deny` or `not_safely_decided`)","content":{"application/json":{"schema":{"type":"object","required":["schema_version","decision_id","outcome","directive","reason"],"properties":{"schema_version":{"type":"string","enum":["2.0"],"isRequired":true,"uniqueKey":"schema_version","typeLabel":"enum\u003cstring>"},"decision_id":{"type":"string","isRequired":true,"uniqueKey":"decision_id","typeLabel":"string"},"outcome":{"type":"string","enum":["allow","deny","not_safely_decided"],"isRequired":true,"uniqueKey":"outcome","typeLabel":"enum\u003cstring>"},"directive":{"type":"string","enum":["forward_once","block"],"isRequired":true,"uniqueKey":"directive","typeLabel":"enum\u003cstring>"},"reason":{"type":"object","properties":{"primary":{"type":"string","description":"Stable machine reason code.","uniqueKey":"reason.primary","typeLabel":"string"},"contributing":{"type":"array","items":{"type":"string","uniqueKey":"reason.contributing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"reason.contributing","typeLabel":"string[]"},"category":{"oneOf":[{"type":"string","uniqueKey":"reason.category.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"reason.category.oneOf.1","typeLabel":"null"}],"uniqueKey":"reason.category","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"reason","typeLabel":"object"},"decision":{"type":"string","enum":["allow","deny"],"description":"Compatibility projection of `outcome`; `not_safely_decided` projects to `deny`.","uniqueKey":"decision","typeLabel":"enum\u003cstring>"},"evaluation":{"type":"object","description":"Source, versions and per-fact freshness notes behind the decision.","uniqueKey":"evaluation","typeLabel":"object"},"effective_authority":{"type":"object","uniqueKey":"effective_authority","typeLabel":"object"},"evaluated_policies":{"type":"array","items":{"type":"object","properties":{"policy_set_id":{"oneOf":[{"type":"string","uniqueKey":"evaluated_policies.items.[INDEX].policy_set_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"evaluated_policies.items.[INDEX].policy_set_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"evaluated_policies.items.[INDEX].policy_set_id","typeLabel":"string | null"},"policy_set_version":{"oneOf":[{"type":"integer","uniqueKey":"evaluated_policies.items.[INDEX].policy_set_version.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"evaluated_policies.items.[INDEX].policy_set_version.oneOf.1","typeLabel":"null"}],"uniqueKey":"evaluated_policies.items.[INDEX].policy_set_version","typeLabel":"integer | null"},"policy_digest":{"oneOf":[{"type":"string","uniqueKey":"evaluated_policies.items.[INDEX].policy_digest.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"evaluated_policies.items.[INDEX].policy_digest.oneOf.1","typeLabel":"null"}],"uniqueKey":"evaluated_policies.items.[INDEX].policy_digest","typeLabel":"string | null"}},"uniqueKey":"evaluated_policies.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evaluated_policies","typeLabel":"object[]"},"decided_at":{"type":"string","format":"date-time","uniqueKey":"decided_at","typeLabel":"string\u003cdate-time>"},"deadline_at":{"type":"string","format":"date-time","uniqueKey":"deadline_at","typeLabel":"string\u003cdate-time>"},"timings_ms":{"type":"object","uniqueKey":"timings_ms","typeLabel":"object"},"telemetry":{"type":"object","uniqueKey":"telemetry","typeLabel":"object"},"correlation_id":{"oneOf":[{"type":"string","uniqueKey":"correlation_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"correlation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"correlation_id","typeLabel":"string | null"},"action_executed":{"type":"boolean","enum":[false],"description":"Always `false` — an allow authorizes; it does not execute anything.","uniqueKey":"action_executed","typeLabel":"enum\u003cboolean>"},"proof_context":{"type":"object","description":"The authenticated adapter/action/bundle binding, when the action binding was verified.","uniqueKey":"proof_context","typeLabel":"object"},"signature":{"type":"object","description":"RS256 decision signature. Present only when decision signing is enabled.","uniqueKey":"signature","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"schema_version":"2.0","decision_id":"\u003cstring>","outcome":"allow","directive":"forward_once","reason":{"primary":"\u003cstring>","contributing":["\u003cstring>"],"category":"\u003cstring>"},"decision":"allow","evaluation":{},"effective_authority":{},"evaluated_policies":[{"policy_set_id":"\u003cstring>","policy_set_version":123,"policy_digest":"\u003cstring>"}],"decided_at":"2023-11-07T05:31:56Z","deadline_at":"2023-11-07T05:31:56Z","timings_ms":{},"telemetry":{},"correlation_id":"\u003cstring>","action_executed":false,"proof_context":{},"signature":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"921777c9-f725-4ee2-8957-ae7cd06a8a98":{"description":"Adapter authentication or surface binding failed. One neutral body\n— `{\"detail\": {\"error_code\": \"ADAPTER_AUTH_FAILED\", ...}}` — for\nevery cause.\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"5396454b-a304-4c24-84e4-525ad2dde19a":{"description":"Decision allowance exhausted (`DECISION_ALLOWANCE_REFUSED`). Deny.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"e257bc35-eced-4495-af90-36ebb73cda95":{"description":"Decision allowance operation conflict (`DECISION_ALLOWANCE_REFUSED`). Deny.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"3799f6f6-c451-4952-a9ae-4c760bfd1c73":{"description":"Malformed envelope, or no supported request contract\n(`DECIDE_REQUEST_CONTRACT_UNSUPPORTED`, which lists the supported\nvalues).\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"97fb6d9b-249a-4365-997b-e4f03464615f":{"description":"The decision could not be produced safely — signing is enabled and\nthe response could not be signed (`DECISION_SIGNING_UNAVAILABLE`),\nor the decision allowance could not be checked. Deny.\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"1536875c-0045-4ae3-b114-248ecda4597a":{"adapterBearer":{"type":"http","scheme":"bearer","description":"The per-adapter bearer issued when the enforcement adapter is registered.","scopes":[],"schemeName":"adapterBearer"}}},"servers":{"0cb9675d-7dfb-4618-b1d0-a6d2d223da37":{"url":"https://api.mudraid.ai","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"The per-adapter bearer issued when the enforcement adapter is registered.","scopes":[],"schemeName":"adapterBearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"The per-adapter bearer issued when the enforcement adapter is registered.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"adapterBearer","name":"Authorization"}],"title":"adapterBearer"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"decryptogen","siteName":"MudraID","title":"MudraID — a trust layer for AI agents","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-12T08:06:56.375Z","originalFileLocation":"api-reference/enforcement/decide-one-protected-action.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Called by an enforcement adapter — the V2 middleware\u0026#x27;s HttpDecideClient, the Node adapter or sidecar, or the Kong plugin — once per protected action, before the action is forwarded. The adapter authenticates with its own per-adapter bearer (issued at adapter registration). The caller\u0026#x27;s access token travels separately, inside the body as presented_authorization; identity, tenant and scopes are derived only from that verified token, never from other body fields. The request\u0026#x27;s surface claims (surface.canonical_resource_uri, platform, environment, bundle version and digest) are compared with what MudraID has registered for the authenticated adapter. Any authentication or binding failure answers one neutral 401. The decision runs a fixed gate order: contract → identity/tenant → authority/delegation → containment → risk → entitlement → governance. It is deny-closed: an authoritative negative is deny; a missing, stale, conflicting or unavailable required fact, or a breached deadline, is not_safely_decided; only a decision where every gate passes on fresh facts is allow. An allow authorizes one forward (directive: forward_once); every other outcome carries directive: block. Adapters treat any non-200 as \u0026quot;could not consult the authority\u0026quot; and deny. When the adapter sends an execution snapshot, the decision is bound to the digest of the exact request bytes it will forward. Decision responses can carry an RS256 signature; signing is a deployment setting and is off by default, so do not assume a response is signed.\">\u003cmeta data-mint-head name=\"application-name\" content=\"MudraID\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"MudraID — a trust layer for AI agents\">\u003cmeta data-mint-head property=\"og:description\" content=\"Verifiable identity, scoped access, and fast revocation for agent-to-API calls.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"MudraID\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.mudraid.ai/images/og-cover.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"MudraID — a trust layer for AI agents\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Verifiable identity, scoped access, and fast revocation for agent-to-API calls.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.mudraid.ai/images/og-cover.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/decryptogen/p1JSV7b_3S0N2-B9/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"MudraID\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4F46E5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/enforcement/decide-one-protected-action.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.mudraid.ai/#organization\",\"name\":\"MudraID\",\"url\":\"https://docs.mudraid.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/decryptogen/z-Oj43wlHE8zplz5/logo/light.png?fit=max\u0026auto=format\u0026n=z-Oj43wlHE8zplz5\u0026q=85\u0026s=0c6c21890a4cafe2c104b7662de241dd\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.mudraid.ai#website\",\"name\":\"MudraID\",\"url\":\"https://docs.mudraid.ai\",\"publisher\":{\"@id\":\"https://docs.mudraid.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action#webpage\",\"url\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action\",\"name\":\"Decide one protected action\",\"description\":\"Called by an enforcement adapter — the V2 middleware's HttpDecideClient, the Node adapter or sidecar, or the Kong plugin — once per protected action, before the action is forwarded. The adapter authenticates with its own per-adapter bearer (issued at adapter registration). The caller's access token travels separately, inside the body as presented_authorization; identity, tenant and scopes are derived only from that verified token, never from other body fields. The request's surface claims (surface.canonical_resource_uri, platform, environment, bundle version and digest) are compared with what MudraID has registered for the authenticated adapter. Any authentication or binding failure answers one neutral 401. The decision runs a fixed gate order: contract → identity/tenant → authority/delegation → containment → risk → entitlement → governance. It is deny-closed: an authoritative negative is deny; a missing, stale, conflicting or unavailable required fact, or a breached deadline, is not_safely_decided; only a decision where every gate passes on fresh facts is allow. An allow authorizes one forward (directive: forward_once); every other outcome carries directive: block. Adapters treat any non-200 as \\\"could not consult the authority\\\" and deny. When the adapter sends an execution snapshot, the decision is bound to the digest of the exact request bytes it will forward. Decision responses can carry an RS256 signature; signing is a deployment setting and is off by default, so do not assume a response is signed.\",\"dateModified\":\"2026-10-12T08:06:56.375Z\",\"isPartOf\":{\"@id\":\"https://docs.mudraid.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Public Contracts\",\"item\":\"https://docs.mudraid.ai/api-reference/oauth/exchange-machine-client-credentials-for-an-access-token\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Decide one protected action\",\"item\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action#apireference\",\"headline\":\"Decide one protected action\",\"name\":\"Decide one protected action\",\"description\":\"Called by an enforcement adapter — the V2 middleware's HttpDecideClient, the Node adapter or sidecar, or the Kong plugin — once per protected action, before the action is forwarded. The adapter authenticates with its own per-adapter bearer (issued at adapter registration). The caller's access token travels separately, inside the body as presented_authorization; identity, tenant and scopes are derived only from that verified token, never from other body fields. The request's surface claims (surface.canonical_resource_uri, platform, environment, bundle version and digest) are compared with what MudraID has registered for the authenticated adapter. Any authentication or binding failure answers one neutral 401. The decision runs a fixed gate order: contract → identity/tenant → authority/delegation → containment → risk → entitlement → governance. It is deny-closed: an authoritative negative is deny; a missing, stale, conflicting or unavailable required fact, or a breached deadline, is not_safely_decided; only a decision where every gate passes on fresh facts is allow. An allow authorizes one forward (directive: forward_once); every other outcome carries directive: block. Adapters treat any non-200 as \\\"could not consult the authority\\\" and deny. When the adapter sends an execution snapshot, the decision is bound to the digest of the exact request bytes it will forward. Decision responses can carry an RS256 signature; signing is a deployment setting and is off by default, so do not assume a response is signed.\",\"url\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action\",\"mainEntityOfPage\":{\"@id\":\"https://docs.mudraid.ai/api-reference/enforcement/decide-one-protected-action#webpage\"},\"image\":\"https://docs.mudraid.ai/images/og-cover.png\",\"dateModified\":\"2026-10-12T08:06:56.375Z\",\"publisher\":{\"@id\":\"https://docs.mudraid.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.mudraid.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"MudraID\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"MudraID\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/enforcement/decide-one-protected-action.md","siteName":"MudraID","nav":{"global":null,"tabs":[{"tab":"For decision-makers","pages":[{"title":"For decision-makers","href":"/overview/introduction"}]},{"tab":"For developers","pages":[{"title":"For developers","href":"/guides/get-started/what-is-mudraid"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"API reference","href":"/api-reference/introduction"},{"title":"Versioning and deprecation","href":"/api-reference/versioning"}]},{"group":"Public Contracts","pages":[{"group":"oauth","pages":[{"title":"Exchange machine-client credentials for an access token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /oauth2/token","href":"/api-reference/oauth/exchange-machine-client-credentials-for-an-access-token"},{"title":"Revoke a token (RFC 7009)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /oauth2/revoke","href":"/api-reference/oauth/revoke-a-token-rfc-7009"},{"title":"OAuth 2.0 Authorization Server Metadata (RFC 8414)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /.well-known/oauth-authorization-server","href":"/api-reference/oauth/oauth-20-authorization-server-metadata-rfc-8414"}]},{"group":"resource-server","pages":[{"title":"JSON Web Key Set for access-token verification","deprecated":null,"version":null,"openapi":"/openapi.yaml get /.well-known/jwks.json","href":"/api-reference/resource-server/json-web-key-set-for-access-token-verification"},{"title":"Download the platform's scope file","description":"The platform's `mudraid_scopes.yaml`: its active scope catalogue and\nits route → scope mappings, in the order the middleware must match\nthem. The FastAPI middleware reads it at startup to build its\nroute → required-scope map. The portal download emits the same bytes.\n\nAuthenticated with the platform's own API key (`X-Api-Key` plus\n`X-Api-Secret`, holding the `platform:verify` scope). A key for one\nplatform cannot read another platform's file.\n\nReturned as `text/plain`; structure documented in the\n`MudraidScopesYaml` component.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1/platforms/{platform_id}/scopes.yaml","href":"/api-reference/resource-server/download-the-platforms-scope-file"}]},{"group":"enforcement","pages":[{"title":"Decide one protected action","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1/adapter/enforcement/decide","href":"/api-reference/enforcement/decide-one-protected-action"}]}]}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/resources/glossary"}]}]},"basePath":"","title":"MudraID — a trust layer for AI agents","buildId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","deploymentId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DDP9JXtj.js","utils-8yQyvEtx.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CBCFR8Sn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-rQaXkUHa.js","snippetPresets-J5KpBTgV.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BVxVH4Cj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BxdQ2vIi.js","shallow-BjV2tFiD.js","getApiPlaygroundDisplay-C_55tL4O.js","CodeSnippet-C0JpiCOC.js","CodeSnippets-w9Ps7djG.js","Page-DTNSD-0M.js","getPastedJson-BDfB-H8d.js","icon-g-kUkkO9.js","MethodPill-v4l6fq0h.js","DuplicateIcon-CvLo-CfU.js","createIcon-165clrrV.js","DynamicMarkdown-D3RQ-fEj.js","SectionHeading-vvo-3yLf.js","axios-vUo_bRtp.js","Markdown-CMT1uFWQ.js","clsx-C8f2yC9R.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CI2D8R2Y.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-k78Wrw_e.js"]}