Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (anthropic_key_refused, 422) or when the check cannot reach Anthropic (anthropic_key_check_unavailable, 502). Answers with the key’s last four characters, never the key. Answers 404 unless the managed-runners flag is on for the organization.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OuterLayer","description":"An open-source software factory: issue in, reviewed and verified code out, on your agents, in your repos.","colors":{"primary":"#2065D1","light":"#4C8DEE","dark":"#1A55B8"},"logo":{"light":"https://mintcdn.com/outerlayer-stg/h46SL2WH_1X-gmFL/logo/light.svg?fit=max\u0026auto=format\u0026n=h46SL2WH_1X-gmFL\u0026q=85\u0026s=de563af4ba1bc24d13a1c4a7485a2182","dark":"https://mintcdn.com/outerlayer-stg/h46SL2WH_1X-gmFL/logo/dark.svg?fit=max\u0026auto=format\u0026n=h46SL2WH_1X-gmFL\u0026q=85\u0026s=13e7346de4086ea4a5f7e83a85e7a072"},"favicon":"https://mintcdn.com/outerlayer-stg/h46SL2WH_1X-gmFL/favicon.svg?fit=max\u0026auto=format\u0026n=h46SL2WH_1X-gmFL\u0026q=85\u0026s=adddaf2c470259ec7193c6bd26a95252","appearance":{"default":"system"},"background":{"color":{"light":"#FAFAF9","dark":"#131312"}},"navbar":{"links":[{"href":"/changelog","label":"Changelog"},{"href":"https://github.com/outerlayerai/outerlayer","label":"GitHub"}],"primary":{"type":"button","label":"Open the app","href":"https://app.outerlayer.ai"}},"footer":{"socials":{"github":"https://github.com/outerlayerai/outerlayer","website":"https://www.outerlayer.ai"}},"fonts":{"family":"Geist"},"styling":{"codeblocks":"system","latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"outerlayer-stg","hasAudioNarration":false,"actualSubdomain":"outerlayer-stg","customDomains":["docs-stg.outerlayer.ai"],"gitSource":{"type":"github","owner":"outerlayerai","repo":"outerlayer","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6add376d9a241c7512afbade","collectionId":"6e5cb751-7632-4a00-aded-15562ec834f1","liveDeploymentHistoryId":"6add376d9a241c7512afbade","schemaVersion":"v3"},"entitlements":{},"buildId":"6ade054e8a5fe482ccff6753","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"API reference","count":98},{"language":"default","tag":"Endpoints","count":96},{"language":"default","tag":"Documentation","count":42},{"language":"default","tag":"Work Items","count":26},{"language":"default","tag":"CLI reference","count":13},{"language":"default","tag":"Apps","count":13},{"language":"default","tag":"Run builds","count":12},{"language":"default","tag":"Commands","count":9},{"language":"default","tag":"Org Management","count":9},{"language":"default","tag":"Work on an item","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"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":"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":"vite-origin","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":true},"customCss":[{"filePath":"custom.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx3cwhsk.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxTcwhsk.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxPcwhsk.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx_cwhsk.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx3cwhsk.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxTcwhsk.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxPcwhsk.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx_cwhsk.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx3cwhsk.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxTcwhsk.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxPcwhsk.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx_cwhsk.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n.font-mono,code,kbd,pre,samp{font-family:\"JetBrains Mono\",ui-monospace,SFMono-Regular,Menlo,monospace}.status-icon{display:inline-block;width:1.05em;height:1.05em;margin-right:.35em;vertical-align:-.17em;color:#61656f}.status-icon-not_picked_up,.status-icon-with_agent{color:#b26a00}.status-icon-ready_for_review{color:#2e7d32}.status-icon-approved{color:#4f55c9}.status-icon-needs_attention{color:#c62828}.status-icon-dot{fill:#c2410c}.dark .status-icon{color:#9a9eab}.dark .status-icon-not_picked_up,.dark .status-icon-with_agent{color:#f0a742}.dark .status-icon-ready_for_review{color:#6cc070}.dark .status-icon-approved{color:#959bf2}.dark .status-icon-needs_attention{color:#f2827a}.dark .status-icon-dot{fill:#f08a4b}"}],"page":{"pagePath":"api-reference/apps/store-or-replace-the-factorys-anthropic-api-key","slug":"/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key","pageMetadata":{"title":"Store or replace the factory's Anthropic API key","description":"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (`anthropic_key_refused`, 422) or when the check cannot reach Anthropic (`anthropic_key_check_unavailable`, 502). Answers with the key's last four characters, never the key. Answers 404 unless the `managed-runners` flag is on for the organization.","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/apps/{appId}/anthropic-key","href":"/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (\", _jsx(_components.code, {\n children: \"anthropic_key_refused\"\n }), \", 422) or when the check cannot reach Anthropic (\", _jsx(_components.code, {\n children: \"anthropic_key_check_unavailable\"\n }), \", 502). Answers with the key’s last four characters, never the key. Answers 404 unless the \", _jsx(_components.code, {\n children: \"managed-runners\"\n }), \" flag is on for the organization.\"]\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":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Store or replace the factory's Anthropic API key","description":"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (`anthropic_key_refused`, 422) or when the check cannot reach Anthropic (`anthropic_key_check_unavailable`, 502). Answers with the key's last four characters, never the key. Answers 404 unless the `managed-runners` flag is on for the organization.","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/apps/{appId}/anthropic-key","href":"/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (`anthropic_key_refused`, 422) or when the check cannot reach Anthropic (`anthropic_key_check_unavailable`, 502). Answers with the key's last four characters, never the key. Answers 404 unless the `managed-runners` flag is on for the organization.","operationId":"put-app-anthropic-key","parameters":["56983fbe-6756-42bd-87e8-affebe9ac024"],"requestBody":"e59dd9db-87a3-40bb-b89b-541796303993","responses":{"200":"6d836bcc-5c50-4289-840c-c9b391910347","400":"76d0963f-7d7a-48b5-9438-9567ffa71f2b","401":"2d8a8def-e3a4-4954-ac03-abddd45118d7","403":"cb71290f-bf8e-430e-97c0-556a99eefe68","404":"4a4cfbe9-5b67-434c-b20e-ef337288c0e7","422":"61b3c63c-d4a9-48ea-8cf5-265ebde47006","502":"6e9381d7-7bb1-4565-aac5-8b32becb583b"},"summary":"Store or replace the factory's Anthropic API key","tags":["Apps"],"method":"put","type":"path","servers":["6f0585a4-43d2-41f7-8fb4-befc27374363","e8980223-9617-4f01-997e-4e9dd56765a5"],"security":["62499abb-e75d-4c78-a547-4eb4e95e6d2e"],"path":"/v1/apps/{appId}/anthropic-key","baseUrlOptions":["https://api.outerlayer.ai","http://localhost:9418"],"title":"Store or replace the factory's Anthropic API key","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"56983fbe-6756-42bd-87e8-affebe9ac024":{"in":"path","name":"appId","required":true,"schema":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"requestBody":{"content":{"application/json":{"schema":{"properties":{"key":{"description":"The Anthropic API key. The gateway checks it with Anthropic, stores it in Vault, and never returns it.","maxLength":1000,"minLength":8,"pattern":"^[\\x21-\\x7e]+$","type":"string","isRequired":true,"uniqueKey":"key","typeLabel":"string"}},"required":["key"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"key":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"6d836bcc-5c50-4289-840c-c9b391910347":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"lastFour":{"oneOf":[{"description":"The last four characters of the stored key. The key itself is never returned.","type":"string","isRequired":true,"uniqueKey":"data.lastFour.oneOf.0","typeLabel":"string"},{"description":"The last four characters of the stored key. The key itself is never returned.","type":"null","isRequired":true,"uniqueKey":"data.lastFour.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.lastFour","typeLabel":"string | null"},"set":{"description":"Whether the factory has stored a key.","type":"boolean","isRequired":true,"uniqueKey":"data.set","typeLabel":"boolean"},"setAt":{"oneOf":[{"description":"When the key was stored.","type":"string","isRequired":true,"uniqueKey":"data.setAt.oneOf.0","typeLabel":"string"},{"description":"When the key was stored.","type":"null","isRequired":true,"uniqueKey":"data.setAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.setAt","typeLabel":"string | null"},"setBy":{"oneOf":[{"description":"Who stored the key: a member's email or an API key's name.","type":"string","isRequired":true,"uniqueKey":"data.setBy.oneOf.0","typeLabel":"string"},{"description":"Who stored the key: a member's email or an API key's name.","type":"null","isRequired":true,"uniqueKey":"data.setBy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.setBy","typeLabel":"string | null"}},"required":["set","lastFour","setBy","setAt"],"type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["data"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"lastFour":"\u003cstring>","set":true,"setAt":"\u003cstring>","setBy":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"The key was checked and stored.","exampleType":"generated"},"76d0963f-7d7a-48b5-9438-9567ffa71f2b":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"The body is not `{ \"key\": \"\u003ctoken>\" }`.","exampleType":"generated"},"2d8a8def-e3a4-4954-ac03-abddd45118d7":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"Missing or invalid API key.","exampleType":"generated"},"cb71290f-bf8e-430e-97c0-556a99eefe68":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"Caller lacks 'factory.update' permission.","exampleType":"generated"},"4a4cfbe9-5b67-434c-b20e-ef337288c0e7":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"No such factory, or managed builds are not turned on for the organization.","exampleType":"generated"},"61b3c63c-d4a9-48ea-8cf5-265ebde47006":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"Anthropic refused the key (`anthropic_key_refused`). Nothing was stored.","exampleType":"generated"},"6e9381d7-7bb1-4565-aac5-8b32becb583b":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"The check could not reach Anthropic (`anthropic_key_check_unavailable`). Nothing was stored.","exampleType":"generated"}},"security":{"62499abb-e75d-4c78-a547-4eb4e95e6d2e":{"AppId":{"description":"Factory id the request is scoped to.","in":"header","name":"X-Outerlayer-App-Id","type":"apiKey","scopes":[],"schemeName":"AppId"},"BearerAuth":{"description":"API key (sk_outerlayer_*)","scheme":"bearer","type":"http","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"6f0585a4-43d2-41f7-8fb4-befc27374363":{"description":"Production (OuterLayer Cloud)","url":"https://api.outerlayer.ai"},"e8980223-9617-4f01-997e-4e9dd56765a5":{"description":"Local dev server (self-hosted gateway)","url":"http://localhost:9418"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"description":"Factory id the request is scoped to.","in":"header","name":"X-Outerlayer-App-Id","type":"apiKey","scopes":[],"schemeName":"AppId"},"schema":{"title":"X-Outerlayer-App-Id","type":"string","description":"Factory id the request is scoped to.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"AppId","name":"X-Outerlayer-App-Id"},{"scheme":{"description":"API key (sk_outerlayer_*)","scheme":"bearer","type":"http","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key (sk_outerlayer_*)","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"AppId \u0026 BearerAuth"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"outerlayer-stg","siteName":"OuterLayer","title":"Store or replace the factory's Anthropic API key - OuterLayer","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-25T13:34:17.404Z","originalFileLocation":"api-reference/apps/store-or-replace-the-factorys-anthropic-api-key.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=\"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (anthropic_key_refused, 422) or when the check cannot reach Anthropic (anthropic_key_check_unavailable, 502). Answers with the key\u0026#x27;s last four characters, never the key. Answers 404 unless the managed-runners flag is on for the organization.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OuterLayer\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_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/outerlayer-stg/FkFLtaVKBgCUe_rr/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Store or replace the factory\u0026#x27;s Anthropic API key - OuterLayer\">\u003cmeta data-mint-head property=\"og:description\" content=\"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (anthropic_key_refused, 422) or when the check cannot reach Anthropic (anthropic_key_check_unavailable, 502). Answers with the key\u0026#x27;s last four characters, never the key. Answers 404 unless the managed-runners flag is on for the organization.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OuterLayer\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://outerlayer-stg.mintlify.app/_mintlify/api/og/v2?division=Apps\u0026amp;title=Store+or+replace+the+factory%27s+Anthropic+API+key\u0026amp;description=Checks+the+key+with+one+call+to+Anthropic%2C+then+stores+it+in+Supabase+Vault+in+place+of+any+key+the+factory+has+stored%2C+and+deletes+the+old+secret.+Nothing+is+s\u0026amp;theme=e9829cd6b2b3caa26c4296ba\u0026amp;signature=ae2b997f3a952d21519e82d4a58962f6d5c18abb85d485c487c3d7e484dd611c\">\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=\"Store or replace the factory\u0026#x27;s Anthropic API key - OuterLayer\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (anthropic_key_refused, 422) or when the check cannot reach Anthropic (anthropic_key_check_unavailable, 502). Answers with the key\u0026#x27;s last four characters, never the key. Answers 404 unless the managed-runners flag is on for the organization.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://outerlayer-stg.mintlify.app/_mintlify/api/og/v2?division=Apps\u0026amp;title=Store+or+replace+the+factory%27s+Anthropic+API+key\u0026amp;description=Checks+the+key+with+one+call+to+Anthropic%2C+then+stores+it+in+Supabase+Vault+in+place+of+any+key+the+factory+has+stored%2C+and+deletes+the+old+secret.+Nothing+is+s\u0026amp;theme=e9829cd6b2b3caa26c4296ba\u0026amp;signature=ae2b997f3a952d21519e82d4a58962f6d5c18abb85d485c487c3d7e484dd611c\">\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/outerlayer-stg/FkFLtaVKBgCUe_rr/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OuterLayer\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2065D1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs-stg.outerlayer.ai/#organization\",\"name\":\"OuterLayer\",\"url\":\"https://docs-stg.outerlayer.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/outerlayer-stg/h46SL2WH_1X-gmFL/logo/light.svg?fit=max\u0026auto=format\u0026n=h46SL2WH_1X-gmFL\u0026q=85\u0026s=de563af4ba1bc24d13a1c4a7485a2182\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs-stg.outerlayer.ai#website\",\"name\":\"OuterLayer\",\"url\":\"https://docs-stg.outerlayer.ai\",\"publisher\":{\"@id\":\"https://docs-stg.outerlayer.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key#webpage\",\"url\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key\",\"name\":\"Store or replace the factory's Anthropic API key\",\"description\":\"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (anthropic_key_refused, 422) or when the check cannot reach Anthropic (anthropic_key_check_unavailable, 502). Answers with the key's last four characters, never the key. Answers 404 unless the managed-runners flag is on for the organization.\",\"dateModified\":\"2026-10-25T13:34:17.404Z\",\"isPartOf\":{\"@id\":\"https://docs-stg.outerlayer.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs-stg.outerlayer.ai/api-reference/oauth/oauth-protected-resource-metadata\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apps\",\"item\":\"https://docs-stg.outerlayer.ai/api-reference/apps/list-apps\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Store or replace the factory's Anthropic API key\",\"item\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key#apireference\",\"headline\":\"Store or replace the factory's Anthropic API key\",\"name\":\"Store or replace the factory's Anthropic API key\",\"description\":\"Checks the key with one call to Anthropic, then stores it in Supabase Vault in place of any key the factory has stored, and deletes the old secret. Nothing is stored when Anthropic refuses the key (anthropic_key_refused, 422) or when the check cannot reach Anthropic (anthropic_key_check_unavailable, 502). Answers with the key's last four characters, never the key. Answers 404 unless the managed-runners flag is on for the organization.\",\"url\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key\",\"mainEntityOfPage\":{\"@id\":\"https://docs-stg.outerlayer.ai/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key#webpage\"},\"dateModified\":\"2026-10-25T13:34:17.404Z\",\"publisher\":{\"@id\":\"https://docs-stg.outerlayer.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs-stg.outerlayer.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OuterLayer\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OuterLayer","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"CLI reference","pages":[{"title":"CLI reference","href":"/reference/cli"}]},{"tab":"API reference","groups":[{"group":"Get started","pages":[{"title":"Introduction","href":"/api-reference/introduction"},{"title":"Organization API","href":"/organization-api"}]},{"group":"Endpoints","pages":[{"group":"OAuth","pages":[{"title":"OAuth protected-resource metadata","deprecated":null,"version":null,"openapi":"/openapi.yaml get /.well-known/oauth-protected-resource","href":"/api-reference/oauth/oauth-protected-resource-metadata"},{"title":"OAuth protected-resource metadata for the per-app MCP mount","deprecated":null,"version":null,"openapi":"/openapi.yaml get /.well-known/oauth-protected-resource/v1/apps/{appId}/mcp","href":"/api-reference/oauth/oauth-protected-resource-metadata-for-the-per-app-mcp-mount"}]},{"group":"Health","pages":[{"title":"Service health","deprecated":null,"version":null,"openapi":"/openapi.yaml get /health","href":"/api-reference/health/service-health"},{"title":"Files health","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/health/files","href":"/api-reference/health/files-health"},{"title":"Ingestion health","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/health/ingestion","href":"/api-reference/health/ingestion-health"}]},{"group":"Agents","pages":[{"title":"Fetch an agent session image blob via a signed token","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agents/blob-token/{token}","href":"/api-reference/agents/fetch-an-agent-session-image-blob-via-a-signed-token"},{"title":"Fetch an agent session image blob","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agents/blob/{sha256}","href":"/api-reference/agents/fetch-an-agent-session-image-blob"},{"title":"Ingest coding-agent sessions (outerlayer sync)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agents/sync","href":"/api-reference/agents/ingest-coding-agent-sessions-outerlayer-sync"}]},{"group":"API Keys","pages":[{"title":"List API keys","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/api-keys","href":"/api-reference/api-keys/list-api-keys"},{"title":"Create API key","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/api-keys","href":"/api-reference/api-keys/create-api-key"},{"title":"Revoke API key","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/api-keys/{apiKeyId}","href":"/api-reference/api-keys/revoke-api-key"},{"title":"Change API key permissions","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/api-keys/{apiKeyId}","href":"/api-reference/api-keys/change-api-key-permissions"},{"title":"Clear a runner key's host binding","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/api-keys/{apiKeyId}/host-key","href":"/api-reference/api-keys/clear-a-runner-keys-host-binding"}]},{"group":"Apps","pages":[{"title":"List apps","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps","href":"/api-reference/apps/list-apps"},{"title":"Create app","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/apps","href":"/api-reference/apps/create-app"},{"title":"Get app","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps/{appId}","href":"/api-reference/apps/get-app"},{"title":"Delete app","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/apps/{appId}","href":"/api-reference/apps/delete-app"},{"title":"Update app","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/apps/{appId}","href":"/api-reference/apps/update-app"},{"title":"Get whether the factory has stored an Anthropic API key","description":"Returns whether the factory has stored an Anthropic API key for managed builds, its last four characters, who stored it and when. The key itself and the id of its Vault secret are never returned. Answers 404 unless the `managed-runners` flag is on for the organization.","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps/{appId}/anthropic-key","href":"/api-reference/apps/get-whether-the-factory-has-stored-an-anthropic-api-key"},{"title":"Store or replace the factory's Anthropic API key","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/apps/{appId}/anthropic-key","href":"/api-reference/apps/store-or-replace-the-factorys-anthropic-api-key"},{"title":"Remove the factory's Anthropic API key","description":"Deletes the stored key and its Vault secret. The next managed claim is refused with `managed_credential_missing`. Answers 204 whether or not a key was stored. Answers 404 unless the `managed-runners` flag is on for the organization.","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/apps/{appId}/anthropic-key","href":"/api-reference/apps/remove-the-factorys-anthropic-api-key"},{"title":"Get git connection status for an app","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps/{appId}/git","href":"/api-reference/apps/get-git-connection-status-for-an-app"},{"title":"List branches in a repository","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps/{appId}/git/branches","href":"/api-reference/apps/list-branches-in-a-repository"},{"title":"Mint an OAuth authorization URL for git-provider connect","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/apps/{appId}/git/connect","href":"/api-reference/apps/mint-an-oauth-authorization-url-for-git-provider-connect"},{"title":"Link a repository and branch to an app","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/apps/{appId}/git/link","href":"/api-reference/apps/link-a-repository-and-branch-to-an-app"},{"title":"Clear the linked repository and branch","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/apps/{appId}/git/link","href":"/api-reference/apps/clear-the-linked-repository-and-branch"},{"title":"List every repository linked to the factory, with its branches","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps/{appId}/git/links","href":"/api-reference/apps/list-every-repository-linked-to-the-factory-with-its-branches"},{"title":"List repositories accessible to the app's git installations","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/apps/{appId}/git/repositories","href":"/api-reference/apps/list-repositories-accessible-to-the-apps-git-installations"},{"title":"Remove a GitHub organization from the factory","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/apps/{appId}/installations/{installationId}","href":"/api-reference/apps/remove-a-github-organization-from-the-factory"}]},{"group":"Artifacts","pages":[{"title":"Emit an artifact (evidence for a pull request)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/artifacts","href":"/api-reference/artifacts/emit-an-artifact-evidence-for-a-pull-request"}]},{"group":"Capabilities","pages":[{"title":"Get capabilities","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/capabilities","href":"/api-reference/capabilities/get-capabilities"}]},{"group":"Context","pages":[{"title":"List context changes","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/context/changes","href":"/api-reference/context/list-context-changes"},{"title":"Get the context a build receives","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/context/delivery","href":"/api-reference/context/get-the-context-a-build-receives"},{"title":"Get control plane","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/context/source","href":"/api-reference/context/get-control-plane"},{"title":"Read a factory's control plane","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orgs/{orgName}/apps/{appId}/context-source","href":"/api-reference/context/read-a-factorys-control-plane"},{"title":"Designate a factory's control plane","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/orgs/{orgName}/apps/{appId}/context-source","href":"/api-reference/context/designate-a-factorys-control-plane"},{"title":"Revoke a factory's control plane","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/orgs/{orgName}/apps/{appId}/context-source","href":"/api-reference/context/revoke-a-factorys-control-plane"}]},{"group":"Criteria","pages":[{"title":"Record a work item's acceptance criteria","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/criteria","href":"/api-reference/criteria/record-a-work-items-acceptance-criteria"}]},{"group":"Emitted Results","pages":[{"title":"Emit a check result (pass/fail evidence for a work item)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/emitted-results","href":"/api-reference/emitted-results/emit-a-check-result-passfail-evidence-for-a-work-item"},{"title":"Change a check's status","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/emitted-results/{emittedResultId}/status","href":"/api-reference/emitted-results/change-a-checks-status"}]},{"group":"Findings","pages":[{"title":"Record a batch of findings on a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/findings","href":"/api-reference/findings/record-a-batch-of-findings-on-a-work-item"},{"title":"Findings and time lost per category","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/findings/summary","href":"/api-reference/findings/findings-and-time-lost-per-category"},{"title":"Rank a factory's problems","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/problems","href":"/api-reference/findings/rank-a-factorys-problems"},{"title":"One problem with its findings","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/problems/{problemId}","href":"/api-reference/findings/one-problem-with-its-findings"},{"title":"A work item's findings","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/findings","href":"/api-reference/findings/a-work-items-findings"}]},{"group":"Hosts","pages":[{"title":"List the factory's runner hosts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/hosts","href":"/api-reference/hosts/list-the-factorys-runner-hosts"},{"title":"Report a heartbeat from a runner host","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/hosts/heartbeat","href":"/api-reference/hosts/report-a-heartbeat-from-a-runner-host"},{"title":"Report a runner start that failed a check","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/hosts/startup-report","href":"/api-reference/hosts/report-a-runner-start-that-failed-a-check"}]},{"group":"Account","pages":[{"title":"List the factories the login token can use","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/me/factories","href":"/api-reference/account/list-the-factories-the-login-token-can-use"}]},{"group":"Metrics","pages":[{"title":"Get a cost/session/error breakdown by dimension","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/metrics/breakdown","href":"/api-reference/metrics/get-a-costsessionerror-breakdown-by-dimension"},{"title":"Compare metrics across two windows","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/metrics/compare","href":"/api-reference/metrics/compare-metrics-across-two-windows"},{"title":"Get per-model stats","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/metrics/models","href":"/api-reference/metrics/get-per-model-stats"},{"title":"Get fleet overview","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/metrics/overview","href":"/api-reference/metrics/get-fleet-overview"},{"title":"Get the daily sessions/cost/quality trend","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/metrics/trends","href":"/api-reference/metrics/get-the-daily-sessionscostquality-trend"}]},{"group":"Org Management","pages":[{"title":"List an org's audit log","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orgs/{orgName}/audit-log","href":"/api-reference/org-management/list-an-orgs-audit-log"},{"title":"Export an org's audit log as CSV","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orgs/{orgName}/audit-log/export","href":"/api-reference/org-management/export-an-orgs-audit-log-as-csv"},{"title":"Get one audit log entry","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orgs/{orgName}/audit-log/{logId}","href":"/api-reference/org-management/get-one-audit-log-entry"},{"title":"List org members and pending invites","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orgs/{orgName}/members","href":"/api-reference/org-management/list-org-members-and-pending-invites"},{"title":"Invite an org member","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/orgs/{orgName}/members/invites","href":"/api-reference/org-management/invite-an-org-member"},{"title":"Resend a pending invite","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/orgs/{orgName}/members/invites/{inviteId}/resend","href":"/api-reference/org-management/resend-a-pending-invite"},{"title":"Remove a member from the org","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/orgs/{orgName}/members/{userId}","href":"/api-reference/org-management/remove-a-member-from-the-org"},{"title":"Change a member's role","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/orgs/{orgName}/members/{userId}","href":"/api-reference/org-management/change-a-members-role"},{"title":"List built-in org roles","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orgs/{orgName}/roles","href":"/api-reference/org-management/list-built-in-org-roles"}]},{"group":"Pricing","pages":[{"title":"Get LLM pricing","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/pricing","href":"/api-reference/pricing/get-llm-pricing"}]},{"group":"PRs","pages":[{"title":"Get session→PR attribution merged with cost","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/prs/outcomes","href":"/api-reference/prs/get-session→pr-attribution-merged-with-cost"}]},{"group":"Repositories","pages":[{"title":"Report the GitHub App access builds need on each of the factory's repositories","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/repositories/access","href":"/api-reference/repositories/report-the-github-app-access-builds-need-on-each-of-the-factorys-repositories"}]},{"group":"Runner version","pages":[{"title":"Set the CLI version this gateway names to its runners","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/runner-version","href":"/api-reference/runner-version/set-the-cli-version-this-gateway-names-to-its-runners"}]},{"group":"Work Items","pages":[{"title":"Read a runner key's host binding","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/runner/host-key","href":"/api-reference/work-items/read-a-runner-keys-host-binding"},{"title":"List live work items","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items","href":"/api-reference/work-items/list-live-work-items"},{"title":"Add an issue to Work","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items","href":"/api-reference/work-items/add-an-issue-to-work"},{"title":"Request a host build an item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/build","href":"/api-reference/work-items/request-a-host-build-an-item"},{"title":"Declare a session's pull request onto its work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/pull-requests","href":"/api-reference/work-items/declare-a-sessions-pull-request-onto-its-work-item"},{"title":"Report that a step has started on a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/steps","href":"/api-reference/work-items/report-that-a-step-has-started-on-a-work-item"},{"title":"Link a session to a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{number}/sessions","href":"/api-reference/work-items/link-a-session-to-a-work-item"},{"title":"Read one work item","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}","href":"/api-reference/work-items/read-one-work-item"},{"title":"List a work item's artifacts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/artifacts","href":"/api-reference/work-items/list-a-work-items-artifacts"},{"title":"List checks recorded on a work item since a point","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/changes","href":"/api-reference/work-items/list-checks-recorded-on-a-work-item-since-a-point"},{"title":"List the checks currently open on a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/checks","href":"/api-reference/work-items/list-the-checks-currently-open-on-a-work-item"},{"title":"Claim a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/claim","href":"/api-reference/work-items/claim-a-work-item"},{"title":"Get the factory's Anthropic API key for a claim a managed runner holds","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/claim/anthropic-key","href":"/api-reference/work-items/get-the-factorys-anthropic-api-key-for-a-claim-a-managed-runner-holds"},{"title":"Release a host's claim on a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/claim/release","href":"/api-reference/work-items/release-a-hosts-claim-on-a-work-item"},{"title":"Renew a host's claim on a work item","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/claim/renew","href":"/api-reference/work-items/renew-a-hosts-claim-on-a-work-item"},{"title":"Stop a work item's host build","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/claim/stop","href":"/api-reference/work-items/stop-a-work-items-host-build"},{"title":"Issue a GitHub token for a work item's repository or its control plane","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/claim/tokens","href":"/api-reference/work-items/issue-a-github-token-for-a-work-items-repository-or-its-control-plane"},{"title":"Read a host attempt's runner log","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/claims/{claimId}/log","href":"/api-reference/work-items/read-a-host-attempts-runner-log"},{"title":"Post a comment on a work item's general thread or a criterion thread","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/comments","href":"/api-reference/work-items/post-a-comment-on-a-work-items-general-thread-or-a-criterion-thread"},{"title":"Get a work item's newest demo","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/demo","href":"/api-reference/work-items/get-a-work-items-newest-demo"},{"title":"Send review notes on several criteria as one agent job","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/notes","href":"/api-reference/work-items/send-review-notes-on-several-criteria-as-one-agent-job"},{"title":"The problems a work item covers","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/problems","href":"/api-reference/work-items/the-problems-a-work-item-covers"},{"title":"Record the result of a fix for one covered problem","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/work-items/{workItemId}/problems/{problemId}/result","href":"/api-reference/work-items/record-the-result-of-a-fix-for-one-covered-problem"},{"title":"Open or edit a work item's pull request","deprecated":null,"version":null,"openapi":"/openapi.yaml put /v1/work-items/{workItemId}/pull-request","href":"/api-reference/work-items/open-or-edit-a-work-items-pull-request"},{"title":"Withdraw a work item's declaration of a pull request","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/work-items/{workItemId}/pull-requests/{repository}/{prNumber}","href":"/api-reference/work-items/withdraw-a-work-items-declaration-of-a-pull-request"},{"title":"Remove an addition from Work","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/work-items/{workItemId}/remove","href":"/api-reference/work-items/remove-an-addition-from-work"},{"title":"A work item's general thread and its criterion threads","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/work-items/{workItemId}/threads","href":"/api-reference/work-items/a-work-items-general-thread-and-its-criterion-threads"}]},{"group":"Sessions","pages":[{"title":"List agent sessions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/sessions","href":"/api-reference/sessions/list-agent-sessions"},{"title":"Get agent session detail","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/sessions/{traceId}","href":"/api-reference/sessions/get-agent-session-detail"}]},{"group":"Specs","pages":[{"title":"File a spec as an issue","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/specs","href":"/api-reference/specs/file-a-spec-as-an-issue"},{"title":"Search issues a spec might duplicate","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/specs/search","href":"/api-reference/specs/search-issues-a-spec-might-duplicate"},{"title":"Where a spec would be filed","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/specs/target","href":"/api-reference/specs/where-a-spec-would-be-filed"},{"title":"Replace a spec's body","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/specs/{key}","href":"/api-reference/specs/replace-a-specs-body"}]}]}]}]},"title":"Store or replace the factory's Anthropic API key - OuterLayer","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Bbp7I60D.js","utils-C3RIvJha.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DqD-vLt8.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B31Loprg.js","snippetPresets-DKpk-b8t.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Cj65AhOR.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BXtn5gcC.js","shallow-RY2b03Cp.js","getApiPlaygroundDisplay-B0jeiPk3.js","CodeSnippet-CYgBjjwn.js","CodeSnippets-DOngDrYB.js","Page-n7I5XbKb.js","getPastedJson-DRQbJx-T.js","icon-CQiQCicY.js","MethodPill-BKTLdNtu.js","DuplicateIcon-B9jpAdat.js","createIcon-DCddRrXv.js","DynamicMarkdown-a8hUKrw6.js","SectionHeading-eECVV2eH.js","axios-vUo_bRtp.js","Markdown--GF7ZIpf.js","clsx-DZLdJUrt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-2LoAhjKH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Zwc0ZncM.js"]}