How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).runtime_checkable so a test can assert the shipped providers still answer to this
shape; it checks method names only, which is why the static check matters more.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ctrlrun","description":"ctrlrun stops AI agents from taking wrong, restricted, or malicious actions in your workflows. Every action is checked against your rules before it runs.","colors":{"primary":"#B8730A","light":"#F5A623","dark":"#8A5606"},"logo":{"light":"https://mintcdn.com/ctrlrun/G4gqBSrW1nJ39yWh/images/wordmark-light.svg?fit=max\u0026auto=format\u0026n=G4gqBSrW1nJ39yWh\u0026q=85\u0026s=fe77d65a2e65a833f12cc8498b57a2d9","dark":"https://mintcdn.com/ctrlrun/G4gqBSrW1nJ39yWh/images/wordmark-dark.svg?fit=max\u0026auto=format\u0026n=G4gqBSrW1nJ39yWh\u0026q=85\u0026s=de15bdea0fd1c281bf3aabcfb929e1fa","href":"/"},"favicon":"https://mintcdn.com/ctrlrun/_IlANZ8DdwjaNLZr/images/favicon.svg?fit=max\u0026auto=format\u0026n=_IlANZ8DdwjaNLZr\u0026q=85\u0026s=8289b72488f220fa075c4a2b67a80846","navbar":{"links":[{"href":"/#how-it-works","label":"How it works"},{"href":"https://github.com/CTRLRun/ctrlrun","label":"GitHub"}],"primary":{"type":"button","label":"Protect your first action","href":"/docs/get-started/quickstart"}},"footer":{"socials":{"github":"https://github.com/CTRLRun/ctrlrun"}},"seo":{"metatags":{"og:site_name":"ctrlrun","og:image":"https://ctrlrun.dev/images/social-preview.png","twitter:card":"summary_large_image","twitter:image":"https://ctrlrun.dev/images/social-preview.png"},"indexing":"navigable"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ctrlrun","hasAudioNarration":false,"actualSubdomain":"ctrlrun","customDomains":["ctrlrun.dev"],"gitSource":{"type":"github","owner":"ctrlrun","repo":"ctrlrun-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ac916bb66c73de8b9da8f36","collectionId":"6fef60b3-b050-435e-b709-519d265b52b2","liveDeploymentHistoryId":"6ac916bb66c73de8b9da8f36","schemaVersion":"v3"},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac916bb66c73de8b9da8f36","clientVersion":"0.0.3933","searchFilterCounts":[{"language":"default","tag":"Reference","count":89},{"language":"default","tag":"Python API","count":83},{"language":"default","tag":"Documentation","count":79},{"language":"default","tag":"Cookbook","count":22},{"language":"default","tag":"Architecture","count":15},{"language":"default","tag":"Guides","count":13},{"language":"default","tag":"Production","count":11},{"language":"default","tag":"Concepts","count":10},{"language":"default","tag":"Compare","count":6},{"language":"default","tag":"CLI and configuration","count":6}],"searchSettings":{"showContentSnippets":true,"isFiltersEnabled":false}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"contact@arpanghoshal.com"}},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","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":"editor-v7-file-tree","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":"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":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"vite-origin","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":"byok-sep-25","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":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","href":"/_mintlify/custom/ctrlrun/3fcdc328d9027c71/style.css"}],"page":{"pagePath":"docs/reference/api/ApprovalProvider","slug":"/docs/reference/api/ApprovalProvider","pageMetadata":{"title":"ApprovalProvider","description":"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).","href":"/docs/reference/api/ApprovalProvider"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`ctrlrun.ApprovalProvider`}),` — class, defined at `,_jsx(_components.code,{children:`src/ctrlrun/approval.py:673`})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ctrlrun `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ApprovalProvider`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` ApprovalProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Protocol`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` def`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` request`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`action`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Action`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ttl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`timedelta`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:`ApprovalRequest`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` def`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` wait`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`request_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`timedelta`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:`Approval`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` | `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`None`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`runtime_checkable`}),` so a test can assert the shipped providers still answer to this\nshape; it checks method names only, which is why the static check matters more.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/reference/api/index`,children:`Python API index`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/get-started/quickstart`,children:`Get started`}),` · `,_jsx(_components.a,{href:`/docs/why`,children:`Why`}),`.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"ApprovalProvider","description":"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).","href":"/docs/reference/api/ApprovalProvider"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/ctrlrun/09a39e5a58d41abc/website-events.js"],"subdomain":"ctrlrun","siteName":"ctrlrun","title":"ApprovalProvider - ctrlrun","contextualStarterQuestions":[{"_id":"6aa7297fa396096d615ad121","deploymentId":"6a9bdaa528aa652af7427164","questionText":"How do I handle approval timeouts?","status":"active","generatedBy":"contextual","path":"docs/reference/api/ApprovalProvider","createdAt":"2026-09-13T22:53:51.599Z","updatedAt":"2026-09-13T22:53:51.599Z","__v":0},{"_id":"6aa7297fa396096d615ad120","deploymentId":"6a9bdaa528aa652af7427164","questionText":"What does the request method do?","status":"active","generatedBy":"contextual","path":"docs/reference/api/ApprovalProvider","createdAt":"2026-09-13T22:53:51.599Z","updatedAt":"2026-09-13T22:53:51.599Z","__v":0},{"_id":"6aa7297fa396096d615ad11f","deploymentId":"6a9bdaa528aa652af7427164","questionText":"How do I implement ApprovalProvider?","status":"active","generatedBy":"contextual","path":"docs/reference/api/ApprovalProvider","createdAt":"2026-09-13T22:53:51.599Z","updatedAt":"2026-09-13T22:53:51.599Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-13T22:53:31.984Z","originalFileLocation":"docs/reference/api/ApprovalProvider.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=\"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).\">\u003cmeta data-mint-head name=\"application-name\" content=\"ctrlrun\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_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/ctrlrun/WNi-x0WF22tCSdeL/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"ApprovalProvider - ctrlrun\">\u003cmeta data-mint-head property=\"og:description\" content=\"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ctrlrun\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ctrlrun.dev/images/social-preview.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=\"ApprovalProvider - ctrlrun\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ctrlrun.dev/images/social-preview.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/ctrlrun/WNi-x0WF22tCSdeL/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ctrlrun\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#B8730A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/reference/api/ApprovalProvider.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://ctrlrun.dev/#organization\",\"name\":\"ctrlrun\",\"url\":\"https://ctrlrun.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ctrlrun/G4gqBSrW1nJ39yWh/images/wordmark-light.svg?fit=max\u0026auto=format\u0026n=G4gqBSrW1nJ39yWh\u0026q=85\u0026s=fe77d65a2e65a833f12cc8498b57a2d9\"}},{\"@type\":\"WebSite\",\"@id\":\"https://ctrlrun.dev#website\",\"name\":\"ctrlrun\",\"url\":\"https://ctrlrun.dev\",\"publisher\":{\"@id\":\"https://ctrlrun.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider#webpage\",\"url\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider\",\"name\":\"ApprovalProvider\",\"description\":\"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).\",\"dateModified\":\"2026-09-13T22:53:31.984Z\",\"isPartOf\":{\"@id\":\"https://ctrlrun.dev#website\"},\"breadcrumb\":{\"@id\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Python API\",\"item\":\"https://ctrlrun.dev/docs/reference/api/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ApprovalProvider\",\"item\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider#article\",\"headline\":\"ApprovalProvider\",\"name\":\"ApprovalProvider\",\"description\":\"How a human is asked, and how the answer comes back (SPEC-v0.1 §4.3).\",\"url\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider\",\"mainEntityOfPage\":{\"@id\":\"https://ctrlrun.dev/docs/reference/api/ApprovalProvider#webpage\"},\"image\":\"https://ctrlrun.dev/images/social-preview.png\",\"dateModified\":\"2026-09-13T22:53:31.984Z\",\"publisher\":{\"@id\":\"https://ctrlrun.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://ctrlrun.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ctrlrun\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ctrlrun","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"Reference","groups":[{"group":"CLI and configuration","pages":[{"title":"CLI reference","href":"/docs/reference/cli"},{"title":"Exit codes","href":"/docs/reference/exit-codes"},{"title":"Policy YAML reference","href":"/docs/reference/policy-yaml"},{"title":"Authority YAML reference","href":"/docs/reference/authority-yaml"},{"title":"Receipt and event schemas","href":"/docs/reference/receipt-and-event-schemas"},{"title":"Errors","href":"/docs/reference/errors"}]},{"group":"Python API","expanded":false,"pages":[{"title":"Python API","href":"/docs/reference/api/index"},{"title":"Action","href":"/docs/reference/api/Action"},{"title":"ActionDenied","href":"/docs/reference/api/ActionDenied"},{"title":"AmbiguousEffect","href":"/docs/reference/api/AmbiguousEffect"},{"title":"Approval","href":"/docs/reference/api/Approval"},{"title":"ApprovalAnswer","href":"/docs/reference/api/ApprovalAnswer"},{"title":"ApprovalMismatch","description":"The presented approval does not authorize this action (SPEC-v0.1 §4.2).","href":"/docs/reference/api/ApprovalMismatch"},{"title":"ApprovalProvider","href":"/docs/reference/api/ApprovalProvider"},{"title":"ApprovalRequest","description":"A pending question for a human: may this exact action run? (SPEC-v0.1 §4.1)","href":"/docs/reference/api/ApprovalRequest"},{"title":"ApprovalRequired","href":"/docs/reference/api/ApprovalRequired"},{"title":"ApprovalTimeout","href":"/docs/reference/api/ApprovalTimeout"},{"title":"ApproverIdentity","href":"/docs/reference/api/ApproverIdentity"},{"title":"Authority","href":"/docs/reference/api/Authority"},{"title":"AuthorityDenied","href":"/docs/reference/api/AuthorityDenied"},{"title":"AuthorityEscalation","href":"/docs/reference/api/AuthorityEscalation"},{"title":"AuthorityResult","href":"/docs/reference/api/AuthorityResult"},{"title":"CTRLRunError","href":"/docs/reference/api/CTRLRunError"},{"title":"Condition","href":"/docs/reference/api/Condition"},{"title":"Control","href":"/docs/reference/api/Control"},{"title":"Decision","href":"/docs/reference/api/Decision"},{"title":"Delegation","href":"/docs/reference/api/Delegation"},{"title":"DelegationRecord","href":"/docs/reference/api/DelegationRecord"},{"title":"DuplicateEffect","href":"/docs/reference/api/DuplicateEffect"},{"title":"EffectKeyError","href":"/docs/reference/api/EffectKeyError"},{"title":"EffectRecord","href":"/docs/reference/api/EffectRecord"},{"title":"EffectState","href":"/docs/reference/api/EffectState"},{"title":"Event","href":"/docs/reference/api/Event"},{"title":"EventSink","href":"/docs/reference/api/EventSink"},{"title":"FrameworkInterrupt","href":"/docs/reference/api/FrameworkInterrupt"},{"title":"Grant","href":"/docs/reference/api/Grant"},{"title":"HeaderIdentityProvider","href":"/docs/reference/api/HeaderIdentityProvider"},{"title":"IdentityContext","href":"/docs/reference/api/IdentityContext"},{"title":"IdentityError","href":"/docs/reference/api/IdentityError"},{"title":"IdentityProvider","href":"/docs/reference/api/IdentityProvider"},{"title":"InMemoryStateStore","href":"/docs/reference/api/InMemoryStateStore"},{"title":"InterruptApprovalProvider","href":"/docs/reference/api/InterruptApprovalProvider"},{"title":"InvalidArgument","href":"/docs/reference/api/InvalidArgument"},{"title":"JSONLEventSink","href":"/docs/reference/api/JSONLEventSink"},{"title":"LocalApprovalProvider","href":"/docs/reference/api/LocalApprovalProvider"},{"title":"MissingDependency","href":"/docs/reference/api/MissingDependency"},{"title":"NotExecuted","href":"/docs/reference/api/NotExecuted"},{"title":"PendingApproval","href":"/docs/reference/api/PendingApproval"},{"title":"Policy","href":"/docs/reference/api/Policy"},{"title":"PolicyError","href":"/docs/reference/api/PolicyError"},{"title":"Principal","href":"/docs/reference/api/Principal"},{"title":"Receipt","href":"/docs/reference/api/Receipt"},{"title":"ReconcileOutcome","href":"/docs/reference/api/ReconcileOutcome"},{"title":"SQLiteStateStore","href":"/docs/reference/api/SQLiteStateStore"},{"title":"SchemaMismatch","href":"/docs/reference/api/SchemaMismatch"},{"title":"ScriptedApprovalProvider","href":"/docs/reference/api/ScriptedApprovalProvider"},{"title":"StateStore","href":"/docs/reference/api/StateStore"},{"title":"StaticIdentityProvider","href":"/docs/reference/api/StaticIdentityProvider"},{"title":"Subject","href":"/docs/reference/api/Subject"},{"title":"Suspended","href":"/docs/reference/api/Suspended"},{"title":"VerifiedApprover","href":"/docs/reference/api/VerifiedApprover"},{"title":"WebhookApprovalProvider","href":"/docs/reference/api/WebhookApprovalProvider"},{"title":"AcsControlHook","href":"/docs/reference/api/acs-AcsControlHook"},{"title":"action_hash","href":"/docs/reference/api/action_hash"},{"title":"Budget","href":"/docs/reference/api/authority-Budget"},{"title":"banner","href":"/docs/reference/api/banner"},{"title":"canonical_bytes","href":"/docs/reference/api/canonical_bytes"},{"title":"canonicalize","href":"/docs/reference/api/canonicalize"},{"title":"run","href":"/docs/reference/api/conformance-run"},{"title":"run","href":"/docs/reference/api/conformance-store-run"},{"title":"context","href":"/docs/reference/api/context"},{"title":"serve","href":"/docs/reference/api/gateway-serve"},{"title":"idempotency_token","href":"/docs/reference/api/idempotency_token"},{"title":"JWTIdentityProvider","href":"/docs/reference/api/jwt_identity-JWTIdentityProvider"},{"title":"needs_approval","href":"/docs/reference/api/needs_approval"},{"title":"OTelEventSink","href":"/docs/reference/api/otel-OTelEventSink"},{"title":"parse_conditions","href":"/docs/reference/api/parse_conditions"},{"title":"PostgresStateStore","href":"/docs/reference/api/postgres-PostgresStateStore"},{"title":"protect","href":"/docs/reference/api/protect"},{"title":"Charge","href":"/docs/reference/api/state-Charge"},{"title":"Consumption","href":"/docs/reference/api/state-Consumption"},{"title":"check_charges","href":"/docs/reference/api/state-check_charges"},{"title":"HTTPConnection","href":"/docs/reference/api/transport-HTTPConnection"},{"title":"HTTPSConnection","href":"/docs/reference/api/transport-HTTPSConnection"},{"title":"Transport","href":"/docs/reference/api/transport-Transport"},{"title":"effect_state","href":"/docs/reference/api/transport-effect_state"},{"title":"urlopen","href":"/docs/reference/api/transport-urlopen"},{"title":"run","href":"/docs/reference/api/verify-run"},{"title":"with_approval","href":"/docs/reference/api/with_approval"}]}]},{"tab":"Architecture","pages":[{"title":"Architecture","href":"/docs/ARCHITECTURE"}]}]},"title":"ApprovalProvider - ctrlrun","buildId":"dpl_GnxaU9nEer7XK27kw3dpfPrs9geh","deploymentId":"dpl_GnxaU9nEer7XK27kw3dpfPrs9geh","dynamics":[],"chunks":[]}