Applies a patch to the stored project. Fields the body omits are left as
stored, and child lists are paired with their stored rows by id, so a
cap keeps its accumulated spend and its window across an edit while a
child the body stops naming is deleted.
Changing the roster or any divided cap on a project with
split_policy: equal recalculates every member’s slice. That work is
queued and its id is returned as redivision_job_id; the project’s own
write has already committed by then, so a failure to queue is reported as
a server error rather than rolling the edit back.
PUT
/
api
/
governance
/
projects
/
{project_id}
Error
A valid request URL is required to generate request examples
Management API authentication for /api/* endpoints. Use the Authorization header
with Bearer <token>, where <token> is one of:
a Bifrost management API key,
a dashboard session token issued by POST /api/session/login,
base64 of <admin-username>:<admin-password> (legacy equivalent of BasicAuth).
Virtual keys (sk-bf-*) and the x-api-key header are not accepted on management APIs -
the sole exception is GET /api/governance/virtual-keys/quota, which is virtual-key-only.
Authentication alone is not sufficient in Bifrost Enterprise: each operation page shows a
Required Permissions table (Resource:Operation, for example Dashboard:View) above
its Authorizations section, and the caller's RBAC role or management API key scopes must
include what it lists, otherwise the request is rejected with 403 Forbidden.
A local admin — authenticated with the admin password, or any caller on a deployment with
dashboard auth disabled — bypasses these checks and can call every management endpoint.
OSS setup lock. On Bifrost OSS, while dashboard auth is not active (no admin account,
or auth disabled), every management endpoint except the public ones (/health,
/api/version, /api/session/is-auth-enabled, /api/session/login, ...) requires the
operator's setup token in the X-Bifrost-Setup-Token header, in place of Authorization.
The token is set with setup_token in config.json or the BIFROST_SETUP_TOKEN
environment variable. A missing header returns 401, a wrong token 403. The header
stops working once dashboard auth is enabled. The dashboard instead trades the token once
for an HttpOnly bifrost_setup_session cookie via POST /api/session/setup.
See Required permissions for how
permissions are derived and which endpoints are exempt.
Read-then-patch. A field this body omits is left as stored. For description, expires_at, rate_limit, budgets, provider_configs, mcp_configs and virtual_mcps, an explicit null clears what is stored, and for the four list fields that means deleting every stored child. The remaining fields cannot be cleared: null reads the same as omitted. Child lists are matched to their stored rows by id, so restate the ids you read; a stored child the body does not name is deleted. A members field is ignored rather than refused.
How the project's own access composes with the access the caller already holds. intersect permits only what both allow, so a project with no provider config permits nothing. union leaves the caller's access untouched and adds to it, so a project with no provider or MCP config only attributes and caps spend.
explicit admits only the users on the roster. open admits every authenticated caller and has no membership rows, which is why it cannot divide a budget between members.
Which ledgers a request's spend lands on. both charges the project and the caller. project_only takes the request off everything the caller funds, including the teams and business units above them. principal_only leaves the project's caps on record but checks and charges none of them. The deployment's own global caps always apply.
none keeps the project's caps shared, and individual members can still be capped by hand. equal gives every member an equal slice of every budget and rate limit the project holds, at every tier, as a second cap within it.
When true, grants access to every provider, including ones without a provider_configs entry and providers added later. Listed providers keep their own model, key, budget, and rate-limit rules. Omit to leave unchanged.
A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.
A Virtual MCP assigned to the project. A scoped request can reach each one at its /mcp/<slug> endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.
Clears recorded spend on the budgets this body restates that the project already held, and on each member's slice of them. A budget the edit introduces has no spend to clear, and one the body does not name is left alone.
Present only when the edit queued a redivision, which happens on a project with split_policy: equal whose roster or divided caps changed. A pending job for the same project is reused rather than queued behind, so this may name a job an earlier request created. Progress is reported on the redivision_progress WebSocket channel under this id.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"Bifrost","colors":{"primary":"#0C3B43","light":"#07C983"},"logo":{"light":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=6af701a560aee4103444fa017b226cf0","dark":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo-dark.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=84d264aad5f421c526dd17893e7c5739"},"favicon":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/favicon.ico?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=a57bad8c37d798efcb53dca5d96d8b45","navbar":{"links":[{"href":"https://www.getmaxim.ai/enterprise?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Navbar#free-license","label":"Request License"}],"primary":{"type":"button","label":"Book a Demo","href":"https://www.getmaxim.ai/book-a-demo?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Navbar"}},"footer":{"socials":{"x":"https://x.com/getbifrost","linkedin":"https://linkedin.com/company/maxim-ai","github":"https://github.com/maximhq/bifrost"},"links":[{"header":"Company","items":[{"label":"Book a Demo","href":"https://www.getmaxim.ai/book-a-demo?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Partner Program","href":"https://www.getmaxim.ai/partners-program?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Careers","href":"https://www.getmaxim.ai/careers?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Contact Us","href":"mailto:[email protected]"},{"label":"Security","href":"https://docs.getbifrost.ai/security"},{"label":"Trust Center","href":"https://trust.getmaxim.ai/"},{"label":"Terms of Service","href":"https://www.getmaxim.ai/terms-of-service?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Privacy Policy","href":"https://www.getmaxim.ai/privacy-policy?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"Products","items":[{"label":"LLM Gateway","href":"https://www.getmaxim.ai/llm-gateway?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"MCP Gateway","href":"https://www.getmaxim.ai/mcp-gateway?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Governance","href":"https://www.getmaxim.ai/ai-governance?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Guardrails","href":"https://www.getmaxim.ai/ai-guardrails?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Observability","href":"https://www.getmaxim.ai/ai-observability?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Bifrost Edge","href":"https://www.getmaxim.ai/edge?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"Resources","items":[{"label":"Bifrost Enterprise","href":"https://www.getmaxim.ai/enterprise?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Performance Benchmarks","href":"https://www.getmaxim.ai/bifrost/resources/benchmarks?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"LLM Gateway Buyer's Guide","href":"https://www.getmaxim.ai/bifrost/resources/buyers-guide?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Claude Code Integration","href":"https://www.getmaxim.ai/bifrost/resources/claude-code?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Migrating from LiteLLM","href":"https://www.getmaxim.ai/bifrost/resources/migrating-from-litellm?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Blogs","href":"https://www.getmaxim.ai/bifrost/blog?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"For LLMs","items":[{"label":"llms-full.txt","href":"https://docs.getbifrost.ai/llms-full.txt"},{"label":"llms.txt","href":"https://docs.getbifrost.ai/llms.txt"},{"label":"llm-info","href":"https://www.getmaxim.ai/llm-info?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]}]},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Discord","icon":"discord","href":"https://discord.gg/exN5KAydbU"},{"anchor":"GitHub","icon":"github","href":"https://github.com/maximhq/bifrost"},{"anchor":"Try Enterprise","icon":"building","href":"https://www.getmaxim.ai/bifrost/enterprise"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bifrost","hasAudioNarration":false,"actualSubdomain":"bifrost","customDomains":["docs.getbifrost.ai"],"gitSource":{"type":"github","owner":"maximhq","repo":"bifrost","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad8fd602935fc338a4fe596","collectionId":"986aa4ff-c7f8-4478-a290-044dc988ad79","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad8fd602935fc338a4fe596"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ad8fd602935fc338a4fe596","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"API","count":665},{"language":"default","tag":"Changelogs","count":313},{"language":"default","tag":"Integrations","count":248},{"language":"default","tag":"Platform","count":212},{"language":"default","tag":"Open Source","count":163},{"language":"default","tag":"OSS","count":141},{"language":"default","tag":"Governance","count":132},{"language":"default","tag":"Enterprise","count":101},{"language":"default","tag":"Helm","count":74},{"language":"default","tag":"Inference","count":71}]},"assistantConfig":{},"hasChatPermissions":true,"hasWebMcpPermissions":true,"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":false},"customCss":[{"filePath":"style.css","content":".nav-logo{height:1.5rem}div:has(>nav[aria-label=Main]){gap:1.5rem}nav[aria-label=Main]>ul{gap:1rem}nav[aria-label=Main] a[href*=book-a-demo]{padding:.4375rem .625rem}nav[aria-label=Main] a[href*=book-a-demo] svg{display:none}div:has(>nav[aria-label=Main])>*,nav[aria-label=Main]>ul>*{margin-inline:0}nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]{display:inline-flex;align-items:center;border:1px solid rgb(var(--primary-dark));border-radius:.75rem;box-sizing:border-box;padding:calc(.4375rem - 1px) .625rem;color:rgb(var(--primary-dark));background:0 0;font-size:.875rem;font-weight:500;line-height:1.25rem}nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]:hover{background-color:rgb(var(--primary-dark)/.1)}.dark nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]{border-color:rgb(var(--primary-light));color:rgb(var(--primary-light))}.dark nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]:hover{background-color:rgb(var(--primary-light)/.12)}#sidebar-group>li>button>div{line-height:normal}.footer-compliance{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;max-width:100%}.footer-compliance img{width:2.5rem;height:2.5rem;flex:none;object-fit:contain}@media (max-width:767px){footer.advanced-footer>div>div:first-child>div:first-child{flex-direction:column;align-items:flex-start;justify-content:flex-start;row-gap:1rem;width:100%;height:auto}footer.advanced-footer>div>div:first-child>div:first-child>div:last-child{justify-content:flex-start;min-width:0;max-width:100%}footer.advanced-footer a[class*=truncate],footer.advanced-footer>div>div:first-child>div:last-child,footer.advanced-footer>div>div:first-child>div:last-child>div{white-space:normal!important}}@media (min-width:768px){footer.advanced-footer>div>div:first-child{justify-content:flex-start;column-gap:3rem}footer.advanced-footer>div>div:first-child>div:first-child{min-width:0;justify-content:flex-start;align-items:flex-start;row-gap:1.25rem}footer.advanced-footer>div>div:first-child>div:first-child>div:last-child{margin-top:auto}footer.advanced-footer>div>div:first-child>div:last-child{flex:0 1 auto;justify-content:start;grid-template-columns:repeat(4,max-content)!important;column-gap:4rem!important}footer.advanced-footer>div>div:first-child>div:last-child>div{align-items:flex-start;width:auto;flex:none}footer.advanced-footer a[class*=truncate]{max-width:none!important;overflow:visible!important;text-overflow:unset!important;white-space:nowrap!important}}"}],"page":{"pagePath":"api-reference/projects/update-project","slug":"/api-reference/projects/update-project","pageMetadata":{"title":"Update project","description":"Applies a patch to the stored project. Fields the body omits are left as\nstored, and child lists are paired with their stored rows by `id`, so a\ncap keeps its accumulated spend and its window across an edit while a\nchild the body stops naming is deleted.\n\nChanging the roster or any divided cap on a project with\n`split_policy: equal` recalculates every member's slice. That work is\nqueued and its id is returned as `redivision_job_id`; the project's own\nwrite has already committed by then, so a failure to queue is reported as\na server error rather than rolling the edit back.\n","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/projects/{project_id}","href":"/api-reference/projects/update-project","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Applies a patch to the stored project. Fields the body omits are left as\\nstored, and child lists are paired with their stored rows by \", _jsx(_components.code, {\n children: \"id\"\n }), \", so a\\ncap keeps its accumulated spend and its window across an edit while a\\nchild the body stops naming is deleted.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Changing the roster or any divided cap on a project with\\n\", _jsx(_components.code, {\n children: \"split_policy: equal\"\n }), \" recalculates every member’s slice. That work is\\nqueued and its id is returned as \", _jsx(_components.code, {\n children: \"redivision_job_id\"\n }), \"; the project’s own\\nwrite has already committed by then, so a failure to queue is reported as\\na server error rather than rolling the edit back.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Note,Table}=_components;if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(Note,{children:_jsxs(_components.p,{children:[`This endpoint is available in `,_jsx(_components.a,{href:`https://www.getmaxim.ai/bifrost/enterprise`,children:`Bifrost Enterprise`}),` only.`]})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Required Permissions`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Granted via`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Projects:Update`})}),_jsx(_components.td,{children:`RBAC role or API key scope`})]})})]}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`/api/procuring-api-keys#required-permissions`,children:`How permissions work`})})]})}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":"Update project","description":"Applies a patch to the stored project. Fields the body omits are left as\nstored, and child lists are paired with their stored rows by `id`, so a\ncap keeps its accumulated spend and its window across an edit while a\nchild the body stops naming is deleted.\n\nChanging the roster or any divided cap on a project with\n`split_policy: equal` recalculates every member's slice. That work is\nqueued and its id is returned as `redivision_job_id`; the project's own\nwrite has already committed by then, so a failure to queue is reported as\na server error rather than rolling the edit back.\n","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/projects/{project_id}","href":"/api-reference/projects/update-project","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/bifrost/62ad9b1aea461302/googleTag.js","/_mintlify/custom/bifrost/c4c9272fd1c525e5/jsonLd.js","/_mintlify/custom/bifrost/5a8b9314a2dac891/supportWidget.js","/_mintlify/custom/bifrost/088e287583b748b0/baseUrlSwitcher.js","/_mintlify/custom/bifrost/aa532cead633d329/tally-embed.js","/_mintlify/custom/bifrost/fe58824b4f1a0ad5/footerCompliance.js"],"openApiReferenceData":{"operation":{"operationId":"updateProject","x-mint":{"metadata":{"tag":"Enterprise"},"content":"\u003cNote>\n This endpoint is available in [Bifrost Enterprise](https://www.getmaxim.ai/bifrost/enterprise) only.\n\u003c/Note>\n\n**Required Permissions**\n\n| Permission | Granted via |\n| --- | --- |\n| `Projects:Update` | RBAC role or API key scope |\n\n[How permissions work](/api/procuring-api-keys#required-permissions)\n"},"summary":"Update project","description":"Applies a patch to the stored project. Fields the body omits are left as\nstored, and child lists are paired with their stored rows by `id`, so a\ncap keeps its accumulated spend and its window across an edit while a\nchild the body stops naming is deleted.\n\nChanging the roster or any divided cap on a project with\n`split_policy: equal` recalculates every member's slice. That work is\nqueued and its id is returned as `redivision_job_id`; the project's own\nwrite has already committed by then, so a failure to queue is reported as\na server error rather than rolling the edit back.\n","tags":["Projects"],"parameters":["404a386a-f9a7-4d68-9f3d-e39685d58042"],"requestBody":"dc1374aa-2179-497f-b40e-580d12aaf773","security":["e8403418-83fa-48ff-8ea2-21f6b009674e"],"responses":{"200":"d16d92af-29b4-4e10-8ba2-2e21f28f2501","400":"57cd3357-b04b-4817-a64d-154755ce0e09","404":"6e5c4004-a219-4da7-81ba-15b165f9446b","409":"2ca24964-b3b9-476a-b0af-3285980e0703","500":"73dc1369-cbbc-4428-a1dc-2215995ee356"},"method":"put","type":"path","servers":["cba0508a-601f-431b-88e6-d1ec1ec830f3"],"path":"/api/governance/projects/{project_id}","baseUrlOptions":["{baseUrl}"],"title":"Update project","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"404a386a-f9a7-4d68-9f3d-e39685d58042":{"name":"project_id","in":"path","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Read-then-patch. A field this body omits is left as stored. For `description`, `expires_at`, `rate_limit`, `budgets`, `provider_configs`, `mcp_configs` and `virtual_mcps`, an explicit `null` clears what is stored, and for the four list fields that means deleting every stored child. The remaining fields cannot be cleared: `null` reads the same as omitted. Child lists are matched to their stored rows by `id`, so restate the ids you read; a stored child the body does not name is deleted. A `members` field is ignored rather than refused.","properties":{"name":{"type":"string","uniqueKey":"name","typeLabel":"string"},"description":{"oneOf":[{"type":"string","uniqueKey":"description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"description.oneOf.1","typeLabel":"null"}],"uniqueKey":"description","typeLabel":"string | null"},"is_active":{"type":"boolean","uniqueKey":"is_active","typeLabel":"boolean"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time> | null"},"access_rule":{"type":"string","enum":["intersect","union"],"description":"How the project's own access composes with the access the caller already holds. `intersect` permits only what both allow, so a project with no provider config permits nothing. `union` leaves the caller's access untouched and adds to it, so a project with no provider or MCP config only attributes and caps spend.","uniqueKey":"access_rule","typeLabel":"enum\u003cstring>"},"membership_mode":{"type":"string","enum":["explicit","open"],"default":"explicit","description":"`explicit` admits only the users on the roster. `open` admits every authenticated caller and has no membership rows, which is why it cannot divide a budget between members.","uniqueKey":"membership_mode","typeLabel":"enum\u003cstring>"},"accounting_mode":{"type":"string","enum":["both","project_only","principal_only"],"default":"both","description":"Which ledgers a request's spend lands on. `both` charges the project and the caller. `project_only` takes the request off everything the caller funds, including the teams and business units above them. `principal_only` leaves the project's caps on record but checks and charges none of them. The deployment's own global caps always apply.","uniqueKey":"accounting_mode","typeLabel":"enum\u003cstring>"},"split_policy":{"type":"string","enum":["none","equal"],"default":"none","description":"`none` keeps the project's caps shared, and individual members can still be capped by hand. `equal` gives every member an equal slice of every budget and rate limit the project holds, at every tier, as a second cap within it.","uniqueKey":"split_policy","typeLabel":"enum\u003cstring>"},"calendar_aligned":{"type":"boolean","uniqueKey":"calendar_aligned","typeLabel":"boolean"},"allow_all_providers":{"type":"boolean","description":"When true, grants access to every provider, including ones without a provider_configs entry and providers added later. Listed providers keep their own model, key, budget, and rate-limit rules. Omit to leave unchanged.","uniqueKey":"allow_all_providers","typeLabel":"boolean"},"budgets":{"oneOf":[{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"budgets.oneOf.0.items.[INDEX].max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"budgets.oneOf.0.items.[INDEX].reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"budgets.oneOf.0.items.[INDEX].id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"budgets.oneOf.0.items.[INDEX].reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"budgets.oneOf.0.items.[INDEX].reset_config","typeLabel":"object"}},"uniqueKey":"budgets.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"budgets.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false}}},"uniqueKey":"budgets.oneOf.1","typeLabel":"null"}],"uniqueKey":"budgets","typeLabel":"object[] | null"},"rate_limit":{"oneOf":[{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"rate_limit.oneOf.0.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"rate_limit.oneOf.0.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"rate_limit.oneOf.0.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"rate_limit.oneOf.0.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"rate_limit.oneOf.0.request_reset_duration","typeLabel":"string"}},"uniqueKey":"rate_limit.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"rate_limit.oneOf.1","typeLabel":"null"}],"uniqueKey":"rate_limit","typeLabel":"object | null"},"provider_configs":{"oneOf":[{"type":"array","items":{"type":"object","description":"What the project allows on one provider, and the money that provider's use answers to. A project names each provider at most once.","required":["provider_name"],"properties":{"provider_name":{"type":"string","example":"openai","isRequired":true,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].provider_name","typeLabel":"string"},"id":{"type":"integer","description":"Omit or send `0` to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].id","typeLabel":"integer"},"all_models_allowed":{"type":"boolean","default":false,"description":"Allows every model the provider offers.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].all_models_allowed","typeLabel":"boolean"},"allowed_models":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].allowed_models.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Allowlist. `[\"*\"]` allows every model. A list may not mix `*` with named entries. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].allowed_models.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Allowlist. `[\"*\"]` allows every model. A list may not mix `*` with named entries. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].allowed_models.oneOf.1","typeLabel":"null"}],"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].allowed_models","typeLabel":"string[] | null"},"blacklisted_models":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].blacklisted_models.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Denylist, which wins over the allowlist. `[\"*\"]` blocks everything. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].blacklisted_models.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Denylist, which wins over the allowlist. `[\"*\"]` blocks everything. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].blacklisted_models.oneOf.1","typeLabel":"null"}],"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].blacklisted_models","typeLabel":"string[] | null"},"key_ids":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].key_ids.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Provider keys that may serve the request. `[\"*\"]` allows all; an empty list allows none. Each id must exist and belong to this provider.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].key_ids.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Provider keys that may serve the request. `[\"*\"]` allows all; an empty list allows none. Each id must exist and belong to this provider.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].key_ids.oneOf.1","typeLabel":"null"}],"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].key_ids","typeLabel":"string[] | null"},"weight":{"oneOf":[{"type":"number","description":"Load-balancing preference for this provider inside the project. Null leaves the caller's own preference standing. Negative values are refused.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].weight.oneOf.0","typeLabel":"number"},{"type":"null","description":"Load-balancing preference for this provider inside the project. Null leaves the caller's own preference standing. Negative values are refused.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].weight.oneOf.1","typeLabel":"null"}],"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].weight","typeLabel":"number | null"},"budgets":{"oneOf":[{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0.items.[INDEX].max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0.items.[INDEX].reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0.items.[INDEX].id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0.items.[INDEX].reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0.items.[INDEX].reset_config","typeLabel":"object"}},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false}}},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets.oneOf.1","typeLabel":"null"}],"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].budgets","typeLabel":"object[] | null"},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].rate_limit.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].rate_limit.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].rate_limit.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].rate_limit.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].rate_limit.request_reset_duration","typeLabel":"string"}},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].rate_limit","typeLabel":"object"},"model_budgets":{"type":"array","items":{"type":"object","description":"Caps for one model under a provider configuration. A provider may carry up to 100 of these, and the `*` tier is not accepted here because the provider configuration's own caps cover it.","required":["model_name"],"properties":{"model_name":{"type":"string","description":"Concrete model name. `*` is refused.","isRequired":true,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].model_name","typeLabel":"string"},"budgets":{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].reset_config","typeLabel":"object"}},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].budgets","typeLabel":"object[]"},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].rate_limit.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].rate_limit.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].rate_limit.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].rate_limit.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].rate_limit.request_reset_duration","typeLabel":"string"}},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX].rate_limit","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets.items.[INDEX]","typeLabel":"object"},"description":"Per-model caps under this provider. Stored as project-scoped model configurations and reassembled on read, so this field is absent from `GET /api/governance/users/{user_id}/projects`.","uniqueKey":"provider_configs.oneOf.0.items.[INDEX].model_budgets","typeLabel":"object[]"}},"uniqueKey":"provider_configs.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"provider_configs.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"What the project allows on one provider, and the money that provider's use answers to. A project names each provider at most once.","required":["provider_name"],"properties":{"id":{"type":"integer","description":"Omit or send `0` to create. Restate to update in place. An id the project does not hold is refused."},"provider_name":{"type":"string","example":"openai"},"all_models_allowed":{"type":"boolean","default":false,"description":"Allows every model the provider offers."},"allowed_models":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Allowlist. `[\"*\"]` allows every model. A list may not mix `*` with named entries. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400."},{"type":"null","items":{"type":"string"},"description":"Allowlist. `[\"*\"]` allows every model. A list may not mix `*` with named entries. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400."}]},"blacklisted_models":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Denylist, which wins over the allowlist. `[\"*\"]` blocks everything. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400."},{"type":"null","items":{"type":"string"},"description":"Denylist, which wins over the allowlist. `[\"*\"]` blocks everything. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400."}]},"key_ids":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Provider keys that may serve the request. `[\"*\"]` allows all; an empty list allows none. Each id must exist and belong to this provider."},{"type":"null","items":{"type":"string"},"description":"Provider keys that may serve the request. `[\"*\"]` allows all; an empty list allows none. Each id must exist and belong to this provider."}]},"weight":{"oneOf":[{"type":"number","description":"Load-balancing preference for this provider inside the project. Null leaves the caller's own preference standing. Negative values are refused."},{"type":"null","description":"Load-balancing preference for this provider inside the project. Null leaves the caller's own preference standing. Negative values are refused."}]},"budgets":{"oneOf":[{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false}}}},{"type":"null","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false}}}}]},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place."},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens."},"token_reset_duration":{"type":"string","example":"1h"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`."},"request_reset_duration":{"type":"string","example":"1h"}}},"model_budgets":{"type":"array","items":{"type":"object","description":"Caps for one model under a provider configuration. A provider may carry up to 100 of these, and the `*` tier is not accepted here because the provider configuration's own caps cover it.","required":["model_name"],"properties":{"model_name":{"type":"string","description":"Concrete model name. `*` is refused."},"budgets":{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false}}}},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place."},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens."},"token_reset_duration":{"type":"string","example":"1h"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`."},"request_reset_duration":{"type":"string","example":"1h"}}}},"additionalProperties":false},"description":"Per-model caps under this provider. Stored as project-scoped model configurations and reassembled on read, so this field is absent from `GET /api/governance/users/{user_id}/projects`."}}},"uniqueKey":"provider_configs.oneOf.1","typeLabel":"null"}],"uniqueKey":"provider_configs","typeLabel":"object[] | null"},"mcp_configs":{"oneOf":[{"type":"array","items":{"type":"object","description":"The tools of one MCP client the project may execute. Naming a client with an empty tool list still counts as the project having named it, so a client the project closes off cannot be reopened by a default-allowed rule.","properties":{"id":{"type":"integer","description":"Omit or send `0` to create. Restate to update in place.","uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].id","typeLabel":"integer"},"mcp_client_id":{"type":"integer","description":"The stored MCP client. May be omitted when `mcp_client_name` is given, which is resolved to this id on write.","uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].mcp_client_id","typeLabel":"integer"},"mcp_client_name":{"type":"string","description":"Write-only convenience. Resolved to `mcp_client_id`; a name that matches no client is refused. Never returned on a read.","uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].mcp_client_name","typeLabel":"string"},"tools_to_execute":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].tools_to_execute.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"`[\"*\"]` allows every tool the client exposes, including ones added later. An empty list allows none. A list may not mix `*` with named entries.","uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].tools_to_execute.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"`[\"*\"]` allows every tool the client exposes, including ones added later. An empty list allows none. A list may not mix `*` with named entries.","uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].tools_to_execute.oneOf.1","typeLabel":"null"}],"uniqueKey":"mcp_configs.oneOf.0.items.[INDEX].tools_to_execute","typeLabel":"string[] | null"}},"uniqueKey":"mcp_configs.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"mcp_configs.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"The tools of one MCP client the project may execute. Naming a client with an empty tool list still counts as the project having named it, so a client the project closes off cannot be reopened by a default-allowed rule.","properties":{"id":{"type":"integer","description":"Omit or send `0` to create. Restate to update in place."},"mcp_client_id":{"type":"integer","description":"The stored MCP client. May be omitted when `mcp_client_name` is given, which is resolved to this id on write."},"mcp_client_name":{"type":"string","description":"Write-only convenience. Resolved to `mcp_client_id`; a name that matches no client is refused. Never returned on a read."},"tools_to_execute":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"`[\"*\"]` allows every tool the client exposes, including ones added later. An empty list allows none. A list may not mix `*` with named entries."},{"type":"null","items":{"type":"string"},"description":"`[\"*\"]` allows every tool the client exposes, including ones added later. An empty list allows none. A list may not mix `*` with named entries."}]}}},"uniqueKey":"mcp_configs.oneOf.1","typeLabel":"null"}],"uniqueKey":"mcp_configs","typeLabel":"object[] | null"},"virtual_mcps":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"object","description":"A Virtual MCP assigned to the project. A scoped request can reach each one at its `/mcp/\u003cslug>` endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.","required":["virtual_mcp_name"],"properties":{"virtual_mcp_name":{"type":"string","description":"Name of the Virtual MCP. Resolved to the stored Virtual MCP on save; a name that matches none is refused.","isRequired":true,"uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX].oneOf.0.virtual_mcp_name","typeLabel":"string"},"virtual_mcp_id":{"type":"integer","minimum":1,"description":"Virtual MCP ID, as an alternative to virtual_mcp_name. Wins when both are set.","uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX].oneOf.0.virtual_mcp_id","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A Virtual MCP assigned to the project. A scoped request can reach each one at its `/mcp/\u003cslug>` endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.","required":["virtual_mcp_id"],"properties":{"virtual_mcp_id":{"type":"integer","minimum":1,"description":"Virtual MCP ID, as an alternative to virtual_mcp_name. Wins when both are set.","isRequired":true,"uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX].oneOf.1.virtual_mcp_id","typeLabel":"integer"},"virtual_mcp_name":{"type":"string","description":"Name of the Virtual MCP. Resolved to the stored Virtual MCP on save; a name that matches none is refused.","uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX].oneOf.1.virtual_mcp_name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"virtual_mcps.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"virtual_mcps.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"oneOf":[{"type":"object","description":"A Virtual MCP assigned to the project. A scoped request can reach each one at its `/mcp/\u003cslug>` endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.","required":["virtual_mcp_name"],"properties":{"virtual_mcp_name":{"type":"string","description":"Name of the Virtual MCP. Resolved to the stored Virtual MCP on save; a name that matches none is refused."},"virtual_mcp_id":{"type":"integer","minimum":1,"description":"Virtual MCP ID, as an alternative to virtual_mcp_name. Wins when both are set."}},"additionalProperties":false},{"type":"object","description":"A Virtual MCP assigned to the project. A scoped request can reach each one at its `/mcp/\u003cslug>` endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.","required":["virtual_mcp_id"],"properties":{"virtual_mcp_name":{"type":"string","description":"Name of the Virtual MCP. Resolved to the stored Virtual MCP on save; a name that matches none is refused."},"virtual_mcp_id":{"type":"integer","minimum":1,"description":"Virtual MCP ID, as an alternative to virtual_mcp_name. Wins when both are set."}},"additionalProperties":false}]},"uniqueKey":"virtual_mcps.oneOf.1","typeLabel":"null"}],"uniqueKey":"virtual_mcps","typeLabel":"object[] | null"},"reset_budget_usage":{"type":"boolean","description":"Clears recorded spend on the budgets this body restates that the project already held, and on each member's slice of them. A budget the edit introduces has no spend to clear, and one the body does not name is left alone.","uniqueKey":"reset_budget_usage","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","description":"\u003cstring>","is_active":true,"expires_at":"2023-11-07T05:31:56Z","membership_mode":"explicit","accounting_mode":"both","split_policy":"none","calendar_aligned":true,"allow_all_providers":true,"budgets":[{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6}}],"rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h"},"provider_configs":[{"provider_name":"openai","id":123,"all_models_allowed":false,"allowed_models":["\u003cstring>"],"blacklisted_models":["\u003cstring>"],"key_ids":["\u003cstring>"],"weight":123,"budgets":[{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6}}],"rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h"},"model_budgets":[{"model_name":"\u003cstring>","budgets":[{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6}}],"rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h"}}]}],"mcp_configs":[{"id":123,"mcp_client_id":123,"mcp_client_name":"\u003cstring>","tools_to_execute":["\u003cstring>"]}],"virtual_mcps":[{"virtual_mcp_name":"\u003cstring>","virtual_mcp_id":2}],"reset_budget_usage":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"d16d92af-29b4-4e10-8ba2-2e21f28f2501":{"description":"Project updated","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"object","description":"A per-request access scope and accounting ledger that callers opt into with a header.","properties":{"id":{"type":"string","readOnly":true,"uniqueKey":"project.id","typeLabel":"string"},"name":{"type":"string","description":"Globally unique. Requests reference it with the `x-bf-project-name` header.","uniqueKey":"project.name","typeLabel":"string"},"description":{"oneOf":[{"type":"string","uniqueKey":"project.description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"project.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.description","typeLabel":"string | null"},"is_active":{"type":"boolean","default":true,"description":"A disabled project refuses every request that names it.","uniqueKey":"project.is_active","typeLabel":"boolean"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"An expired project refuses every request that names it. The comparison is inclusive.","uniqueKey":"project.expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"An expired project refuses every request that names it. The comparison is inclusive.","uniqueKey":"project.expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.expires_at","typeLabel":"string\u003cdate-time> | null"},"access_rule":{"type":"string","enum":["intersect","union"],"description":"How the project's own access composes with the access the caller already holds. `intersect` permits only what both allow, so a project with no provider config permits nothing. `union` leaves the caller's access untouched and adds to it, so a project with no provider or MCP config only attributes and caps spend.","uniqueKey":"project.access_rule","typeLabel":"enum\u003cstring>"},"membership_mode":{"type":"string","enum":["explicit","open"],"default":"explicit","description":"`explicit` admits only the users on the roster. `open` admits every authenticated caller and has no membership rows, which is why it cannot divide a budget between members.","uniqueKey":"project.membership_mode","typeLabel":"enum\u003cstring>"},"accounting_mode":{"type":"string","enum":["both","project_only","principal_only"],"default":"both","description":"Which ledgers a request's spend lands on. `both` charges the project and the caller. `project_only` takes the request off everything the caller funds, including the teams and business units above them. `principal_only` leaves the project's caps on record but checks and charges none of them. The deployment's own global caps always apply.","uniqueKey":"project.accounting_mode","typeLabel":"enum\u003cstring>"},"split_policy":{"type":"string","enum":["none","equal"],"default":"none","description":"`none` keeps the project's caps shared, and individual members can still be capped by hand. `equal` gives every member an equal slice of every budget and rate limit the project holds, at every tier, as a second cap within it.","uniqueKey":"project.split_policy","typeLabel":"enum\u003cstring>"},"calendar_aligned":{"type":"boolean","default":false,"description":"Snaps every window the project holds, including each member's derived slice, onto calendar boundaries instead of running from creation.","uniqueKey":"project.calendar_aligned","typeLabel":"boolean"},"allow_all_providers":{"type":"boolean","default":false,"description":"When true, grants access to every provider, including ones without a provider_configs entry and providers added later. Listed providers keep their own model, key, budget, and rate-limit rules.","uniqueKey":"project.allow_all_providers","typeLabel":"boolean"},"budgets":{"oneOf":[{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"project.budgets.oneOf.0.items.[INDEX].id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"project.budgets.oneOf.0.items.[INDEX].reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].reset_config","typeLabel":"object"},"current_usage":{"type":"number","readOnly":true,"description":"Spend recorded in the current window.","uniqueKey":"project.budgets.oneOf.0.items.[INDEX].current_usage","typeLabel":"number"},"last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].last_reset","typeLabel":"string\u003cdate-time>"},"override_amount":{"type":"number","readOnly":true,"description":"Operator top-up added to `max_limit` while active. Projects have no endpoint that sets one; the field is reported for completeness.","uniqueKey":"project.budgets.oneOf.0.items.[INDEX].override_amount","typeLabel":"number"},"override_mode":{"type":"string","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].override_mode","typeLabel":"string"},"override_cycles_remaining":{"type":"integer","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].override_cycles_remaining","typeLabel":"integer"},"override_cycles_total":{"type":"integer","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].override_cycles_total","typeLabel":"integer"},"override_anchor_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].override_anchor_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.budgets.oneOf.0.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.budgets.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.budgets.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false},"current_usage":{"type":"number","readOnly":true,"description":"Spend recorded in the current window."},"last_reset":{"type":"string","format":"date-time","readOnly":true},"override_amount":{"type":"number","readOnly":true,"description":"Operator top-up added to `max_limit` while active. Projects have no endpoint that sets one; the field is reported for completeness."},"override_mode":{"type":"string","readOnly":true},"override_cycles_remaining":{"type":"integer","readOnly":true},"override_cycles_total":{"type":"integer","readOnly":true},"override_anchor_reset":{"type":"string","format":"date-time","readOnly":true},"config_hash":{"type":"string","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"uniqueKey":"project.budgets.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.budgets","typeLabel":"object[] | null"},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"project.rate_limit.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"project.rate_limit.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.rate_limit.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"project.rate_limit.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.rate_limit.request_reset_duration","typeLabel":"string"},"token_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.rate_limit.token_current_usage","typeLabel":"integer"},"token_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.rate_limit.token_last_reset","typeLabel":"string\u003cdate-time>"},"request_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.rate_limit.request_current_usage","typeLabel":"integer"},"request_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.rate_limit.request_last_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.rate_limit.config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.rate_limit.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.rate_limit.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.rate_limit","typeLabel":"object"},"provider_configs":{"type":"array","items":{"type":"object","description":"What the project allows on one provider, and the money that provider's use answers to. A project names each provider at most once.","required":["provider_name"],"properties":{"provider_name":{"type":"string","example":"openai","isRequired":true,"uniqueKey":"project.provider_configs.items.[INDEX].provider_name","typeLabel":"string"},"id":{"type":"integer","description":"Omit or send `0` to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"project.provider_configs.items.[INDEX].id","typeLabel":"integer"},"all_models_allowed":{"type":"boolean","default":false,"description":"Allows every model the provider offers.","uniqueKey":"project.provider_configs.items.[INDEX].all_models_allowed","typeLabel":"boolean"},"allowed_models":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"project.provider_configs.items.[INDEX].allowed_models.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Allowlist. `[\"*\"]` allows every model. A list may not mix `*` with named entries. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"project.provider_configs.items.[INDEX].allowed_models.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Allowlist. `[\"*\"]` allows every model. A list may not mix `*` with named entries. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"project.provider_configs.items.[INDEX].allowed_models.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.provider_configs.items.[INDEX].allowed_models","typeLabel":"string[] | null"},"blacklisted_models":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"project.provider_configs.items.[INDEX].blacklisted_models.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Denylist, which wins over the allowlist. `[\"*\"]` blocks everything. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"project.provider_configs.items.[INDEX].blacklisted_models.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Denylist, which wins over the allowlist. `[\"*\"]` blocks everything. An entry starting with `regex:` is an RE2 pattern matched case-insensitively against the whole model name. An empty pattern, `regex:*`, or a pattern that does not compile is rejected with 400.","uniqueKey":"project.provider_configs.items.[INDEX].blacklisted_models.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.provider_configs.items.[INDEX].blacklisted_models","typeLabel":"string[] | null"},"key_ids":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"project.provider_configs.items.[INDEX].key_ids.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Provider keys that may serve the request. `[\"*\"]` allows all; an empty list allows none. Each id must exist and belong to this provider.","uniqueKey":"project.provider_configs.items.[INDEX].key_ids.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Provider keys that may serve the request. `[\"*\"]` allows all; an empty list allows none. Each id must exist and belong to this provider.","uniqueKey":"project.provider_configs.items.[INDEX].key_ids.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.provider_configs.items.[INDEX].key_ids","typeLabel":"string[] | null"},"weight":{"oneOf":[{"type":"number","description":"Load-balancing preference for this provider inside the project. Null leaves the caller's own preference standing. Negative values are refused.","uniqueKey":"project.provider_configs.items.[INDEX].weight.oneOf.0","typeLabel":"number"},{"type":"null","description":"Load-balancing preference for this provider inside the project. Null leaves the caller's own preference standing. Negative values are refused.","uniqueKey":"project.provider_configs.items.[INDEX].weight.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.provider_configs.items.[INDEX].weight","typeLabel":"number | null"},"budgets":{"oneOf":[{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].reset_config","typeLabel":"object"},"current_usage":{"type":"number","readOnly":true,"description":"Spend recorded in the current window.","uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].current_usage","typeLabel":"number"},"last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].last_reset","typeLabel":"string\u003cdate-time>"},"override_amount":{"type":"number","readOnly":true,"description":"Operator top-up added to `max_limit` while active. Projects have no endpoint that sets one; the field is reported for completeness.","uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].override_amount","typeLabel":"number"},"override_mode":{"type":"string","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].override_mode","typeLabel":"string"},"override_cycles_remaining":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].override_cycles_remaining","typeLabel":"integer"},"override_cycles_total":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].override_cycles_total","typeLabel":"integer"},"override_anchor_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].override_anchor_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused."},"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars."},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters."}},"additionalProperties":false},"current_usage":{"type":"number","readOnly":true,"description":"Spend recorded in the current window."},"last_reset":{"type":"string","format":"date-time","readOnly":true},"override_amount":{"type":"number","readOnly":true,"description":"Operator top-up added to `max_limit` while active. Projects have no endpoint that sets one; the field is reported for completeness."},"override_mode":{"type":"string","readOnly":true},"override_cycles_remaining":{"type":"integer","readOnly":true},"override_cycles_total":{"type":"integer","readOnly":true},"override_anchor_reset":{"type":"string","format":"date-time","readOnly":true},"config_hash":{"type":"string","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"uniqueKey":"project.provider_configs.items.[INDEX].budgets.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.provider_configs.items.[INDEX].budgets","typeLabel":"object[] | null"},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.request_reset_duration","typeLabel":"string"},"token_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.token_current_usage","typeLabel":"integer"},"token_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.token_last_reset","typeLabel":"string\u003cdate-time>"},"request_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.request_current_usage","typeLabel":"integer"},"request_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.request_last_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.provider_configs.items.[INDEX].rate_limit","typeLabel":"object"},"model_budgets":{"type":"array","items":{"type":"object","description":"Caps for one model under a provider configuration. A provider may carry up to 100 of these, and the `*` tier is not accepted here because the provider configuration's own caps cover it.","required":["model_name"],"properties":{"model_name":{"type":"string","description":"Concrete model name. `*` is refused.","isRequired":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].model_name","typeLabel":"string"},"budgets":{"type":"array","items":{"type":"object","description":"A spend cap on a project, on a provider inside it, or on a model under that provider. On an update, restating `id` pairs the declaration with its stored row so accumulated spend and the window anchor carry over; omit `id` to create a new cap.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].reset_config","typeLabel":"object"},"current_usage":{"type":"number","readOnly":true,"description":"Spend recorded in the current window.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].current_usage","typeLabel":"number"},"last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].last_reset","typeLabel":"string\u003cdate-time>"},"override_amount":{"type":"number","readOnly":true,"description":"Operator top-up added to `max_limit` while active. Projects have no endpoint that sets one; the field is reported for completeness.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].override_amount","typeLabel":"number"},"override_mode":{"type":"string","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].override_mode","typeLabel":"string"},"override_cycles_remaining":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].override_cycles_remaining","typeLabel":"integer"},"override_cycles_total":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].override_cycles_total","typeLabel":"integer"},"override_anchor_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].override_anchor_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].budgets","typeLabel":"object[]"},"rate_limit":{"type":"object","description":"A token and request rate limit on a project, on a provider inside it, or on a model under that provider. The two dimensions run independent windows, and a cap is enforced only together with its window.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.request_reset_duration","typeLabel":"string"},"token_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.token_current_usage","typeLabel":"integer"},"token_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.token_last_reset","typeLabel":"string\u003cdate-time>"},"request_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.request_current_usage","typeLabel":"integer"},"request_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.request_last_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX].rate_limit","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"project.provider_configs.items.[INDEX].model_budgets.items.[INDEX]","typeLabel":"object"},"description":"Per-model caps under this provider. Stored as project-scoped model configurations and reassembled on read, so this field is absent from `GET /api/governance/users/{user_id}/projects`.","uniqueKey":"project.provider_configs.items.[INDEX].model_budgets","typeLabel":"object[]"}},"uniqueKey":"project.provider_configs.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.provider_configs","typeLabel":"object[]"},"mcp_configs":{"type":"array","items":{"type":"object","description":"The tools of one MCP client the project may execute. Naming a client with an empty tool list still counts as the project having named it, so a client the project closes off cannot be reopened by a default-allowed rule.","properties":{"id":{"type":"integer","description":"Omit or send `0` to create. Restate to update in place.","uniqueKey":"project.mcp_configs.items.[INDEX].id","typeLabel":"integer"},"mcp_client_id":{"type":"integer","description":"The stored MCP client. May be omitted when `mcp_client_name` is given, which is resolved to this id on write.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client_id","typeLabel":"integer"},"mcp_client_name":{"type":"string","description":"Write-only convenience. Resolved to `mcp_client_id`; a name that matches no client is refused. Never returned on a read.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client_name","typeLabel":"string"},"mcp_client":{"type":"object","description":"The resolved client, included on reads.","properties":{"config":{"type":"object","description":"Full MCP client configuration (used in responses)","properties":{"client_id":{"type":"string","description":"Unique identifier for the MCP client","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.client_id","typeLabel":"string"},"name":{"type":"string","description":"Display name for the MCP client","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.name","typeLabel":"string"},"is_code_mode_client":{"type":"boolean","description":"Whether this client is available in code mode","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.is_code_mode_client","typeLabel":"boolean"},"connection_type":{"type":"string","enum":["http","stdio","sse","inprocess","openapi"],"description":"Connection type for MCP client. `openapi` synthesizes an in-process MCP\nserver from an OpenAPI/Swagger document (see `openapi_config`): every\nsupported operation becomes a tool whose call is proxied as an HTTP\nrequest to the described API.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.connection_type","typeLabel":"enum\u003cstring>"},"connection_string":{"type":"string","description":"HTTP or SSE URL (required for HTTP or SSE connections)","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.connection_string","typeLabel":"string"},"stdio_config":{"type":"object","description":"STDIO configuration for MCP client","properties":{"command":{"type":"string","description":"Executable command to run","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.stdio_config.command","typeLabel":"string"},"args":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.stdio_config.args.items.[INDEX]","typeLabel":"string"},"description":"Command line arguments","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.stdio_config.args","typeLabel":"string[]"},"envs":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.stdio_config.envs.items.[INDEX]","typeLabel":"string"},"description":"Environment variables required","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.stdio_config.envs","typeLabel":"string[]"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.stdio_config","typeLabel":"object"},"openapi_config":{"type":"object","description":"Present for openapi clients. The document itself is omitted and credentials are redacted; the spec_* metadata describes the stored document.","properties":{"spec":{"type":"string","description":"Inline OpenAPI/Swagger document (JSON or YAML text). Write-only.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.spec","typeLabel":"string"},"spec_url":{"type":"string","format":"uri","description":"http(s) URL of the document. Fetched on create when spec is empty; sent with spec, it is the URL relative servers resolve against.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.spec_url","typeLabel":"string\u003curi>"},"base_url":{"type":"string","format":"uri","description":"Upstream API base URL. Defaults to the document's first server; required when the document declares none or only relative ones.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.base_url","typeLabel":"string\u003curi>"},"security_credentials":{"type":"object","additionalProperties":{"type":"object","description":"Secret material for one `securitySchemes` entry. `apiKey` and `http`\nbearer schemes use `value`; `http` basic uses `username` and `password`.\nValues accept `env.VAR` and `vault.path` references. Responses return\nredacted placeholders; sending a placeholder back on update keeps the\nstored secret.\n","properties":{"value":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.security_credentials.additionalProperties.value","typeLabel":"string"},"username":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.security_credentials.additionalProperties.username","typeLabel":"string"},"password":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.security_credentials.additionalProperties.password","typeLabel":"string"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.security_credentials.additionalProperties","typeLabel":"object"},"description":"Credentials keyed by the document's securitySchemes name.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.security_credentials","typeLabel":"object"},"include_deprecated":{"type":"boolean","default":false,"description":"Expose operations the document marks deprecated.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.include_deprecated","typeLabel":"boolean"},"max_response_bytes":{"type":"integer","minimum":0,"description":"Cap on the upstream response body returned to the model (0 = default 64 KiB).","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.max_response_bytes","typeLabel":"integer"},"spec_size":{"type":"integer","readOnly":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.spec_size","typeLabel":"integer"},"spec_hash":{"type":"string","readOnly":true,"description":"SHA-256 of the stored document.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.spec_hash","typeLabel":"string"},"spec_title":{"type":"string","readOnly":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.spec_title","typeLabel":"string"},"openapi_version":{"type":"string","readOnly":true,"description":"Detected document version, e.g. \"2.0\", \"3.0.3\", \"3.1.0\", \"3.2.0\".","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.openapi_version","typeLabel":"string"},"operation_count":{"type":"integer","readOnly":true,"description":"Number of tools synthesized from the document.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config.operation_count","typeLabel":"integer"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.openapi_config","typeLabel":"object"},"tls_config":{"type":"object","description":"TLS configuration for HTTP and SSE connections.","properties":{"insecure_skip_verify":{"type":"boolean","description":"Disable TLS certificate verification. Development/testing only.","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tls_config.insecure_skip_verify","typeLabel":"boolean"},"ca_cert_pem":{"type":"string","description":"PEM-encoded CA certificate. Supports env.VAR_NAME syntax for input.\nResponses return a redacted placeholder rather than the raw PEM value.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tls_config.ca_cert_pem","typeLabel":"string"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tls_config","typeLabel":"object"},"auth_type":{"type":"string","enum":["none","headers","oauth","per_user_oauth","per_user_headers","token_exchange"],"description":"Authentication type for the MCP connection","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.auth_type","typeLabel":"enum\u003cstring>"},"oauth_config_id":{"type":"string","description":"OAuth config ID for OAuth authentication.\nReferences the oauth_configs table.\nOnly set when auth_type is \"oauth\".\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.oauth_config_id","typeLabel":"string"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.headers.additionalProperties","typeLabel":"string"},"description":"Custom headers to include in requests.\nOnly used when auth_type is \"headers\".\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.headers","typeLabel":"object"},"tools_to_execute":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tools_to_execute.items.[INDEX]","typeLabel":"string"},"description":"Include-only list for tools.\n[\"*\"] => all tools are included\n[] => no tools are included\n[\"tool1\", \"tool2\"] => include only the specified tools\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tools_to_execute","typeLabel":"string[]"},"tools_to_auto_execute":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tools_to_auto_execute.items.[INDEX]","typeLabel":"string"},"description":"List of tools that can be auto-executed without user approval.\nMust be a subset of tools_to_execute.\n[\"*\"] => all executable tools can be auto-executed\n[] => no tools are auto-executed\n[\"tool1\", \"tool2\"] => only specified tools can be auto-executed\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tools_to_auto_execute","typeLabel":"string[]"},"tool_pricing":{"type":"object","additionalProperties":{"type":"number","format":"double","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tool_pricing.additionalProperties","typeLabel":"number\u003cdouble>"},"description":"Per-tool cost in USD for execution.\nKey is the tool name, value is the cost per execution.\nExample: {\"read_file\": 0.001, \"write_file\": 0.002}\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.tool_pricing","typeLabel":"object"},"allow_on_all_virtual_keys":{"type":"boolean","default":false,"description":"When true, this MCP client's tools are accessible to all virtual keys without requiring\nexplicit per-key assignment. All tools are allowed by default. If a virtual key has an\nexplicit MCP config for this client, that config takes precedence and overrides this behaviour.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.allow_on_all_virtual_keys","typeLabel":"boolean"},"per_user_header_keys":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.per_user_header_keys.items.[INDEX]","typeLabel":"string"},"description":"For `per_user_headers` clients only. The list of header names each end-user\nmust supply via the inline-401 flow. Header values themselves are stored\nper-user in a separate table (surfaced on `/api/mcp/sessions`).\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.per_user_header_keys","typeLabel":"string[]"},"token_exchange":{"type":"object","description":"For `token_exchange` clients only. `client_id` and `client_secret` are\nredacted in this response.\n","required":["audience"],"properties":{"audience":{"type":"string","minLength":1,"description":"Resource identifier this server is scoped to at the identity provider (e.g. \"api://jira-mcp\")","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.audience","typeLabel":"string"},"use_idp_credentials":{"type":"boolean","description":"When true, performs the exchange as the SSO login application itself\ninstead of client_id/client_secret below, which are then ignored.\nSome providers require this: Microsoft Entra ID's on-behalf-of grant\nonly accepts an assertion audienced to the exchanging application,\nand the SSO login flow always requests a token self-audienced to the\nSSO application, so a separate exchange application can never\nreceive a usable one.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.use_idp_credentials","typeLabel":"boolean"},"client_id":{"type":"string","minLength":1,"description":"The identity-provider application authorized to perform exchanges for\nthis audience — typically a dedicated registration carrying the\ntoken-exchange (or on-behalf-of) grant, separate from the SSO login\napplication. Required unless use_idp_credentials is true. Supports\nenv.VAR_NAME and vault.path references. Redacted in API responses.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.client_id","typeLabel":"string"},"client_secret":{"type":"string","description":"Secret for the exchange application; omit for public clients. Ignored\nwhen use_idp_credentials is true. Supports env.VAR_NAME and\nvault.path references. Redacted in API responses.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.client_secret","typeLabel":"string"},"scopes":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.scopes.items.[INDEX]","typeLabel":"string"},"description":"Optional scopes to request on the exchanged token. Include\n\"offline_access\" (where the identity provider supports it) so the\nretained admin discovery credential gets a refresh token and stays\nself-renewing.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.scopes","typeLabel":"string[]"},"authorization_server_url":{"type":"string","description":"Overrides the Authorization Server the exchange request is sent to.\nOnly needed when the audience is registered on a different\nAuthorization Server than the one used for SSO login (e.g. Okta's\nper-resource Custom Authorization Servers). Leave unset to use the\ndeployment's SSO login issuer, which is correct for providers with a\nsingle tenant-wide token endpoint (Entra, Auth0).\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange.authorization_server_url","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.token_exchange","typeLabel":"object"},"disabled":{"type":"boolean","default":false,"description":"Whether the client is intentionally disabled.\nWhen true, the client has no active connection or workers and its tools are not available for inference.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.disabled","typeLabel":"boolean"},"require_public_target":{"type":"boolean","readOnly":true,"default":false,"description":"Server-set. True when the client was registered over the management API\nwith no admin credential check (dashboard auth unconfigured). Every\nconnection to the MCP server (initial, reconnect, per-call) must then\nresolve to a public address. Ignored in create/update request bodies\nand never cleared once set.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config.require_public_target","typeLabel":"boolean"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.config","typeLabel":"object"},"tools":{"type":"array","items":{"type":"object","description":"Tool function definition","properties":{"name":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.tools.items.[INDEX].name","typeLabel":"string"},"description":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.tools.items.[INDEX].description","typeLabel":"string"},"parameters":{"type":"object","additionalProperties":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.tools.items.[INDEX].parameters","typeLabel":"object"},"strict":{"type":"boolean","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.tools.items.[INDEX].strict","typeLabel":"boolean"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.tools.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.tools","typeLabel":"object[]"},"state":{"type":"string","enum":["healthy","unstable","error","pending_verification","needs_reauth","disabled","degraded"],"description":"Connection state of an MCP client:\n- healthy: Bifrost's own periodic connection check (ping/list_tools for\n sticky clients, list_tools for per-call clients) most recently\n succeeded.\n- unstable: The periodic connection check most recently failed with a\n transient-classified error. Purely informational — unlike\n needs_reauth, this never gates execution; tool calls are still\n attempted normally. Self-heals to healthy on the next successful\n check, no human action required.\n- error: A data-consistency fallback used only when a client is\n registered in the config store but missing from the runtime manager\n entirely — a deeper anomaly than anything in the normal\n connect/health-check lifecycle, which never assigns this value itself.\n- pending_verification: Declared (typically via config.json) but the one-time\n admin verification has not been completed yet. Complete it via\n POST /api/mcp/client/{id}/initiate-verification (auth_type oauth /\n per_user_oauth) or POST /api/mcp/client/{id}/verify-headers\n (auth_type per_user_headers).\n- needs_reauth: Setup completed at least once, but a credential an admin is\n responsible for has permanently died and needs a human to repair it.\n For shared OAuth clients the connection credential itself was\n rejected/expired with no silent recovery; the state is sticky (the health\n monitor will not clobber it) until an admin runs\n POST /api/mcp/client/{id}/reauthorize. For per-user clients this is a\n response-only projection — computed at list-time, never stored in the\n runtime manager — meaning the retained admin discovery credential\n needs repair; end-user credentials and tool calls keep working, only\n periodic tool-list refresh pauses. Overlays onto both healthy and\n unstable runtime readings, never onto disabled or\n pending_verification. Repair via reauthorize (per_user_oauth),\n verify-headers with fresh sample values (per_user_headers), or\n verify-exchange (token_exchange, which re-exchanges the signed-in\n admin's own identity token — no sample values to supply).\n- disabled: Client has been intentionally disabled; no connection or workers are active\n- degraded: A read-time cluster aggregate, never a single node's own\n local state — multiple instances of a distributed deployment each\n currently hold a different self-reported state for the same client.\n Only meaningful for states that can genuinely vary per instance\n (healthy, unstable, pending_verification); needs_reauth/disabled are\n config-sourced facts expected to already agree everywhere. Never\n appears in a single-instance deployment.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.state","typeLabel":"enum\u003cstring>"},"last_failure":{"type":"object","description":"The latest failure recorded by the instance serving the request for its\nown connection handling of this client: which step failed, the error it\nfailed with, when that last happened, and when the current run of\nfailures began. Present only after that instance has attempted a connect\nor check that failed. Absent while `healthy`, cleared the moment a check\npasses, and absent when a state changed without such an attempt, for\nexample `needs_reauth` projected from a credential row that died before\nthe next scheduled check ran. Describes only Bifrost's own connection\nchecks and connect attempts, never the outcome of real tool calls made\nthrough the client.\n","required":["stage","message","at","since"],"properties":{"stage":{"type":"string","enum":["connect","ping","list_tools","tool_discovery","transport_lost","credential"],"description":"The step that failed:\n- connect: establishing the shared connection (dial, initialize,\n connect gate, or the initial list_tools a new connection must pass)\n- ping: the periodic check's ping over an existing sticky connection\n- list_tools: the periodic check's list_tools over an existing sticky\n connection\n- tool_discovery: the periodic check's ephemeral connect-discover-close\n cycle for per-call auth types\n- transport_lost: a live SSE connection dropped outside any check\n- credential: a credential the connection depends on was rejected\n upstream or rotated by an admin\n","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.last_failure.stage","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The error the step failed with, whitespace-collapsed and capped at 512 characters.","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.last_failure.message","typeLabel":"string"},"at":{"type":"string","format":"date-time","description":"The most recent failed attempt. While a client is unstable the check\nretries every 10 seconds, so this keeps moving for as long as the\noutage lasts.\n","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.last_failure.at","typeLabel":"string\u003cdate-time>"},"since":{"type":"string","format":"date-time","description":"The first failed attempt of the current unhealthy run.","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.last_failure.since","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.last_failure","typeLabel":"object"},"node_states":{"type":"object","additionalProperties":{"type":"object","description":"One instance's own view of an MCP client in a distributed deployment.","required":["state"],"properties":{"state":{"type":"string","enum":["healthy","unstable","error","pending_verification","needs_reauth","disabled"],"description":"That instance's own self-reported connection state. Never `degraded`,\nwhich only ever exists as the aggregate above this map.\n","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties.state","typeLabel":"enum\u003cstring>"},"last_failure":{"type":"object","description":"The latest failure recorded by the instance serving the request for its\nown connection handling of this client: which step failed, the error it\nfailed with, when that last happened, and when the current run of\nfailures began. Present only after that instance has attempted a connect\nor check that failed. Absent while `healthy`, cleared the moment a check\npasses, and absent when a state changed without such an attempt, for\nexample `needs_reauth` projected from a credential row that died before\nthe next scheduled check ran. Describes only Bifrost's own connection\nchecks and connect attempts, never the outcome of real tool calls made\nthrough the client.\n","required":["stage","message","at","since"],"properties":{"stage":{"type":"string","enum":["connect","ping","list_tools","tool_discovery","transport_lost","credential"],"description":"The step that failed:\n- connect: establishing the shared connection (dial, initialize,\n connect gate, or the initial list_tools a new connection must pass)\n- ping: the periodic check's ping over an existing sticky connection\n- list_tools: the periodic check's list_tools over an existing sticky\n connection\n- tool_discovery: the periodic check's ephemeral connect-discover-close\n cycle for per-call auth types\n- transport_lost: a live SSE connection dropped outside any check\n- credential: a credential the connection depends on was rejected\n upstream or rotated by an admin\n","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties.last_failure.stage","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The error the step failed with, whitespace-collapsed and capped at 512 characters.","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties.last_failure.message","typeLabel":"string"},"at":{"type":"string","format":"date-time","description":"The most recent failed attempt. While a client is unstable the check\nretries every 10 seconds, so this keeps moving for as long as the\noutage lasts.\n","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties.last_failure.at","typeLabel":"string\u003cdate-time>"},"since":{"type":"string","format":"date-time","description":"The first failed attempt of the current unhealthy run.","isRequired":true,"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties.last_failure.since","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties.last_failure","typeLabel":"object"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states.additionalProperties","typeLabel":"object"},"description":"Per-instance breakdown behind `state` in a distributed deployment:\ninstance ID -> that instance's own self-reported state and\nlast_failure. Present when instances disagree (`state` is then\n`degraded`) and when they all agree on `unstable`, so each instance's\nown reason is visible. Never present in a single-instance deployment.\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.node_states","typeLabel":"object"},"vk_configs":{"type":"array","items":{"type":"object","description":"Per-virtual-key tool access configuration as returned in list/get responses","properties":{"virtual_key_id":{"type":"string","description":"ID of the virtual key","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.vk_configs.items.[INDEX].virtual_key_id","typeLabel":"string"},"virtual_key_name":{"type":"string","description":"Display name of the virtual key","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.vk_configs.items.[INDEX].virtual_key_name","typeLabel":"string"},"tools_to_execute":{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.vk_configs.items.[INDEX].tools_to_execute.items.[INDEX]","typeLabel":"string"},"description":"Tools this virtual key is allowed to call on this MCP client.\n[\"*\"] => all tools allowed\n[\"tool1\", \"tool2\"] => only the specified tools\n","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.vk_configs.items.[INDEX].tools_to_execute","typeLabel":"string[]"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.vk_configs.items.[INDEX]","typeLabel":"object"},"description":"Virtual key assignments for this MCP client","uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client.vk_configs","typeLabel":"object[]"}},"uniqueKey":"project.mcp_configs.items.[INDEX].mcp_client","typeLabel":"object"},"tools_to_execute":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"project.mcp_configs.items.[INDEX].tools_to_execute.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"`[\"*\"]` allows every tool the client exposes, including ones added later. An empty list allows none. A list may not mix `*` with named entries.","uniqueKey":"project.mcp_configs.items.[INDEX].tools_to_execute.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"`[\"*\"]` allows every tool the client exposes, including ones added later. An empty list allows none. A list may not mix `*` with named entries.","uniqueKey":"project.mcp_configs.items.[INDEX].tools_to_execute.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.mcp_configs.items.[INDEX].tools_to_execute","typeLabel":"string[] | null"}},"uniqueKey":"project.mcp_configs.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.mcp_configs","typeLabel":"object[]"},"virtual_mcps":{"type":"array","items":{"oneOf":[{"type":"object","description":"A Virtual MCP assigned to the project. A scoped request can reach each one at its `/mcp/\u003cslug>` endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.","required":["virtual_mcp_name"],"properties":{"virtual_mcp_name":{"type":"string","description":"Name of the Virtual MCP. Resolved to the stored Virtual MCP on save; a name that matches none is refused.","isRequired":true,"uniqueKey":"project.virtual_mcps.items.[INDEX].oneOf.0.virtual_mcp_name","typeLabel":"string"},"virtual_mcp_id":{"type":"integer","minimum":1,"description":"Virtual MCP ID, as an alternative to virtual_mcp_name. Wins when both are set.","uniqueKey":"project.virtual_mcps.items.[INDEX].oneOf.0.virtual_mcp_id","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"project.virtual_mcps.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A Virtual MCP assigned to the project. A scoped request can reach each one at its `/mcp/\u003cslug>` endpoint. Assignments are a set, so a repeat collapses rather than doubling, and the list is replaced wholesale on update rather than diffed.","required":["virtual_mcp_id"],"properties":{"virtual_mcp_id":{"type":"integer","minimum":1,"description":"Virtual MCP ID, as an alternative to virtual_mcp_name. Wins when both are set.","isRequired":true,"uniqueKey":"project.virtual_mcps.items.[INDEX].oneOf.1.virtual_mcp_id","typeLabel":"integer"},"virtual_mcp_name":{"type":"string","description":"Name of the Virtual MCP. Resolved to the stored Virtual MCP on save; a name that matches none is refused.","uniqueKey":"project.virtual_mcps.items.[INDEX].oneOf.1.virtual_mcp_name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"project.virtual_mcps.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"project.virtual_mcps.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.virtual_mcps","typeLabel":"object[]"},"members":{"type":"array","readOnly":true,"items":{"type":"object","description":"A user on a project's roster. Members are users, never keys or teams: a key authenticates a request, and the user behind it is who belongs to a project.","required":["user_id"],"properties":{"user_id":{"type":"string","description":"Immutable after creation. Changing it is a remove and an add.","isRequired":true,"uniqueKey":"project.members.items.[INDEX].user_id","typeLabel":"string"},"id":{"type":"string","readOnly":true,"description":"The membership row id, which is the `{member_id}` of the member routes.","uniqueKey":"project.members.items.[INDEX].id","typeLabel":"string"},"budget_shares":{"type":"array","items":{"type":"object","description":"One member's cap on a budget the project holds. The share is a second cap, not a replacement: the budget it slices still caps the whole, and whichever binds first refuses the request.","required":["source_budget_id"],"properties":{"source_budget_id":{"type":"string","description":"The budget being sliced. Must be one the project holds, at any tier.","isRequired":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].source_budget_id","typeLabel":"string"},"id":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].id","typeLabel":"string"},"project_id":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].project_id","typeLabel":"string"},"user_id":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].user_id","typeLabel":"string"},"budget_id":{"type":"string","readOnly":true,"description":"The derived governance budget that enforces the slice.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget_id","typeLabel":"string"},"share_value":{"type":"number","description":"The authored figure. A percent share must be greater than 0 and at most 100; an amount share must be greater than 0. Null on every slice derived by an equal split.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].share_value","typeLabel":"number"},"share_type":{"type":"string","enum":["percent","amount"],"description":"Whether a member's authored share is a percentage of the source cap or an absolute figure. Budget shares must state this explicitly; a rate-limit share left blank settles to `amount`.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].share_type","typeLabel":"enum\u003cstring>"},"budget":{"type":"object","description":"The derived budget row, with its own usage.","required":["max_limit","reset_duration"],"properties":{"max_limit":{"type":"number","minimum":0,"description":"Cap in dollars.","isRequired":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.max_limit","typeLabel":"number"},"reset_duration":{"type":"string","description":"Reset window as a number and a unit, for example `30s`, `5m`, `1h`, `1d`, `1w`, `1M`, `1Q`, `1Y`. Only day-or-longer windows can be calendar-aligned.","example":"1M","isRequired":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.reset_duration","typeLabel":"string"},"id":{"type":"string","description":"Omit to create. Restate to update in place. An id the project does not hold is refused.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.id","typeLabel":"string"},"reset_config":{"type":"object","description":"Window settings the reset duration cannot express. Only valid when `reset_duration` is quarterly (`1Q`).","properties":{"quarter_start_month":{"type":"integer","minimum":1,"maximum":12,"description":"First month of Q1 as 1-12. Omitted means January. Only the value modulo 3 changes the reset dates, so January, April, July and October all reset on calendar quarters.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.reset_config.quarter_start_month","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.reset_config","typeLabel":"object"},"current_usage":{"type":"number","readOnly":true,"description":"Spend recorded in the current window.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.current_usage","typeLabel":"number"},"last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.last_reset","typeLabel":"string\u003cdate-time>"},"override_amount":{"type":"number","readOnly":true,"description":"Operator top-up added to `max_limit` while active. Projects have no endpoint that sets one; the field is reported for completeness.","uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.override_amount","typeLabel":"number"},"override_mode":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.override_mode","typeLabel":"string"},"override_cycles_remaining":{"type":"integer","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.override_cycles_remaining","typeLabel":"integer"},"override_cycles_total":{"type":"integer","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.override_cycles_total","typeLabel":"integer"},"override_anchor_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.override_anchor_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].budget","typeLabel":"object"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.members.items.[INDEX].budget_shares.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.members.items.[INDEX].budget_shares","typeLabel":"object[]"},"rate_limit_shares":{"type":"array","items":{"type":"object","description":"One member's cap on a rate limit the project holds. The token and request dimensions are authored independently, so a member may hold a percentage of tokens and a flat count of requests.","required":["source_rate_limit_id"],"properties":{"source_rate_limit_id":{"type":"string","description":"The rate limit being sliced. Must be one the project holds, at any tier.","isRequired":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].source_rate_limit_id","typeLabel":"string"},"id":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].id","typeLabel":"string"},"project_id":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].project_id","typeLabel":"string"},"user_id":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].user_id","typeLabel":"string"},"rate_limit_id":{"type":"string","readOnly":true,"description":"The derived governance rate limit that enforces the slice.","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit_id","typeLabel":"string"},"token_share":{"type":"integer","description":"Authored token share. Requires the source to cap tokens. A percent share that comes to no whole tokens is refused.","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].token_share","typeLabel":"integer"},"token_share_type":{"type":"string","description":"Settles to `amount` when a token share is given without one.","enum":["percent","amount"],"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].token_share_type","typeLabel":"enum\u003cstring>"},"request_share":{"type":"integer","description":"Authored request share. Requires the source to cap requests. A percent share that comes to no whole requests is refused.","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].request_share","typeLabel":"integer"},"request_share_type":{"type":"string","description":"Settles to `amount` when a request share is given without one.","enum":["percent","amount"],"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].request_share_type","typeLabel":"enum\u003cstring>"},"rate_limit":{"type":"object","description":"The derived rate limit row, with its own counters.","properties":{"id":{"type":"string","description":"Omit to create. Restate to update in place.","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.id","typeLabel":"string"},"token_max_limit":{"type":"integer","minimum":0,"description":"Maximum tokens per window. Requires `token_reset_duration`. On a project with `split_policy: equal`, a cap below the member count is refused, since a slice is a whole number of tokens.","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.token_max_limit","typeLabel":"integer"},"token_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.token_reset_duration","typeLabel":"string"},"request_max_limit":{"type":"integer","minimum":0,"description":"Maximum requests per window. Requires `request_reset_duration`. Subject to the same lower bound under `split_policy: equal`.","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.request_max_limit","typeLabel":"integer"},"request_reset_duration":{"type":"string","example":"1h","uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.request_reset_duration","typeLabel":"string"},"token_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.token_current_usage","typeLabel":"integer"},"token_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.token_last_reset","typeLabel":"string\u003cdate-time>"},"request_current_usage":{"type":"integer","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.request_current_usage","typeLabel":"integer"},"request_last_reset":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.request_last_reset","typeLabel":"string\u003cdate-time>"},"config_hash":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.config_hash","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].rate_limit","typeLabel":"object"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.members.items.[INDEX].rate_limit_shares.items.[INDEX]","typeLabel":"object"},"uniqueKey":"project.members.items.[INDEX].rate_limit_shares","typeLabel":"object[]"},"user_name":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].user_name","typeLabel":"string"},"user_email":{"type":"string","readOnly":true,"uniqueKey":"project.members.items.[INDEX].user_email","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.members.items.[INDEX].updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project.members.items.[INDEX]","typeLabel":"object"},"description":"Narrowed to what the caller's data access permits, so two operators can read the same project and see different rosters. Managed through the member routes, never through the project body.","uniqueKey":"project.members","typeLabel":"object[]"},"created_by_user_id":{"oneOf":[{"type":"string","readOnly":true,"description":"Taken from the calling identity, never from the body.","uniqueKey":"project.created_by_user_id.oneOf.0","typeLabel":"string"},{"type":"null","readOnly":true,"description":"Taken from the calling identity, never from the body.","uniqueKey":"project.created_by_user_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"project.created_by_user_id","typeLabel":"string | null"},"created_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"uniqueKey":"project.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"project","typeLabel":"object"},"redivision_job_id":{"type":"string","description":"Present only when the edit queued a redivision, which happens on a project with `split_policy: equal` whose roster or divided caps changed. A pending job for the same project is reused rather than queued behind, so this may name a job an earlier request created. Progress is reported on the `redivision_progress` WebSocket channel under this id.","uniqueKey":"redivision_job_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"project":{"id":"\u003cstring>","name":"\u003cstring>","description":"\u003cstring>","is_active":true,"expires_at":"2023-11-07T05:31:56Z","access_rule":"intersect","membership_mode":"explicit","accounting_mode":"both","split_policy":"none","calendar_aligned":false,"allow_all_providers":false,"budgets":[{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6},"current_usage":123,"last_reset":"2023-11-07T05:31:56Z","override_amount":123,"override_mode":"\u003cstring>","override_cycles_remaining":123,"override_cycles_total":123,"override_anchor_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}],"rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h","token_current_usage":123,"token_last_reset":"2023-11-07T05:31:56Z","request_current_usage":123,"request_last_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"provider_configs":[{"provider_name":"openai","id":123,"all_models_allowed":false,"allowed_models":["\u003cstring>"],"blacklisted_models":["\u003cstring>"],"key_ids":["\u003cstring>"],"weight":123,"budgets":[{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6},"current_usage":123,"last_reset":"2023-11-07T05:31:56Z","override_amount":123,"override_mode":"\u003cstring>","override_cycles_remaining":123,"override_cycles_total":123,"override_anchor_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}],"rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h","token_current_usage":123,"token_last_reset":"2023-11-07T05:31:56Z","request_current_usage":123,"request_last_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"model_budgets":[{"model_name":"\u003cstring>","budgets":[{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6},"current_usage":123,"last_reset":"2023-11-07T05:31:56Z","override_amount":123,"override_mode":"\u003cstring>","override_cycles_remaining":123,"override_cycles_total":123,"override_anchor_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}],"rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h","token_current_usage":123,"token_last_reset":"2023-11-07T05:31:56Z","request_current_usage":123,"request_last_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}}]}],"mcp_configs":[{"id":123,"mcp_client_id":123,"mcp_client_name":"\u003cstring>","mcp_client":{"config":{"client_id":"\u003cstring>","name":"\u003cstring>","is_code_mode_client":true,"connection_type":"http","connection_string":"\u003cstring>","stdio_config":{"command":"\u003cstring>","args":["\u003cstring>"],"envs":["\u003cstring>"]},"openapi_config":{"spec":"\u003cstring>","spec_url":"\u003cstring>","base_url":"\u003cstring>","security_credentials":{},"include_deprecated":false,"max_response_bytes":1,"spec_size":123,"spec_hash":"\u003cstring>","spec_title":"\u003cstring>","openapi_version":"\u003cstring>","operation_count":123},"tls_config":{"insecure_skip_verify":true,"ca_cert_pem":"\u003cstring>"},"auth_type":"none","oauth_config_id":"\u003cstring>","headers":{},"tools_to_execute":["\u003cstring>"],"tools_to_auto_execute":["\u003cstring>"],"tool_pricing":{},"allow_on_all_virtual_keys":false,"per_user_header_keys":["\u003cstring>"],"token_exchange":{"audience":"\u003cstring>","use_idp_credentials":true,"client_id":"\u003cstring>","client_secret":"\u003cstring>","scopes":["\u003cstring>"],"authorization_server_url":"\u003cstring>"},"disabled":false,"require_public_target":false},"tools":[{"name":"\u003cstring>","description":"\u003cstring>","parameters":{},"strict":true}],"state":"healthy","last_failure":{"stage":"connect","message":"\u003cstring>","at":"2023-11-07T05:31:56Z","since":"2023-11-07T05:31:56Z"},"node_states":{},"vk_configs":[{"virtual_key_id":"\u003cstring>","virtual_key_name":"\u003cstring>","tools_to_execute":["\u003cstring>"]}]},"tools_to_execute":["\u003cstring>"]}],"virtual_mcps":[{"virtual_mcp_name":"\u003cstring>","virtual_mcp_id":2}],"members":[{"user_id":"\u003cstring>","id":"\u003cstring>","budget_shares":[{"source_budget_id":"\u003cstring>","id":"\u003cstring>","project_id":"\u003cstring>","user_id":"\u003cstring>","budget_id":"\u003cstring>","share_value":123,"share_type":"percent","budget":{"max_limit":1,"reset_duration":"1M","id":"\u003cstring>","reset_config":{"quarter_start_month":6},"current_usage":123,"last_reset":"2023-11-07T05:31:56Z","override_amount":123,"override_mode":"\u003cstring>","override_cycles_remaining":123,"override_cycles_total":123,"override_anchor_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}],"rate_limit_shares":[{"source_rate_limit_id":"\u003cstring>","id":"\u003cstring>","project_id":"\u003cstring>","user_id":"\u003cstring>","rate_limit_id":"\u003cstring>","token_share":123,"token_share_type":"percent","request_share":123,"request_share_type":"percent","rate_limit":{"id":"\u003cstring>","token_max_limit":1,"token_reset_duration":"1h","request_max_limit":1,"request_reset_duration":"1h","token_current_usage":123,"token_last_reset":"2023-11-07T05:31:56Z","request_current_usage":123,"request_last_reset":"2023-11-07T05:31:56Z","config_hash":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}],"user_name":"\u003cstring>","user_email":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"}],"created_by_user_id":"\u003cstring>","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"redivision_job_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"57cd3357-b04b-4817-a64d-154755ce0e09":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","description":"Error response from Bifrost","properties":{"event_id":{"type":"string","uniqueKey":"event_id","typeLabel":"string"},"type":{"type":"string","uniqueKey":"type","typeLabel":"string"},"is_bifrost_error":{"type":"boolean","uniqueKey":"is_bifrost_error","typeLabel":"boolean"},"status_code":{"type":"integer","uniqueKey":"status_code","typeLabel":"integer"},"error":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"error.type","typeLabel":"string"},"code":{"type":"string","uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","uniqueKey":"error.message","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"event_id":{"type":"string","uniqueKey":"error.event_id","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"},"extra_fields":{"type":"object","properties":{"routing_info":{"type":"object","description":"Which provider, model and key handled the attempt that produced this response or error, and what the caller asked for. Also sent as x-bifrost-routing-info-* response headers.","properties":{"provider":{"type":"string","description":"Provider that ran the attempt","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.routing_info.provider","typeLabel":"enum\u003cstring>"},"model":{"type":"string","description":"Model sent to that provider","uniqueKey":"extra_fields.routing_info.model","typeLabel":"string"},"key":{"type":"string","description":"Name of the stored key used, never its ID or secret","uniqueKey":"extra_fields.routing_info.key","typeLabel":"string"},"resolved_key_alias":{"type":"object","description":"Set only when the requested model matched a model alias on the key","required":["model_id"],"properties":{"model_id":{"type":"string","description":"Model ID sent to the provider","isRequired":true,"uniqueKey":"extra_fields.routing_info.resolved_key_alias.model_id","typeLabel":"string"},"model_name":{"type":"string","description":"Canonical model name, used for pricing and logs","uniqueKey":"extra_fields.routing_info.resolved_key_alias.model_name","typeLabel":"string"},"model_family":{"type":"string","description":"Resolved model family","uniqueKey":"extra_fields.routing_info.resolved_key_alias.model_family","typeLabel":"string"}},"uniqueKey":"extra_fields.routing_info.resolved_key_alias","typeLabel":"object"},"is_fallback":{"type":"boolean","description":"True when a fallback served the request or returned the error. Omitted when false.","uniqueKey":"extra_fields.routing_info.is_fallback","typeLabel":"boolean"},"primary_provider":{"type":"string","description":"The primary attempt's provider. Set only when a fallback ran.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.routing_info.primary_provider","typeLabel":"enum\u003cstring>"},"primary_model":{"type":"string","description":"The primary attempt's model. Set only when a fallback ran.","uniqueKey":"extra_fields.routing_info.primary_model","typeLabel":"string"},"requested_provider":{"type":"string","description":"Provider the caller asked for, before routing rules, load balancing or session affinity changed it. Omitted when the caller sent a bare model.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.routing_info.requested_provider","typeLabel":"enum\u003cstring>"},"requested_model":{"type":"string","description":"Model the caller asked for, before anything changed it","uniqueKey":"extra_fields.routing_info.requested_model","typeLabel":"string"},"server_side_fallback_model":{"type":"string","description":"Model that answered when Anthropic switched models inside one call","uniqueKey":"extra_fields.routing_info.server_side_fallback_model","typeLabel":"string"}},"uniqueKey":"extra_fields.routing_info","typeLabel":"object"},"provider":{"type":"string","description":"Deprecated: use routing_info.provider.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"deprecated":true,"uniqueKey":"extra_fields.provider","typeLabel":"enum\u003cstring>"},"original_model_requested":{"type":"string","deprecated":true,"description":"Deprecated: use routing_info.primary_model when routing_info.is_fallback is true, otherwise routing_info.model. For the model the caller asked for, read routing_info.requested_model.","uniqueKey":"extra_fields.original_model_requested","typeLabel":"string"},"resolved_model_used":{"type":"string","deprecated":true,"description":"Deprecated: use routing_info.resolved_key_alias.model_id when an alias matched, otherwise routing_info.model.","uniqueKey":"extra_fields.resolved_model_used","typeLabel":"string"},"request_type":{"type":"string","uniqueKey":"extra_fields.request_type","typeLabel":"string"},"mcp_request_type":{"type":"string","uniqueKey":"extra_fields.mcp_request_type","typeLabel":"string"},"a2a_request_type":{"type":"string","description":"Agent Gateway operation, for A2A errors","uniqueKey":"extra_fields.a2a_request_type","typeLabel":"string"},"a2a_agent_name":{"type":"string","uniqueKey":"extra_fields.a2a_agent_name","typeLabel":"string"},"error_type":{"type":"string","description":"Normalized, low-cardinality classification of why the request failed, declared by whichever component refused it. Prefixed by fault domain (caller_, policy_, provider_, bifrost_). Absent on failures that were not classified at source.","uniqueKey":"extra_fields.error_type","typeLabel":"string"},"retry_after_ms":{"type":"integer","format":"int64","minimum":1000,"maximum":300000,"description":"The provider's hint for how long to wait before retrying, in milliseconds, read from its retry-after-ms or Retry-After header or its google.rpc.RetryInfo error detail, and clamped to between 1000 and 300000. Absent when the provider gave no explicit hint.","uniqueKey":"extra_fields.retry_after_ms","typeLabel":"integer\u003cint64>"},"raw_request":{"description":"Raw provider request, when raw request capture is enabled","uniqueKey":"extra_fields.raw_request","typeLabel":"any"},"raw_response":{"description":"Raw provider response, when raw response capture is enabled","uniqueKey":"extra_fields.raw_response","typeLabel":"any"},"converted_request_type":{"type":"string","uniqueKey":"extra_fields.converted_request_type","typeLabel":"string"},"dropped_compat_plugin_params":{"type":"array","items":{"type":"string","uniqueKey":"extra_fields.dropped_compat_plugin_params.items.[INDEX]","typeLabel":"string"},"uniqueKey":"extra_fields.dropped_compat_plugin_params","typeLabel":"string[]"},"latency":{"type":"integer","format":"int64","description":"Latency in milliseconds","uniqueKey":"extra_fields.latency","typeLabel":"integer\u003cint64>"},"key_statuses":{"type":"array","description":"Per-key results, for requests that ran on every key such as listing models","items":{"type":"object","properties":{"key_id":{"type":"string","uniqueKey":"extra_fields.key_statuses.items.[INDEX].key_id","typeLabel":"string"},"status":{"type":"string","enum":["success","list_models_failed"],"uniqueKey":"extra_fields.key_statuses.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"provider":{"type":"string","description":"AI model provider identifier","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.key_statuses.items.[INDEX].provider","typeLabel":"enum\u003cstring>"},"error":{"oneOf":[{"$circularRef":"89762be7-13e6-4675-a9d5-56790d5e81e7"}],"uniqueKey":"extra_fields.key_statuses.items.[INDEX].error","typeLabel":"any"}},"uniqueKey":"extra_fields.key_statuses.items.[INDEX]","typeLabel":"object"},"uniqueKey":"extra_fields.key_statuses","typeLabel":"object[]"},"mcp_auth_required":{"type":"object","description":"Set when a per-user MCP tool needs the caller to complete an inline auth flow","properties":{"kind":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.kind","typeLabel":"string"},"mcp_client_id":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.mcp_client_id","typeLabel":"string"},"mcp_client_name":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.mcp_client_name","typeLabel":"string"},"message":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.message","typeLabel":"string"},"authorize_url":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.authorize_url","typeLabel":"string"},"session_id":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.session_id","typeLabel":"string"}},"uniqueKey":"extra_fields.mcp_auth_required","typeLabel":"object"},"billed_usage":{"type":"object","description":"Usage the provider reported and billed even though the request failed","properties":{"prompt_tokens":{"type":"integer","description":"Total input tokens including any prompt-cache tokens (read + write). Subtract prompt_tokens_details.cached_read_tokens and prompt_tokens_details.cached_write_tokens to get the non-cached portion.\n","uniqueKey":"extra_fields.billed_usage.prompt_tokens","typeLabel":"integer"},"prompt_tokens_details":{"type":"object","properties":{"text_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.text_tokens","typeLabel":"integer"},"audio_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.audio_tokens","typeLabel":"integer"},"image_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.image_tokens","typeLabel":"integer"},"cached_read_tokens":{"type":"integer","description":"Tokens served from the prompt cache (cache hit). These tokens are already included in prompt_tokens and are billed at the reduced cache-read rate. Populated for all providers that support prompt caching (Anthropic, Bedrock, OpenAI, Gemini, xAI, etc.).\n","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.cached_read_tokens","typeLabel":"integer"},"cached_write_tokens":{"type":"integer","description":"Tokens written to the prompt cache on this request (cache creation / write). These tokens are already included in prompt_tokens and are billed at the cache-creation rate. Populated for providers that separately report cache write tokens (Anthropic, Bedrock).\n","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.cached_write_tokens","typeLabel":"integer"}},"uniqueKey":"extra_fields.billed_usage.prompt_tokens_details","typeLabel":"object"},"completion_tokens":{"type":"integer","description":"Number of output/completion tokens generated.","uniqueKey":"extra_fields.billed_usage.completion_tokens","typeLabel":"integer"},"completion_tokens_details":{"type":"object","properties":{"text_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.text_tokens","typeLabel":"integer"},"accepted_prediction_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.accepted_prediction_tokens","typeLabel":"integer"},"audio_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.audio_tokens","typeLabel":"integer"},"citation_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.citation_tokens","typeLabel":"integer"},"num_search_queries":{"type":"integer","deprecated":true,"description":"Deprecated, use tool_usage.web_search.num_requests. Will be removed in 3.0.0.","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.num_search_queries","typeLabel":"integer"},"reasoning_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.reasoning_tokens","typeLabel":"integer"},"image_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.image_tokens","typeLabel":"integer"},"rejected_prediction_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.rejected_prediction_tokens","typeLabel":"integer"}},"uniqueKey":"extra_fields.billed_usage.completion_tokens_details","typeLabel":"object"},"total_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.total_tokens","typeLabel":"integer"},"tool_usage":{"type":"object","description":"Counts of provider-hosted (server-side) tool calls billed per call.\n","properties":{"web_search":{"type":"object","properties":{"num_requests":{"type":"integer","description":"Number of billable web search calls.","uniqueKey":"extra_fields.billed_usage.tool_usage.web_search.num_requests","typeLabel":"integer"}},"uniqueKey":"extra_fields.billed_usage.tool_usage.web_search","typeLabel":"object"}},"uniqueKey":"extra_fields.billed_usage.tool_usage","typeLabel":"object"},"cost":{"type":"object","description":"Cost breakdown for the request","properties":{"input_tokens_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.input_tokens_cost","typeLabel":"number"},"output_tokens_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.output_tokens_cost","typeLabel":"number"},"reasoning_tokens_cost":{"type":"number","description":"Cost for reasoning/thinking tokens (reasoning models)","uniqueKey":"extra_fields.billed_usage.cost.reasoning_tokens_cost","typeLabel":"number"},"citation_tokens_cost":{"type":"number","description":"Cost for citation tokens","uniqueKey":"extra_fields.billed_usage.cost.citation_tokens_cost","typeLabel":"number"},"search_queries_cost":{"type":"number","description":"Cost for web search queries","uniqueKey":"extra_fields.billed_usage.cost.search_queries_cost","typeLabel":"number"},"request_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.request_cost","typeLabel":"number"},"total_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.total_cost","typeLabel":"number"}},"uniqueKey":"extra_fields.billed_usage.cost","typeLabel":"object"}},"uniqueKey":"extra_fields.billed_usage","typeLabel":"object"}},"uniqueKey":"extra_fields","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"event_id":"\u003cstring>","type":"\u003cstring>","is_bifrost_error":true,"status_code":123,"error":{"type":"\u003cstring>","code":"\u003cstring>","message":"\u003cstring>","param":"\u003cstring>","event_id":"\u003cstring>"},"extra_fields":{"routing_info":{"provider":"anthropic","model":"\u003cstring>","key":"\u003cstring>","resolved_key_alias":{"model_id":"\u003cstring>","model_name":"\u003cstring>","model_family":"\u003cstring>"},"is_fallback":true,"primary_provider":"anthropic","primary_model":"\u003cstring>","requested_provider":"anthropic","requested_model":"\u003cstring>","server_side_fallback_model":"\u003cstring>"},"provider":"anthropic","original_model_requested":"\u003cstring>","resolved_model_used":"\u003cstring>","request_type":"\u003cstring>","mcp_request_type":"\u003cstring>","a2a_request_type":"\u003cstring>","a2a_agent_name":"\u003cstring>","error_type":"\u003cstring>","retry_after_ms":150500,"raw_request":"\u003cunknown>","raw_response":"\u003cunknown>","converted_request_type":"\u003cstring>","dropped_compat_plugin_params":["\u003cstring>"],"latency":123,"key_statuses":[{"key_id":"\u003cstring>","status":"success","provider":"anthropic","error":"\u003cunknown>"}],"mcp_auth_required":{"kind":"\u003cstring>","mcp_client_id":"\u003cstring>","mcp_client_name":"\u003cstring>","message":"\u003cstring>","authorize_url":"\u003cstring>","session_id":"\u003cstring>"},"billed_usage":{"prompt_tokens":123,"prompt_tokens_details":{"text_tokens":123,"audio_tokens":123,"image_tokens":123,"cached_read_tokens":123,"cached_write_tokens":123},"completion_tokens":123,"completion_tokens_details":{"text_tokens":123,"accepted_prediction_tokens":123,"audio_tokens":123,"citation_tokens":123,"num_search_queries":123,"reasoning_tokens":123,"image_tokens":123,"rejected_prediction_tokens":123},"total_tokens":123,"tool_usage":{"web_search":{"num_requests":123}},"cost":{"input_tokens_cost":123,"output_tokens_cost":123,"reasoning_tokens_cost":123,"citation_tokens_cost":123,"search_queries_cost":123,"request_cost":123,"total_cost":123}}}}}},"exampleType":"generated"}},"exampleType":"generated"},"6e5c4004-a219-4da7-81ba-15b165f9446b":{"description":"Project not found","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"2ca24964-b3b9-476a-b0af-3285980e0703":{"description":"A project with the same name already exists.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"73dc1369-cbbc-4428-a1dc-2215995ee356":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","description":"Error response from Bifrost","properties":{"event_id":{"type":"string","uniqueKey":"event_id","typeLabel":"string"},"type":{"type":"string","uniqueKey":"type","typeLabel":"string"},"is_bifrost_error":{"type":"boolean","uniqueKey":"is_bifrost_error","typeLabel":"boolean"},"status_code":{"type":"integer","uniqueKey":"status_code","typeLabel":"integer"},"error":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"error.type","typeLabel":"string"},"code":{"type":"string","uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","uniqueKey":"error.message","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"event_id":{"type":"string","uniqueKey":"error.event_id","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"},"extra_fields":{"type":"object","properties":{"routing_info":{"type":"object","description":"Which provider, model and key handled the attempt that produced this response or error, and what the caller asked for. Also sent as x-bifrost-routing-info-* response headers.","properties":{"provider":{"type":"string","description":"Provider that ran the attempt","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.routing_info.provider","typeLabel":"enum\u003cstring>"},"model":{"type":"string","description":"Model sent to that provider","uniqueKey":"extra_fields.routing_info.model","typeLabel":"string"},"key":{"type":"string","description":"Name of the stored key used, never its ID or secret","uniqueKey":"extra_fields.routing_info.key","typeLabel":"string"},"resolved_key_alias":{"type":"object","description":"Set only when the requested model matched a model alias on the key","required":["model_id"],"properties":{"model_id":{"type":"string","description":"Model ID sent to the provider","isRequired":true,"uniqueKey":"extra_fields.routing_info.resolved_key_alias.model_id","typeLabel":"string"},"model_name":{"type":"string","description":"Canonical model name, used for pricing and logs","uniqueKey":"extra_fields.routing_info.resolved_key_alias.model_name","typeLabel":"string"},"model_family":{"type":"string","description":"Resolved model family","uniqueKey":"extra_fields.routing_info.resolved_key_alias.model_family","typeLabel":"string"}},"uniqueKey":"extra_fields.routing_info.resolved_key_alias","typeLabel":"object"},"is_fallback":{"type":"boolean","description":"True when a fallback served the request or returned the error. Omitted when false.","uniqueKey":"extra_fields.routing_info.is_fallback","typeLabel":"boolean"},"primary_provider":{"type":"string","description":"The primary attempt's provider. Set only when a fallback ran.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.routing_info.primary_provider","typeLabel":"enum\u003cstring>"},"primary_model":{"type":"string","description":"The primary attempt's model. Set only when a fallback ran.","uniqueKey":"extra_fields.routing_info.primary_model","typeLabel":"string"},"requested_provider":{"type":"string","description":"Provider the caller asked for, before routing rules, load balancing or session affinity changed it. Omitted when the caller sent a bare model.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.routing_info.requested_provider","typeLabel":"enum\u003cstring>"},"requested_model":{"type":"string","description":"Model the caller asked for, before anything changed it","uniqueKey":"extra_fields.routing_info.requested_model","typeLabel":"string"},"server_side_fallback_model":{"type":"string","description":"Model that answered when Anthropic switched models inside one call","uniqueKey":"extra_fields.routing_info.server_side_fallback_model","typeLabel":"string"}},"uniqueKey":"extra_fields.routing_info","typeLabel":"object"},"provider":{"type":"string","description":"Deprecated: use routing_info.provider.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"deprecated":true,"uniqueKey":"extra_fields.provider","typeLabel":"enum\u003cstring>"},"original_model_requested":{"type":"string","deprecated":true,"description":"Deprecated: use routing_info.primary_model when routing_info.is_fallback is true, otherwise routing_info.model. For the model the caller asked for, read routing_info.requested_model.","uniqueKey":"extra_fields.original_model_requested","typeLabel":"string"},"resolved_model_used":{"type":"string","deprecated":true,"description":"Deprecated: use routing_info.resolved_key_alias.model_id when an alias matched, otherwise routing_info.model.","uniqueKey":"extra_fields.resolved_model_used","typeLabel":"string"},"request_type":{"type":"string","uniqueKey":"extra_fields.request_type","typeLabel":"string"},"mcp_request_type":{"type":"string","uniqueKey":"extra_fields.mcp_request_type","typeLabel":"string"},"a2a_request_type":{"type":"string","description":"Agent Gateway operation, for A2A errors","uniqueKey":"extra_fields.a2a_request_type","typeLabel":"string"},"a2a_agent_name":{"type":"string","uniqueKey":"extra_fields.a2a_agent_name","typeLabel":"string"},"error_type":{"type":"string","description":"Normalized, low-cardinality classification of why the request failed, declared by whichever component refused it. Prefixed by fault domain (caller_, policy_, provider_, bifrost_). Absent on failures that were not classified at source.","uniqueKey":"extra_fields.error_type","typeLabel":"string"},"retry_after_ms":{"type":"integer","format":"int64","minimum":1000,"maximum":300000,"description":"The provider's hint for how long to wait before retrying, in milliseconds, read from its retry-after-ms or Retry-After header or its google.rpc.RetryInfo error detail, and clamped to between 1000 and 300000. Absent when the provider gave no explicit hint.","uniqueKey":"extra_fields.retry_after_ms","typeLabel":"integer\u003cint64>"},"raw_request":{"description":"Raw provider request, when raw request capture is enabled","uniqueKey":"extra_fields.raw_request","typeLabel":"any"},"raw_response":{"description":"Raw provider response, when raw response capture is enabled","uniqueKey":"extra_fields.raw_response","typeLabel":"any"},"converted_request_type":{"type":"string","uniqueKey":"extra_fields.converted_request_type","typeLabel":"string"},"dropped_compat_plugin_params":{"type":"array","items":{"type":"string","uniqueKey":"extra_fields.dropped_compat_plugin_params.items.[INDEX]","typeLabel":"string"},"uniqueKey":"extra_fields.dropped_compat_plugin_params","typeLabel":"string[]"},"latency":{"type":"integer","format":"int64","description":"Latency in milliseconds","uniqueKey":"extra_fields.latency","typeLabel":"integer\u003cint64>"},"key_statuses":{"type":"array","description":"Per-key results, for requests that ran on every key such as listing models","items":{"type":"object","properties":{"key_id":{"type":"string","uniqueKey":"extra_fields.key_statuses.items.[INDEX].key_id","typeLabel":"string"},"status":{"type":"string","enum":["success","list_models_failed"],"uniqueKey":"extra_fields.key_statuses.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"provider":{"type":"string","description":"AI model provider identifier","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"uniqueKey":"extra_fields.key_statuses.items.[INDEX].provider","typeLabel":"enum\u003cstring>"},"error":{"oneOf":[{"$circularRef":"89762be7-13e6-4675-a9d5-56790d5e81e7"}],"uniqueKey":"extra_fields.key_statuses.items.[INDEX].error","typeLabel":"any"}},"uniqueKey":"extra_fields.key_statuses.items.[INDEX]","typeLabel":"object"},"uniqueKey":"extra_fields.key_statuses","typeLabel":"object[]"},"mcp_auth_required":{"type":"object","description":"Set when a per-user MCP tool needs the caller to complete an inline auth flow","properties":{"kind":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.kind","typeLabel":"string"},"mcp_client_id":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.mcp_client_id","typeLabel":"string"},"mcp_client_name":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.mcp_client_name","typeLabel":"string"},"message":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.message","typeLabel":"string"},"authorize_url":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.authorize_url","typeLabel":"string"},"session_id":{"type":"string","uniqueKey":"extra_fields.mcp_auth_required.session_id","typeLabel":"string"}},"uniqueKey":"extra_fields.mcp_auth_required","typeLabel":"object"},"billed_usage":{"type":"object","description":"Usage the provider reported and billed even though the request failed","properties":{"prompt_tokens":{"type":"integer","description":"Total input tokens including any prompt-cache tokens (read + write). Subtract prompt_tokens_details.cached_read_tokens and prompt_tokens_details.cached_write_tokens to get the non-cached portion.\n","uniqueKey":"extra_fields.billed_usage.prompt_tokens","typeLabel":"integer"},"prompt_tokens_details":{"type":"object","properties":{"text_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.text_tokens","typeLabel":"integer"},"audio_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.audio_tokens","typeLabel":"integer"},"image_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.image_tokens","typeLabel":"integer"},"cached_read_tokens":{"type":"integer","description":"Tokens served from the prompt cache (cache hit). These tokens are already included in prompt_tokens and are billed at the reduced cache-read rate. Populated for all providers that support prompt caching (Anthropic, Bedrock, OpenAI, Gemini, xAI, etc.).\n","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.cached_read_tokens","typeLabel":"integer"},"cached_write_tokens":{"type":"integer","description":"Tokens written to the prompt cache on this request (cache creation / write). These tokens are already included in prompt_tokens and are billed at the cache-creation rate. Populated for providers that separately report cache write tokens (Anthropic, Bedrock).\n","uniqueKey":"extra_fields.billed_usage.prompt_tokens_details.cached_write_tokens","typeLabel":"integer"}},"uniqueKey":"extra_fields.billed_usage.prompt_tokens_details","typeLabel":"object"},"completion_tokens":{"type":"integer","description":"Number of output/completion tokens generated.","uniqueKey":"extra_fields.billed_usage.completion_tokens","typeLabel":"integer"},"completion_tokens_details":{"type":"object","properties":{"text_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.text_tokens","typeLabel":"integer"},"accepted_prediction_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.accepted_prediction_tokens","typeLabel":"integer"},"audio_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.audio_tokens","typeLabel":"integer"},"citation_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.citation_tokens","typeLabel":"integer"},"num_search_queries":{"type":"integer","deprecated":true,"description":"Deprecated, use tool_usage.web_search.num_requests. Will be removed in 3.0.0.","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.num_search_queries","typeLabel":"integer"},"reasoning_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.reasoning_tokens","typeLabel":"integer"},"image_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.image_tokens","typeLabel":"integer"},"rejected_prediction_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.completion_tokens_details.rejected_prediction_tokens","typeLabel":"integer"}},"uniqueKey":"extra_fields.billed_usage.completion_tokens_details","typeLabel":"object"},"total_tokens":{"type":"integer","uniqueKey":"extra_fields.billed_usage.total_tokens","typeLabel":"integer"},"tool_usage":{"type":"object","description":"Counts of provider-hosted (server-side) tool calls billed per call.\n","properties":{"web_search":{"type":"object","properties":{"num_requests":{"type":"integer","description":"Number of billable web search calls.","uniqueKey":"extra_fields.billed_usage.tool_usage.web_search.num_requests","typeLabel":"integer"}},"uniqueKey":"extra_fields.billed_usage.tool_usage.web_search","typeLabel":"object"}},"uniqueKey":"extra_fields.billed_usage.tool_usage","typeLabel":"object"},"cost":{"type":"object","description":"Cost breakdown for the request","properties":{"input_tokens_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.input_tokens_cost","typeLabel":"number"},"output_tokens_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.output_tokens_cost","typeLabel":"number"},"reasoning_tokens_cost":{"type":"number","description":"Cost for reasoning/thinking tokens (reasoning models)","uniqueKey":"extra_fields.billed_usage.cost.reasoning_tokens_cost","typeLabel":"number"},"citation_tokens_cost":{"type":"number","description":"Cost for citation tokens","uniqueKey":"extra_fields.billed_usage.cost.citation_tokens_cost","typeLabel":"number"},"search_queries_cost":{"type":"number","description":"Cost for web search queries","uniqueKey":"extra_fields.billed_usage.cost.search_queries_cost","typeLabel":"number"},"request_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.request_cost","typeLabel":"number"},"total_cost":{"type":"number","uniqueKey":"extra_fields.billed_usage.cost.total_cost","typeLabel":"number"}},"uniqueKey":"extra_fields.billed_usage.cost","typeLabel":"object"}},"uniqueKey":"extra_fields.billed_usage","typeLabel":"object"}},"uniqueKey":"extra_fields","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"event_id":"\u003cstring>","type":"\u003cstring>","is_bifrost_error":true,"status_code":123,"error":{"type":"\u003cstring>","code":"\u003cstring>","message":"\u003cstring>","param":"\u003cstring>","event_id":"\u003cstring>"},"extra_fields":{"routing_info":{"provider":"anthropic","model":"\u003cstring>","key":"\u003cstring>","resolved_key_alias":{"model_id":"\u003cstring>","model_name":"\u003cstring>","model_family":"\u003cstring>"},"is_fallback":true,"primary_provider":"anthropic","primary_model":"\u003cstring>","requested_provider":"anthropic","requested_model":"\u003cstring>","server_side_fallback_model":"\u003cstring>"},"provider":"anthropic","original_model_requested":"\u003cstring>","resolved_model_used":"\u003cstring>","request_type":"\u003cstring>","mcp_request_type":"\u003cstring>","a2a_request_type":"\u003cstring>","a2a_agent_name":"\u003cstring>","error_type":"\u003cstring>","retry_after_ms":150500,"raw_request":"\u003cunknown>","raw_response":"\u003cunknown>","converted_request_type":"\u003cstring>","dropped_compat_plugin_params":["\u003cstring>"],"latency":123,"key_statuses":[{"key_id":"\u003cstring>","status":"success","provider":"anthropic","error":"\u003cunknown>"}],"mcp_auth_required":{"kind":"\u003cstring>","mcp_client_id":"\u003cstring>","mcp_client_name":"\u003cstring>","message":"\u003cstring>","authorize_url":"\u003cstring>","session_id":"\u003cstring>"},"billed_usage":{"prompt_tokens":123,"prompt_tokens_details":{"text_tokens":123,"audio_tokens":123,"image_tokens":123,"cached_read_tokens":123,"cached_write_tokens":123},"completion_tokens":123,"completion_tokens_details":{"text_tokens":123,"accepted_prediction_tokens":123,"audio_tokens":123,"citation_tokens":123,"num_search_queries":123,"reasoning_tokens":123,"image_tokens":123,"rejected_prediction_tokens":123},"total_tokens":123,"tool_usage":{"web_search":{"num_requests":123}},"cost":{"input_tokens_cost":123,"output_tokens_cost":123,"reasoning_tokens_cost":123,"citation_tokens_cost":123,"search_queries_cost":123,"request_cost":123,"total_cost":123}}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"e8403418-83fa-48ff-8ea2-21f6b009674e":{"ManagementBearerAuth":{"type":"http","scheme":"bearer","description":"Management API authentication for `/api/*` endpoints. Use the `Authorization` header\nwith `Bearer \u003ctoken>`, where `\u003ctoken>` is one of:\n\n- a Bifrost management API key,\n- a dashboard session token issued by `POST /api/session/login`,\n- base64 of `\u003cadmin-username>:\u003cadmin-password>` (legacy equivalent of `BasicAuth`).\n\nVirtual keys (`sk-bf-*`) and the `x-api-key` header are not accepted on management APIs -\nthe sole exception is `GET /api/governance/virtual-keys/quota`, which is virtual-key-only.\n\nAuthentication alone is not sufficient in Bifrost Enterprise: each operation page shows a\n**Required Permissions** table (`Resource:Operation`, for example `Dashboard:View`) above\nits Authorizations section, and the caller's RBAC role or management API key scopes must\ninclude what it lists, otherwise the request is rejected with `403 Forbidden`.\n\nA local admin — authenticated with the admin password, or any caller on a deployment with\ndashboard auth disabled — bypasses these checks and can call every management endpoint.\n\n**OSS setup lock.** On Bifrost OSS, while dashboard auth is not active (no admin account,\nor auth disabled), every management endpoint except the public ones (`/health`,\n`/api/version`, `/api/session/is-auth-enabled`, `/api/session/login`, ...) requires the\noperator's setup token in the `X-Bifrost-Setup-Token` header, in place of `Authorization`.\nThe token is set with `setup_token` in `config.json` or the `BIFROST_SETUP_TOKEN`\nenvironment variable. A missing header returns `401`, a wrong token `403`. The header\nstops working once dashboard auth is enabled. The dashboard instead trades the token once\nfor an HttpOnly `bifrost_setup_session` cookie via `POST /api/session/setup`.\nSee [Required permissions](/api/procuring-api-keys#required-permissions) for how\npermissions are derived and which endpoints are exempt.\n","scopes":[],"schemeName":"ManagementBearerAuth"}}},"servers":{"cba0508a-601f-431b-88e6-d1ec1ec830f3":{"url":"{baseUrl}","description":"Your Bifrost instance","variables":{"baseUrl":{"default":"http://localhost:8080","description":"Base URL of your Bifrost instance (e.g. https://bifrost.mycompany.com)"}}}},"schemas":{"89762be7-13e6-4675-a9d5-56790d5e81e7":{"type":"object","description":"Error response from Bifrost","properties":{"event_id":{"type":"string"},"type":{"type":"string"},"is_bifrost_error":{"type":"boolean"},"status_code":{"type":"integer"},"error":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"event_id":{"type":"string"}}},"extra_fields":{"type":"object","properties":{"routing_info":{"type":"object","description":"Which provider, model and key handled the attempt that produced this response or error, and what the caller asked for. Also sent as x-bifrost-routing-info-* response headers.","properties":{"provider":{"type":"string","description":"Provider that ran the attempt","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"]},"model":{"type":"string","description":"Model sent to that provider"},"key":{"type":"string","description":"Name of the stored key used, never its ID or secret"},"resolved_key_alias":{"type":"object","description":"Set only when the requested model matched a model alias on the key","required":["model_id"],"properties":{"model_id":{"type":"string","description":"Model ID sent to the provider","isRequired":true},"model_name":{"type":"string","description":"Canonical model name, used for pricing and logs"},"model_family":{"type":"string","description":"Resolved model family"}}},"is_fallback":{"type":"boolean","description":"True when a fallback served the request or returned the error. Omitted when false."},"primary_provider":{"type":"string","description":"The primary attempt's provider. Set only when a fallback ran.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"]},"primary_model":{"type":"string","description":"The primary attempt's model. Set only when a fallback ran."},"requested_provider":{"type":"string","description":"Provider the caller asked for, before routing rules, load balancing or session affinity changed it. Omitted when the caller sent a bare model.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"]},"requested_model":{"type":"string","description":"Model the caller asked for, before anything changed it"},"server_side_fallback_model":{"type":"string","description":"Model that answered when Anthropic switched models inside one call"}}},"provider":{"type":"string","description":"Deprecated: use routing_info.provider.","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"],"deprecated":true},"original_model_requested":{"type":"string","deprecated":true,"description":"Deprecated: use routing_info.primary_model when routing_info.is_fallback is true, otherwise routing_info.model. For the model the caller asked for, read routing_info.requested_model."},"resolved_model_used":{"type":"string","deprecated":true,"description":"Deprecated: use routing_info.resolved_key_alias.model_id when an alias matched, otherwise routing_info.model."},"request_type":{"type":"string"},"mcp_request_type":{"type":"string"},"a2a_request_type":{"type":"string","description":"Agent Gateway operation, for A2A errors"},"a2a_agent_name":{"type":"string"},"error_type":{"type":"string","description":"Normalized, low-cardinality classification of why the request failed, declared by whichever component refused it. Prefixed by fault domain (caller_, policy_, provider_, bifrost_). Absent on failures that were not classified at source."},"retry_after_ms":{"type":"integer","format":"int64","minimum":1000,"maximum":300000,"description":"The provider's hint for how long to wait before retrying, in milliseconds, read from its retry-after-ms or Retry-After header or its google.rpc.RetryInfo error detail, and clamped to between 1000 and 300000. Absent when the provider gave no explicit hint."},"raw_request":{"description":"Raw provider request, when raw request capture is enabled"},"raw_response":{"description":"Raw provider response, when raw response capture is enabled"},"converted_request_type":{"type":"string"},"dropped_compat_plugin_params":{"type":"array","items":{"type":"string"}},"latency":{"type":"integer","format":"int64","description":"Latency in milliseconds"},"key_statuses":{"type":"array","description":"Per-key results, for requests that ran on every key such as listing models","items":{"type":"object","properties":{"key_id":{"type":"string"},"status":{"type":"string","enum":["success","list_models_failed"]},"provider":{"type":"string","description":"AI model provider identifier","enum":["anthropic","azure","bedrock","bedrock_mantle","cerebras","cohere","deepseek","gemini","groq","mistral","ollama","opencode-go","opencode-zen","openai","parasail","perplexity","sgl","vertex","openrouter","elevenlabs","huggingface","nebius","xai","replicate","vllm","runway","runware","fireworks","sarvam","wafer","databricks","cloudflare","typesafe"]},"error":{"oneOf":[{}]}}}},"mcp_auth_required":{"type":"object","description":"Set when a per-user MCP tool needs the caller to complete an inline auth flow","properties":{"kind":{"type":"string"},"mcp_client_id":{"type":"string"},"mcp_client_name":{"type":"string"},"message":{"type":"string"},"authorize_url":{"type":"string"},"session_id":{"type":"string"}}},"billed_usage":{"type":"object","description":"Usage the provider reported and billed even though the request failed","properties":{"prompt_tokens":{"type":"integer","description":"Total input tokens including any prompt-cache tokens (read + write). Subtract prompt_tokens_details.cached_read_tokens and prompt_tokens_details.cached_write_tokens to get the non-cached portion.\n"},"prompt_tokens_details":{"type":"object","properties":{"text_tokens":{"type":"integer"},"audio_tokens":{"type":"integer"},"image_tokens":{"type":"integer"},"cached_read_tokens":{"type":"integer","description":"Tokens served from the prompt cache (cache hit). These tokens are already included in prompt_tokens and are billed at the reduced cache-read rate. Populated for all providers that support prompt caching (Anthropic, Bedrock, OpenAI, Gemini, xAI, etc.).\n"},"cached_write_tokens":{"type":"integer","description":"Tokens written to the prompt cache on this request (cache creation / write). These tokens are already included in prompt_tokens and are billed at the cache-creation rate. Populated for providers that separately report cache write tokens (Anthropic, Bedrock).\n"}}},"completion_tokens":{"type":"integer","description":"Number of output/completion tokens generated."},"completion_tokens_details":{"type":"object","properties":{"text_tokens":{"type":"integer"},"accepted_prediction_tokens":{"type":"integer"},"audio_tokens":{"type":"integer"},"citation_tokens":{"type":"integer"},"num_search_queries":{"type":"integer","deprecated":true,"description":"Deprecated, use tool_usage.web_search.num_requests. Will be removed in 3.0.0."},"reasoning_tokens":{"type":"integer"},"image_tokens":{"type":"integer"},"rejected_prediction_tokens":{"type":"integer"}}},"total_tokens":{"type":"integer"},"tool_usage":{"type":"object","description":"Counts of provider-hosted (server-side) tool calls billed per call.\n","properties":{"web_search":{"type":"object","properties":{"num_requests":{"type":"integer","description":"Number of billable web search calls."}}}}},"cost":{"type":"object","description":"Cost breakdown for the request","properties":{"input_tokens_cost":{"type":"number"},"output_tokens_cost":{"type":"number"},"reasoning_tokens_cost":{"type":"number","description":"Cost for reasoning/thinking tokens (reasoning models)"},"citation_tokens_cost":{"type":"number","description":"Cost for citation tokens"},"search_queries_cost":{"type":"number","description":"Cost for web search queries"},"request_cost":{"type":"number"},"total_cost":{"type":"number"}}}}}}}}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Management API authentication for `/api/*` endpoints. Use the `Authorization` header\nwith `Bearer \u003ctoken>`, where `\u003ctoken>` is one of:\n\n- a Bifrost management API key,\n- a dashboard session token issued by `POST /api/session/login`,\n- base64 of `\u003cadmin-username>:\u003cadmin-password>` (legacy equivalent of `BasicAuth`).\n\nVirtual keys (`sk-bf-*`) and the `x-api-key` header are not accepted on management APIs -\nthe sole exception is `GET /api/governance/virtual-keys/quota`, which is virtual-key-only.\n\nAuthentication alone is not sufficient in Bifrost Enterprise: each operation page shows a\n**Required Permissions** table (`Resource:Operation`, for example `Dashboard:View`) above\nits Authorizations section, and the caller's RBAC role or management API key scopes must\ninclude what it lists, otherwise the request is rejected with `403 Forbidden`.\n\nA local admin — authenticated with the admin password, or any caller on a deployment with\ndashboard auth disabled — bypasses these checks and can call every management endpoint.\n\n**OSS setup lock.** On Bifrost OSS, while dashboard auth is not active (no admin account,\nor auth disabled), every management endpoint except the public ones (`/health`,\n`/api/version`, `/api/session/is-auth-enabled`, `/api/session/login`, ...) requires the\noperator's setup token in the `X-Bifrost-Setup-Token` header, in place of `Authorization`.\nThe token is set with `setup_token` in `config.json` or the `BIFROST_SETUP_TOKEN`\nenvironment variable. A missing header returns `401`, a wrong token `403`. The header\nstops working once dashboard auth is enabled. The dashboard instead trades the token once\nfor an HttpOnly `bifrost_setup_session` cookie via `POST /api/session/setup`.\nSee [Required permissions](/api/procuring-api-keys#required-permissions) for how\npermissions are derived and which endpoints are exempt.\n","scopes":[],"schemeName":"ManagementBearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Management API authentication for `/api/*` endpoints. Use the `Authorization` header\nwith `Bearer \u003ctoken>`, where `\u003ctoken>` is one of:\n\n- a Bifrost management API key,\n- a dashboard session token issued by `POST /api/session/login`,\n- base64 of `\u003cadmin-username>:\u003cadmin-password>` (legacy equivalent of `BasicAuth`).\n\nVirtual keys (`sk-bf-*`) and the `x-api-key` header are not accepted on management APIs -\nthe sole exception is `GET /api/governance/virtual-keys/quota`, which is virtual-key-only.\n\nAuthentication alone is not sufficient in Bifrost Enterprise: each operation page shows a\n**Required Permissions** table (`Resource:Operation`, for example `Dashboard:View`) above\nits Authorizations section, and the caller's RBAC role or management API key scopes must\ninclude what it lists, otherwise the request is rejected with `403 Forbidden`.\n\nA local admin — authenticated with the admin password, or any caller on a deployment with\ndashboard auth disabled — bypasses these checks and can call every management endpoint.\n\n**OSS setup lock.** On Bifrost OSS, while dashboard auth is not active (no admin account,\nor auth disabled), every management endpoint except the public ones (`/health`,\n`/api/version`, `/api/session/is-auth-enabled`, `/api/session/login`, ...) requires the\noperator's setup token in the `X-Bifrost-Setup-Token` header, in place of `Authorization`.\nThe token is set with `setup_token` in `config.json` or the `BIFROST_SETUP_TOKEN`\nenvironment variable. A missing header returns `401`, a wrong token `403`. The header\nstops working once dashboard auth is enabled. The dashboard instead trades the token once\nfor an HttpOnly `bifrost_setup_session` cookie via `POST /api/session/setup`.\nSee [Required permissions](/api/procuring-api-keys#required-permissions) for how\npermissions are derived and which endpoints are exempt.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ManagementBearerAuth","name":"Authorization"}],"title":"ManagementBearerAuth"}]},"originalFileLocation":"openapi/openapi.json"},"subdomain":"bifrost","siteName":"Bifrost","title":"Update project - Bifrost","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-19T12:12:20.766Z","originalFileLocation":"api-reference/projects/update-project.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=\"Applies a patch to the stored project. Fields the body omits are left as stored, and child lists are paired with their stored rows by id, so a cap keeps its accumulated spend and its window across an edit while a child the body stops naming is deleted. Changing the roster or any divided cap on a project with split_policy: equal recalculates every member\u0026#x27;s slice. That work is queued and its id is returned as redivision_job_id; the project\u0026#x27;s own write has already committed by then, so a failure to queue is reported as a server error rather than rolling the edit back.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bifrost\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Update project - Bifrost\">\u003cmeta data-mint-head property=\"og:description\" content=\"Applies a patch to the stored project. Fields the body omits are left as stored, and child lists are paired with their stored rows by id, so a cap keeps its accumulated spend and its window across an edit while a child the body stops naming is deleted. Changing the roster or any divided cap on a project with split_policy: equal recalculates every member\u0026#x27;s slice. That work is queued and its id is returned as redivision_job_id; the project\u0026#x27;s own write has already committed by then, so a failure to queue is reported as a server error rather than rolling the edit back.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bifrost\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getbifrost.ai/api-reference/projects/update-project\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bifrost.mintlify.app/_mintlify/api/og/v2?division=Projects\u0026amp;title=Update+project\u0026amp;description=Applies+a+patch+to+the+stored+project.+Fields+the+body+omits+are+left+as%0Astored%2C+and+child+lists+are+paired+with+their+stored+rows+by+%60id%60%2C+so+a%0Acap+keeps+its+a\u0026amp;theme=4d1d84bec9a8c3ee0c7cd8ee\u0026amp;signature=b71a73a31a07cb9d6593a645ce68d51da1a619dad94fe700100a8b9374b54836\">\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=\"Update project - Bifrost\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Applies a patch to the stored project. Fields the body omits are left as stored, and child lists are paired with their stored rows by id, so a cap keeps its accumulated spend and its window across an edit while a child the body stops naming is deleted. Changing the roster or any divided cap on a project with split_policy: equal recalculates every member\u0026#x27;s slice. That work is queued and its id is returned as redivision_job_id; the project\u0026#x27;s own write has already committed by then, so a failure to queue is reported as a server error rather than rolling the edit back.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bifrost.mintlify.app/_mintlify/api/og/v2?division=Projects\u0026amp;title=Update+project\u0026amp;description=Applies+a+patch+to+the+stored+project.+Fields+the+body+omits+are+left+as%0Astored%2C+and+child+lists+are+paired+with+their+stored+rows+by+%60id%60%2C+so+a%0Acap+keeps+its+a\u0026amp;theme=4d1d84bec9a8c3ee0c7cd8ee\u0026amp;signature=b71a73a31a07cb9d6593a645ce68d51da1a619dad94fe700100a8b9374b54836\">\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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bifrost\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C3B43\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getbifrost.ai/api-reference/projects/update-project\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/projects/update-project.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getbifrost.ai/#organization\",\"name\":\"Bifrost\",\"url\":\"https://docs.getbifrost.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=6af701a560aee4103444fa017b226cf0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getbifrost.ai#website\",\"name\":\"Bifrost\",\"url\":\"https://docs.getbifrost.ai\",\"publisher\":{\"@id\":\"https://docs.getbifrost.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getbifrost.ai/api-reference/projects/update-project#webpage\",\"url\":\"https://docs.getbifrost.ai/api-reference/projects/update-project\",\"name\":\"Update project\",\"description\":\"Applies a patch to the stored project. Fields the body omits are left as stored, and child lists are paired with their stored rows by id, so a cap keeps its accumulated spend and its window across an edit while a child the body stops naming is deleted. Changing the roster or any divided cap on a project with split_policy: equal recalculates every member's slice. That work is queued and its id is returned as redivision_job_id; the project's own write has already committed by then, so a failure to queue is reported as a server error rather than rolling the edit back.\",\"dateModified\":\"2026-10-19T12:12:20.766Z\",\"isPartOf\":{\"@id\":\"https://docs.getbifrost.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getbifrost.ai/api-reference/projects/update-project#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getbifrost.ai/api-reference/projects/update-project#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Governance\",\"item\":\"https://docs.getbifrost.ai/api-reference/governance/list-teams\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Projects\",\"item\":\"https://docs.getbifrost.ai/api-reference/projects/list-projects\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Update project\",\"item\":\"https://docs.getbifrost.ai/api-reference/projects/update-project\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.getbifrost.ai/api-reference/projects/update-project#apireference\",\"headline\":\"Update project\",\"name\":\"Update project\",\"description\":\"Applies a patch to the stored project. Fields the body omits are left as stored, and child lists are paired with their stored rows by id, so a cap keeps its accumulated spend and its window across an edit while a child the body stops naming is deleted. Changing the roster or any divided cap on a project with split_policy: equal recalculates every member's slice. That work is queued and its id is returned as redivision_job_id; the project's own write has already committed by then, so a failure to queue is reported as a server error rather than rolling the edit back.\",\"url\":\"https://docs.getbifrost.ai/api-reference/projects/update-project\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getbifrost.ai/api-reference/projects/update-project#webpage\"},\"dateModified\":\"2026-10-19T12:12:20.766Z\",\"publisher\":{\"@id\":\"https://docs.getbifrost.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getbifrost.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bifrost\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bifrost","nav":{"global":{"anchors":[{"anchor":"Discord","icon":"discord","href":"https://discord.gg/exN5KAydbU"},{"anchor":"GitHub","icon":"github","href":"https://github.com/maximhq/bifrost"},{"anchor":"Try Enterprise","icon":"building","href":"https://www.getmaxim.ai/bifrost/enterprise"}]},"tabs":[{"tab":"OSS","icon":"book-open-cover","pages":[{"title":"OSS","href":"/overview"}]},{"tab":"Enterprise","icon":"building","pages":[{"title":"Enterprise","href":"/enterprise/overview"}]},{"tab":"Edge","icon":"globe","pages":[{"title":"Edge","href":"/edge/overview"}]},{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/runbooks/claude-code-bedrock"}]},{"tab":"Deployment Guides","icon":"server","pages":[{"title":"Deployment Guides","href":"/deployment-guides/overview"}]},{"tab":"API","icon":"code","groups":[{"group":"Authentication","icon":"key","pages":[{"title":"Creating API Keys","icon":"key","href":"/api/procuring-api-keys"}]},{"group":"Inference","pages":[{"group":"Models","expanded":false,"pages":[{"title":"List available models","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/models","href":"/api-reference/models/list-available-models"}]},{"group":"Chat Completions","expanded":false,"pages":[{"title":"Create a chat completion","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/chat/completions","href":"/api-reference/chat-completions/create-a-chat-completion"}]},{"group":"Text Completions","expanded":false,"pages":[{"title":"Create a text completion","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/completions","href":"/api-reference/text-completions/create-a-text-completion"}]},{"group":"Responses","expanded":false,"pages":[{"title":"Responses API over WebSocket","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/responses","href":"/api-reference/responses/responses-api-over-websocket"},{"title":"Create a response","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/responses","href":"/api-reference/responses/create-a-response"},{"title":"Retrieve a response","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/responses/{response_id}","href":"/api-reference/responses/retrieve-a-response"},{"title":"Delete a response","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /v1/responses/{response_id}","href":"/api-reference/responses/delete-a-response"},{"title":"Cancel a response","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/responses/{response_id}/cancel","href":"/api-reference/responses/cancel-a-response"},{"title":"List response input items","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/responses/{response_id}/input_items","href":"/api-reference/responses/list-response-input-items"}]},{"group":"OCR","expanded":false,"pages":[{"title":"Perform OCR","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/ocr","href":"/api-reference/ocr/perform-ocr"}]},{"group":"Rerank","expanded":false,"pages":[{"title":"Rerank documents","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/rerank","href":"/api-reference/rerank/rerank-documents"}]},{"group":"Decisions","expanded":false,"pages":[{"title":"Evaluate a decision","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/decisions","href":"/api-reference/decisions/evaluate-a-decision"}]},{"group":"Embeddings","expanded":false,"pages":[{"title":"Create embeddings","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/embeddings","href":"/api-reference/embeddings/create-embeddings"}]},{"group":"Audio","expanded":false,"pages":[{"title":"Create speech","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/audio/speech","href":"/api-reference/audio/create-speech"},{"title":"Create transcription","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/audio/transcriptions","href":"/api-reference/audio/create-transcription"}]},{"group":"Images","expanded":false,"pages":[{"title":"Generate an image","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/images/generations","href":"/api-reference/images/generate-an-image"},{"title":"Edit an image","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/images/edits","href":"/api-reference/images/edit-an-image"},{"title":"Create Variation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/images/variations","href":"/api-reference/images/create-variation"}]},{"group":"Videos","expanded":false,"pages":[{"title":"List video generation jobs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/videos","href":"/api-reference/videos/list-video-generation-jobs"},{"title":"Generate a video","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/videos","href":"/api-reference/videos/generate-a-video"},{"title":"Retrieve a video generation job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/videos/{video_id}","href":"/api-reference/videos/retrieve-a-video-generation-job"},{"title":"Delete a video generation job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /v1/videos/{video_id}","href":"/api-reference/videos/delete-a-video-generation-job"},{"title":"Download video content","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/videos/{video_id}/content","href":"/api-reference/videos/download-video-content"},{"title":"Remix a video","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/videos/{video_id}/remix","href":"/api-reference/videos/remix-a-video"}]},{"group":"Count Tokens","expanded":false,"pages":[{"title":"Count tokens","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/responses/input_tokens","href":"/api-reference/count-tokens/count-tokens"}]},{"group":"Compaction","expanded":false,"pages":[{"title":"Compact context","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/responses/compact","href":"/api-reference/compaction/compact-context"}]},{"group":"Batch","expanded":false,"pages":[{"title":"List batch jobs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/batches","href":"/api-reference/batch/list-batch-jobs"},{"title":"Create a batch job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/batches","href":"/api-reference/batch/create-a-batch-job"},{"title":"Retrieve a batch job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/batches/{batch_id}","href":"/api-reference/batch/retrieve-a-batch-job"},{"title":"Cancel a batch job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/batches/{batch_id}/cancel","href":"/api-reference/batch/cancel-a-batch-job"},{"title":"Get batch results","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/batches/{batch_id}/results","href":"/api-reference/batch/get-batch-results"}]},{"group":"Files","expanded":false,"pages":[{"title":"List files","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/files","href":"/api-reference/files/list-files"},{"title":"Upload a file","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/files","href":"/api-reference/files/upload-a-file"},{"title":"Retrieve file metadata","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/files/{file_id}","href":"/api-reference/files/retrieve-file-metadata"},{"title":"Delete a file","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /v1/files/{file_id}","href":"/api-reference/files/delete-a-file"},{"title":"Download file content","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/files/{file_id}/content","href":"/api-reference/files/download-file-content"}]},{"group":"Containers","expanded":false,"pages":[{"title":"List containers","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/containers","href":"/api-reference/containers/list-containers"},{"title":"Create a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/containers","href":"/api-reference/containers/create-a-container"},{"title":"Retrieve a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/containers/{container_id}","href":"/api-reference/containers/retrieve-a-container"},{"title":"Delete a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /v1/containers/{container_id}","href":"/api-reference/containers/delete-a-container"},{"title":"List files in a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/containers/{container_id}/files","href":"/api-reference/containers/list-files-in-a-container"},{"title":"Create a file in a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/containers/{container_id}/files","href":"/api-reference/containers/create-a-file-in-a-container"},{"title":"Retrieve a file from a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/containers/{container_id}/files/{file_id}","href":"/api-reference/containers/retrieve-a-file-from-a-container"},{"title":"Delete a file from a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /v1/containers/{container_id}/files/{file_id}","href":"/api-reference/containers/delete-a-file-from-a-container"},{"title":"Download file content from a container","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/containers/{container_id}/files/{file_id}/content","href":"/api-reference/containers/download-file-content-from-a-container"}]},{"group":"Async Jobs","expanded":false,"pages":[{"title":"Create async chat completion","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/chat/completions","href":"/api-reference/async-jobs/create-async-chat-completion"},{"title":"Create async text completion","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/completions","href":"/api-reference/async-jobs/create-async-text-completion"},{"title":"Create async response","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/responses","href":"/api-reference/async-jobs/create-async-response"},{"title":"Create async embedding","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/embeddings","href":"/api-reference/async-jobs/create-async-embedding"},{"title":"Create async speech","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/audio/speech","href":"/api-reference/async-jobs/create-async-speech"},{"title":"Create async transcription","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/audio/transcriptions","href":"/api-reference/async-jobs/create-async-transcription"},{"title":"Create async image generation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/images/generations","href":"/api-reference/async-jobs/create-async-image-generation"},{"title":"Create async image edit","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/images/edits","href":"/api-reference/async-jobs/create-async-image-edit"},{"title":"Create async image variation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/images/variations","href":"/api-reference/async-jobs/create-async-image-variation"},{"title":"Get async chat completion job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/chat/completions/{job_id}","href":"/api-reference/async-jobs/get-async-chat-completion-job"},{"title":"Get async text completion job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/completions/{job_id}","href":"/api-reference/async-jobs/get-async-text-completion-job"},{"title":"Get async response job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/responses/{job_id}","href":"/api-reference/async-jobs/get-async-response-job"},{"title":"Get async embedding job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/embeddings/{job_id}","href":"/api-reference/async-jobs/get-async-embedding-job"},{"title":"Get async speech job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/audio/speech/{job_id}","href":"/api-reference/async-jobs/get-async-speech-job"},{"title":"Get async transcription job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/audio/transcriptions/{job_id}","href":"/api-reference/async-jobs/get-async-transcription-job"},{"title":"Get async image generation job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/images/generations/{job_id}","href":"/api-reference/async-jobs/get-async-image-generation-job"},{"title":"Get async image edit job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/images/edits/{job_id}","href":"/api-reference/async-jobs/get-async-image-edit-job"},{"title":"Get async image variation job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/images/variations/{job_id}","href":"/api-reference/async-jobs/get-async-image-variation-job"},{"title":"Create async rerank","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/rerank","href":"/api-reference/async-jobs/create-async-rerank"},{"title":"Get async rerank job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/rerank/{job_id}","href":"/api-reference/async-jobs/get-async-rerank-job"},{"title":"Create async OCR job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/async/ocr","href":"/api-reference/async-jobs/create-async-ocr-job"},{"title":"Get async OCR job","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/async/ocr/{job_id}","href":"/api-reference/async-jobs/get-async-ocr-job"}]},{"group":"Realtime","expanded":false,"pages":[{"title":"Realtime API WebSocket","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /v1/realtime","href":"/api-reference/realtime/realtime-api-websocket"},{"title":"Realtime WebRTC SDP exchange","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/realtime/calls","href":"/api-reference/realtime/realtime-webrtc-sdp-exchange"},{"title":"Mint a realtime ephemeral client secret","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/realtime/client_secrets","href":"/api-reference/realtime/mint-a-realtime-ephemeral-client-secret"},{"title":"Mint a realtime session (legacy alias)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/realtime/sessions","href":"/api-reference/realtime/mint-a-realtime-session-legacy-alias"}]}]},{"group":"Integrations","pages":[{"group":"OpenAI Integration","expanded":false,"pages":[{"title":"Create chat completion (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/chat/completions","href":"/api-reference/openai-integration/create-chat-completion-openai-format"},{"title":"Create chat completion (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/chat/completions","href":"/api-reference/openai-integration/create-chat-completion-azure-openai"},{"title":"Create text completion (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/completions","href":"/api-reference/openai-integration/create-text-completion-openai-format"},{"title":"Create text completion (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/completions","href":"/api-reference/openai-integration/create-text-completion-azure-openai"},{"title":"WebSocket Responses (OpenAI alias)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/responses","href":"/api-reference/openai-integration/websocket-responses-openai-alias"},{"title":"Create response (OpenAI Responses API)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/responses","href":"/api-reference/openai-integration/create-response-openai-responses-api"},{"title":"Create response (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/responses","href":"/api-reference/openai-integration/create-response-azure-openai"},{"title":"Count input tokens","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/responses/input_tokens","href":"/api-reference/openai-integration/count-input-tokens"},{"title":"Retrieve a response (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/responses/{response_id}","href":"/api-reference/openai-integration/retrieve-a-response-openai-format"},{"title":"Delete a response (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /openai/v1/responses/{response_id}","href":"/api-reference/openai-integration/delete-a-response-openai-format"},{"title":"Cancel a response (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/responses/{response_id}/cancel","href":"/api-reference/openai-integration/cancel-a-response-openai-format"},{"title":"List response input items (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/responses/{response_id}/input_items","href":"/api-reference/openai-integration/list-response-input-items-openai-format"},{"title":"Compact context (OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/responses/compact","href":"/api-reference/openai-integration/compact-context-openai"},{"title":"Create embeddings (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/embeddings","href":"/api-reference/openai-integration/create-embeddings-openai-format"},{"title":"Create embeddings (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/embeddings","href":"/api-reference/openai-integration/create-embeddings-azure-openai"},{"title":"Evaluate a decision (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/decisions","href":"/api-reference/openai-integration/evaluate-a-decision-openai-format"},{"title":"Create speech (OpenAI TTS)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/audio/speech","href":"/api-reference/openai-integration/create-speech-openai-tts"},{"title":"Create speech (Azure OpenAI TTS)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/audio/speech","href":"/api-reference/openai-integration/create-speech-azure-openai-tts"},{"title":"Create transcription (OpenAI Whisper)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/audio/transcriptions","href":"/api-reference/openai-integration/create-transcription-openai-whisper"},{"title":"Create transcription (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/audio/transcriptions","href":"/api-reference/openai-integration/create-transcription-azure-openai"},{"title":"List models (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/models","href":"/api-reference/openai-integration/list-models-openai-format"},{"title":"List models (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/openai/deployments/{deployment-id}/models","href":"/api-reference/openai-integration/list-models-azure-openai"},{"title":"List batch jobs (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/batches","href":"/api-reference/openai-integration/list-batch-jobs-openai-format"},{"title":"Create batch job (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/batches","href":"/api-reference/openai-integration/create-batch-job-openai-format"},{"title":"Retrieve batch job (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/batches/{batch_id}","href":"/api-reference/openai-integration/retrieve-batch-job-openai-format"},{"title":"Cancel batch job (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/batches/{batch_id}/cancel","href":"/api-reference/openai-integration/cancel-batch-job-openai-format"},{"title":"Create image","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/images/generations","href":"/api-reference/openai-integration/create-image"},{"title":"Create image (Azure OpenAI)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/openai/deployments/{deployment-id}/images/generations","href":"/api-reference/openai-integration/create-image-azure-openai"},{"title":"List files (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/files","href":"/api-reference/openai-integration/list-files-openai-format"},{"title":"Upload file (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/files","href":"/api-reference/openai-integration/upload-file-openai-format"},{"title":"Retrieve file metadata (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/files/{file_id}","href":"/api-reference/openai-integration/retrieve-file-metadata-openai-format"},{"title":"Delete file (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /openai/v1/files/{file_id}","href":"/api-reference/openai-integration/delete-file-openai-format"},{"title":"Get file content (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/files/{file_id}/content","href":"/api-reference/openai-integration/get-file-content-openai-format"},{"title":"List containers (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/containers","href":"/api-reference/openai-integration/list-containers-openai-format"},{"title":"Create container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/containers","href":"/api-reference/openai-integration/create-container-openai-format"},{"title":"Retrieve container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/containers/{container_id}","href":"/api-reference/openai-integration/retrieve-container-openai-format"},{"title":"Delete container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /openai/v1/containers/{container_id}","href":"/api-reference/openai-integration/delete-container-openai-format"},{"title":"List files in container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/containers/{container_id}/files","href":"/api-reference/openai-integration/list-files-in-container-openai-format"},{"title":"Create file in container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/containers/{container_id}/files","href":"/api-reference/openai-integration/create-file-in-container-openai-format"},{"title":"Retrieve file from container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/containers/{container_id}/files/{file_id}","href":"/api-reference/openai-integration/retrieve-file-from-container-openai-format"},{"title":"Delete file from container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /openai/v1/containers/{container_id}/files/{file_id}","href":"/api-reference/openai-integration/delete-file-from-container-openai-format"},{"title":"Get file content from container (OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/containers/{container_id}/files/{file_id}/content","href":"/api-reference/openai-integration/get-file-content-from-container-openai-format"},{"title":"List video generations","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/videos","href":"/api-reference/openai-integration/list-video-generations"},{"title":"Create a video generation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/videos","href":"/api-reference/openai-integration/create-a-video-generation"},{"title":"Retrieve a video generation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/videos/{video_id}","href":"/api-reference/openai-integration/retrieve-a-video-generation"},{"title":"Delete a video generation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /openai/v1/videos/{video_id}","href":"/api-reference/openai-integration/delete-a-video-generation"},{"title":"Download generated video content","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/videos/{video_id}/content","href":"/api-reference/openai-integration/download-generated-video-content"},{"title":"Remix an existing video","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/videos/{video_id}/remix","href":"/api-reference/openai-integration/remix-an-existing-video"},{"title":"WebSocket Realtime (OpenAI alias)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /openai/v1/realtime","href":"/api-reference/openai-integration/websocket-realtime-openai-alias"},{"title":"WebRTC Realtime SDP exchange (OpenAI alias)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/realtime/calls","href":"/api-reference/openai-integration/webrtc-realtime-sdp-exchange-openai-alias"},{"title":"Create realtime client secret (OpenAI alias)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/realtime/client_secrets","href":"/api-reference/openai-integration/create-realtime-client-secret-openai-alias"},{"title":"Create realtime session (OpenAI alias)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /openai/v1/realtime/sessions","href":"/api-reference/openai-integration/create-realtime-session-openai-alias"}]},{"group":"Anthropic Integration","expanded":false,"pages":[{"title":"Create message (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/messages","href":"/api-reference/anthropic-integration/create-message-anthropic-format"},{"title":"Create message (Anthropic format) - wildcard","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/messages/{path}","href":"/api-reference/anthropic-integration/create-message-anthropic-format--wildcard"},{"title":"Create completion (Anthropic legacy format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/complete","href":"/api-reference/anthropic-integration/create-completion-anthropic-legacy-format"},{"title":"List models (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /anthropic/v1/models","href":"/api-reference/anthropic-integration/list-models-anthropic-format"},{"title":"Count tokens (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/messages/count_tokens","href":"/api-reference/anthropic-integration/count-tokens-anthropic-format"},{"title":"List batch jobs (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /anthropic/v1/messages/batches","href":"/api-reference/anthropic-integration/list-batch-jobs-anthropic-format"},{"title":"Create batch job (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/messages/batches","href":"/api-reference/anthropic-integration/create-batch-job-anthropic-format"},{"title":"Retrieve batch job (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /anthropic/v1/messages/batches/{batch_id}","href":"/api-reference/anthropic-integration/retrieve-batch-job-anthropic-format"},{"title":"Cancel batch job (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/messages/batches/{batch_id}/cancel","href":"/api-reference/anthropic-integration/cancel-batch-job-anthropic-format"},{"title":"Get batch results (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /anthropic/v1/messages/batches/{batch_id}/results","href":"/api-reference/anthropic-integration/get-batch-results-anthropic-format"},{"title":"List files (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /anthropic/v1/files","href":"/api-reference/anthropic-integration/list-files-anthropic-format"},{"title":"Upload file (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /anthropic/v1/files","href":"/api-reference/anthropic-integration/upload-file-anthropic-format"},{"title":"Get file content (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /anthropic/v1/files/{file_id}/content","href":"/api-reference/anthropic-integration/get-file-content-anthropic-format"},{"title":"Delete file (Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /anthropic/v1/files/{file_id}","href":"/api-reference/anthropic-integration/delete-file-anthropic-format"}]},{"group":"GenAI Integration","expanded":false,"pages":[{"title":"Generate content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/models/{model}:generateContent","href":"/api-reference/genai-integration/generate-content-gemini-format"},{"title":"Stream generate content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/models/{model}:streamGenerateContent","href":"/api-reference/genai-integration/stream-generate-content-gemini-format"},{"title":"Embed content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/models/{model}:embedContent","href":"/api-reference/genai-integration/embed-content-gemini-format"},{"title":"Count tokens (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/models/{model}:countTokens","href":"/api-reference/genai-integration/count-tokens-gemini-format"},{"title":"Generate image (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/models/{model}:predict","href":"/api-reference/genai-integration/generate-image-gemini-format"},{"title":"List models (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/models","href":"/api-reference/genai-integration/list-models-gemini-format"},{"title":"Upload file (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/upload/v1beta/files","href":"/api-reference/genai-integration/upload-file-gemini-format"},{"title":"List files (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/files","href":"/api-reference/genai-integration/list-files-gemini-format"},{"title":"Retrieve file (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/files/{file_id}","href":"/api-reference/genai-integration/retrieve-file-gemini-format"},{"title":"Delete file (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /genai/v1beta/files/{file_id}","href":"/api-reference/genai-integration/delete-file-gemini-format"},{"title":"List batch jobs (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/batches","href":"/api-reference/genai-integration/list-batch-jobs-gemini-format"},{"title":"Retrieve a batch job (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/batches/{batch_id}","href":"/api-reference/genai-integration/retrieve-a-batch-job-gemini-format"},{"title":"Cancel a batch job (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/batches/{batch_id}","href":"/api-reference/genai-integration/cancel-a-batch-job-gemini-format"},{"title":"Delete a batch job (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /genai/v1beta/batches/{batch_id}","href":"/api-reference/genai-integration/delete-a-batch-job-gemini-format"},{"title":"List cached content entries (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/cachedContents","href":"/api-reference/genai-integration/list-cached-content-entries-gemini-format"},{"title":"Create cached content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1beta/cachedContents","href":"/api-reference/genai-integration/create-cached-content-gemini-format"},{"title":"Retrieve cached content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/cachedContents/{cached_id}","href":"/api-reference/genai-integration/retrieve-cached-content-gemini-format"},{"title":"Update cached content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json patch /genai/v1beta/cachedContents/{cached_id}","href":"/api-reference/genai-integration/update-cached-content-gemini-format"},{"title":"Delete cached content (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /genai/v1beta/cachedContents/{cached_id}","href":"/api-reference/genai-integration/delete-cached-content-gemini-format"},{"title":"Rerank documents (Vertex Rank)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /genai/v1/rank","href":"/api-reference/genai-integration/rerank-documents-vertex-rank"},{"title":"Retrieve video generation operation (Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /genai/v1beta/models/{model}/operations/{operation_id}","href":"/api-reference/genai-integration/retrieve-video-generation-operation-gemini-format"}]},{"group":"Bedrock Integration","expanded":false,"pages":[{"title":"Converse with model (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model/{modelId}/converse","href":"/api-reference/bedrock-integration/converse-with-model-bedrock-format"},{"title":"Stream converse with model (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model/{modelId}/converse-stream","href":"/api-reference/bedrock-integration/stream-converse-with-model-bedrock-format"},{"title":"Invoke model (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model/{modelId}/invoke","href":"/api-reference/bedrock-integration/invoke-model-bedrock-format"},{"title":"Invoke model with streaming (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model/{modelId}/invoke-with-response-stream","href":"/api-reference/bedrock-integration/invoke-model-with-streaming-bedrock-format"},{"title":"Count tokens (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model/{modelId}/count-tokens","href":"/api-reference/bedrock-integration/count-tokens-bedrock-format"},{"title":"Create batch inference job (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model-invocation-job","href":"/api-reference/bedrock-integration/create-batch-inference-job-bedrock-format"},{"title":"List batch inference jobs (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /bedrock/model-invocation-jobs","href":"/api-reference/bedrock-integration/list-batch-inference-jobs-bedrock-format"},{"title":"Retrieve batch inference job (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /bedrock/model-invocation-job/{job_arn}","href":"/api-reference/bedrock-integration/retrieve-batch-inference-job-bedrock-format"},{"title":"Cancel batch inference job (Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /bedrock/model-invocation-job/{job_arn}/stop","href":"/api-reference/bedrock-integration/cancel-batch-inference-job-bedrock-format"},{"title":"S3-compatible ListObjectsV2","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /bedrock/files/{bucket}","href":"/api-reference/bedrock-integration/s3-compatible-listobjectsv2"},{"title":"S3-compatible GetObject","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /bedrock/files/{bucket}/{key}","href":"/api-reference/bedrock-integration/s3-compatible-getobject"},{"title":"S3-compatible PutObject","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /bedrock/files/{bucket}/{key}","href":"/api-reference/bedrock-integration/s3-compatible-putobject"},{"title":"S3-compatible DeleteObject","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /bedrock/files/{bucket}/{key}","href":"/api-reference/bedrock-integration/s3-compatible-deleteobject"},{"title":"S3-compatible HeadObject","deprecated":null,"version":null,"openapi":"/openapi/openapi.json head /bedrock/files/{bucket}/{key}","href":"/api-reference/bedrock-integration/s3-compatible-headobject"}]},{"group":"Cohere Integration","expanded":false,"pages":[{"title":"Chat with model (Cohere v2 format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cohere/v2/chat","href":"/api-reference/cohere-integration/chat-with-model-cohere-v2-format"},{"title":"Create embeddings (Cohere v2 format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cohere/v2/embed","href":"/api-reference/cohere-integration/create-embeddings-cohere-v2-format"},{"title":"Rerank documents (Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cohere/v2/rerank","href":"/api-reference/cohere-integration/rerank-documents-cohere-format"},{"title":"Tokenize text (Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cohere/v1/tokenize","href":"/api-reference/cohere-integration/tokenize-text-cohere-format"}]},{"group":"Typesafe Integration","expanded":false,"pages":[{"title":"Evaluate state (Typesafe format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /typesafe/v1/systemone","href":"/api-reference/typesafe-integration/evaluate-state-typesafe-format"},{"title":"List models (Typesafe format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /typesafe/v1/models","href":"/api-reference/typesafe-integration/list-models-typesafe-format"}]},{"group":"Cursor Integration","expanded":false,"pages":[{"title":"Cursor hybrid chat completions","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/chat/completions","href":"/api-reference/cursor-integration/cursor-hybrid-chat-completions"},{"title":"List models (Cursor)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /cursor/v1/models","href":"/api-reference/cursor-integration/list-models-cursor"},{"title":"Anthropic complete (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/complete","href":"/api-reference/cursor-integration/anthropic-complete-cursor-mount"},{"title":"Anthropic messages (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/messages","href":"/api-reference/cursor-integration/anthropic-messages-cursor-mount"},{"title":"Anthropic messages — wildcard (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/messages/{path}","href":"/api-reference/cursor-integration/anthropic-messages-—-wildcard-cursor-mount"},{"title":"Anthropic count tokens (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/messages/count_tokens","href":"/api-reference/cursor-integration/anthropic-count-tokens-cursor-mount"},{"title":"Gemini list models (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /cursor/v1beta/models","href":"/api-reference/cursor-integration/gemini-list-models-cursor-mount"},{"title":"Gemini model action (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1beta/models/{model}","href":"/api-reference/cursor-integration/gemini-model-action-cursor-mount"},{"title":"Gemini video operation polling (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /cursor/v1beta/models/{model}/operations/{operation_id}","href":"/api-reference/cursor-integration/gemini-video-operation-polling-cursor-mount"},{"title":"Vertex rank (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/rank","href":"/api-reference/cursor-integration/vertex-rank-cursor-mount"},{"title":"Bedrock converse (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/model/{modelId}/converse","href":"/api-reference/cursor-integration/bedrock-converse-cursor-mount"},{"title":"Bedrock converse stream (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/model/{modelId}/converse-stream","href":"/api-reference/cursor-integration/bedrock-converse-stream-cursor-mount"},{"title":"Bedrock invoke (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/model/{modelId}/invoke","href":"/api-reference/cursor-integration/bedrock-invoke-cursor-mount"},{"title":"Bedrock invoke-with-response-stream (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/model/{modelId}/invoke-with-response-stream","href":"/api-reference/cursor-integration/bedrock-invoke-with-response-stream-cursor-mount"},{"title":"Bedrock rerank (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/rerank","href":"/api-reference/cursor-integration/bedrock-rerank-cursor-mount"},{"title":"Bedrock count tokens (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/model/{modelId}/count-tokens","href":"/api-reference/cursor-integration/bedrock-count-tokens-cursor-mount"},{"title":"Cohere chat (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v2/chat","href":"/api-reference/cursor-integration/cohere-chat-cursor-mount"},{"title":"Cohere embed (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v2/embed","href":"/api-reference/cursor-integration/cohere-embed-cursor-mount"},{"title":"Cohere rerank (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v2/rerank","href":"/api-reference/cursor-integration/cohere-rerank-cursor-mount"},{"title":"Cohere tokenize (Cursor mount)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /cursor/v1/tokenize","href":"/api-reference/cursor-integration/cohere-tokenize-cursor-mount"}]},{"group":"LiteLLM Integration","expanded":false,"pages":[{"title":"Text completions (LiteLLM - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/completions","href":"/api-reference/litellm-integration/text-completions-litellm--openai-format"},{"title":"Chat completions (LiteLLM - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/chat/completions","href":"/api-reference/litellm-integration/chat-completions-litellm--openai-format"},{"title":"Create embeddings (LiteLLM - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/embeddings","href":"/api-reference/litellm-integration/create-embeddings-litellm--openai-format"},{"title":"List models (LiteLLM - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /litellm/v1/models","href":"/api-reference/litellm-integration/list-models-litellm--openai-format"},{"title":"Create response (LiteLLM - OpenAI Responses API)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/responses","href":"/api-reference/litellm-integration/create-response-litellm--openai-responses-api"},{"title":"Count input tokens (LiteLLM - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/responses/input_tokens","href":"/api-reference/litellm-integration/count-input-tokens-litellm--openai-format"},{"title":"Create speech (LiteLLM - OpenAI TTS)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/audio/speech","href":"/api-reference/litellm-integration/create-speech-litellm--openai-tts"},{"title":"Create transcription (LiteLLM - OpenAI Whisper)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/v1/audio/transcriptions","href":"/api-reference/litellm-integration/create-transcription-litellm--openai-whisper"},{"title":"Create message (LiteLLM - Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/anthropic/v1/messages","href":"/api-reference/litellm-integration/create-message-litellm--anthropic-format"},{"title":"List models (LiteLLM - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /litellm/genai/v1beta/models","href":"/api-reference/litellm-integration/list-models-litellm--gemini-format"},{"title":"Generate content (LiteLLM - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/genai/v1beta/models/{model}:generateContent","href":"/api-reference/litellm-integration/generate-content-litellm--gemini-format"},{"title":"Stream generate content (LiteLLM - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/genai/v1beta/models/{model}:streamGenerateContent","href":"/api-reference/litellm-integration/stream-generate-content-litellm--gemini-format"},{"title":"Converse with model (LiteLLM - Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/bedrock/model/{modelId}/converse","href":"/api-reference/litellm-integration/converse-with-model-litellm--bedrock-format"},{"title":"Stream converse with model (LiteLLM - Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/bedrock/model/{modelId}/converse-stream","href":"/api-reference/litellm-integration/stream-converse-with-model-litellm--bedrock-format"},{"title":"Chat with model (LiteLLM - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/cohere/v2/chat","href":"/api-reference/litellm-integration/chat-with-model-litellm--cohere-format"},{"title":"Create embeddings (LiteLLM - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/cohere/v2/embed","href":"/api-reference/litellm-integration/create-embeddings-litellm--cohere-format"},{"title":"Tokenize text (LiteLLM - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /litellm/cohere/v1/tokenize","href":"/api-reference/litellm-integration/tokenize-text-litellm--cohere-format"}]},{"group":"LangChain Integration","expanded":false,"pages":[{"title":"Text completions (LangChain - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/completions","href":"/api-reference/langchain-integration/text-completions-langchain--openai-format"},{"title":"Chat completions (LangChain - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/chat/completions","href":"/api-reference/langchain-integration/chat-completions-langchain--openai-format"},{"title":"Create embeddings (LangChain - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/embeddings","href":"/api-reference/langchain-integration/create-embeddings-langchain--openai-format"},{"title":"List models (LangChain - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /langchain/v1/models","href":"/api-reference/langchain-integration/list-models-langchain--openai-format"},{"title":"Create response (LangChain - OpenAI Responses API)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/responses","href":"/api-reference/langchain-integration/create-response-langchain--openai-responses-api"},{"title":"Count input tokens (LangChain - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/responses/input_tokens","href":"/api-reference/langchain-integration/count-input-tokens-langchain--openai-format"},{"title":"Create speech (LangChain - OpenAI TTS)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/audio/speech","href":"/api-reference/langchain-integration/create-speech-langchain--openai-tts"},{"title":"Create transcription (LangChain - OpenAI Whisper)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/v1/audio/transcriptions","href":"/api-reference/langchain-integration/create-transcription-langchain--openai-whisper"},{"title":"Create message (LangChain - Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/anthropic/v1/messages","href":"/api-reference/langchain-integration/create-message-langchain--anthropic-format"},{"title":"Count tokens (LangChain - Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/anthropic/v1/messages/count_tokens","href":"/api-reference/langchain-integration/count-tokens-langchain--anthropic-format"},{"title":"List models (LangChain - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /langchain/genai/v1beta/models","href":"/api-reference/langchain-integration/list-models-langchain--gemini-format"},{"title":"Generate content (LangChain - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/genai/v1beta/models/{model}:generateContent","href":"/api-reference/langchain-integration/generate-content-langchain--gemini-format"},{"title":"Stream generate content (LangChain - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/genai/v1beta/models/{model}:streamGenerateContent","href":"/api-reference/langchain-integration/stream-generate-content-langchain--gemini-format"},{"title":"Converse with model (LangChain - Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/bedrock/model/{modelId}/converse","href":"/api-reference/langchain-integration/converse-with-model-langchain--bedrock-format"},{"title":"Stream converse with model (LangChain - Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/bedrock/model/{modelId}/converse-stream","href":"/api-reference/langchain-integration/stream-converse-with-model-langchain--bedrock-format"},{"title":"Chat with model (LangChain - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/cohere/v2/chat","href":"/api-reference/langchain-integration/chat-with-model-langchain--cohere-format"},{"title":"Create embeddings (LangChain - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/cohere/v2/embed","href":"/api-reference/langchain-integration/create-embeddings-langchain--cohere-format"},{"title":"Tokenize text (LangChain - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /langchain/cohere/v1/tokenize","href":"/api-reference/langchain-integration/tokenize-text-langchain--cohere-format"}]},{"group":"PydanticAI Integration","expanded":false,"pages":[{"title":"Text completions (PydanticAI - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/completions","href":"/api-reference/pydanticai-integration/text-completions-pydanticai--openai-format"},{"title":"Chat completions (PydanticAI - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/chat/completions","href":"/api-reference/pydanticai-integration/chat-completions-pydanticai--openai-format"},{"title":"Create embeddings (PydanticAI - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/embeddings","href":"/api-reference/pydanticai-integration/create-embeddings-pydanticai--openai-format"},{"title":"List models (PydanticAI - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /pydanticai/v1/models","href":"/api-reference/pydanticai-integration/list-models-pydanticai--openai-format"},{"title":"Create response (PydanticAI - OpenAI Responses API)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/responses","href":"/api-reference/pydanticai-integration/create-response-pydanticai--openai-responses-api"},{"title":"Count input tokens (PydanticAI - OpenAI format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/responses/input_tokens","href":"/api-reference/pydanticai-integration/count-input-tokens-pydanticai--openai-format"},{"title":"Create speech (PydanticAI - OpenAI TTS)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/audio/speech","href":"/api-reference/pydanticai-integration/create-speech-pydanticai--openai-tts"},{"title":"Create transcription (PydanticAI - OpenAI Whisper)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/v1/audio/transcriptions","href":"/api-reference/pydanticai-integration/create-transcription-pydanticai--openai-whisper"},{"title":"Create message (PydanticAI - Anthropic format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/anthropic/v1/messages","href":"/api-reference/pydanticai-integration/create-message-pydanticai--anthropic-format"},{"title":"List models (PydanticAI - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /pydanticai/genai/v1beta/models","href":"/api-reference/pydanticai-integration/list-models-pydanticai--gemini-format"},{"title":"Generate content (PydanticAI - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/genai/v1beta/models/{model}:generateContent","href":"/api-reference/pydanticai-integration/generate-content-pydanticai--gemini-format"},{"title":"Stream generate content (PydanticAI - Gemini format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/genai/v1beta/models/{model}:streamGenerateContent","href":"/api-reference/pydanticai-integration/stream-generate-content-pydanticai--gemini-format"},{"title":"Converse with model (PydanticAI - Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/bedrock/model/{modelId}/converse","href":"/api-reference/pydanticai-integration/converse-with-model-pydanticai--bedrock-format"},{"title":"Stream converse with model (PydanticAI - Bedrock format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/bedrock/model/{modelId}/converse-stream","href":"/api-reference/pydanticai-integration/stream-converse-with-model-pydanticai--bedrock-format"},{"title":"Chat with model (PydanticAI - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/cohere/v2/chat","href":"/api-reference/pydanticai-integration/chat-with-model-pydanticai--cohere-format"},{"title":"Create embeddings (PydanticAI - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/cohere/v2/embed","href":"/api-reference/pydanticai-integration/create-embeddings-pydanticai--cohere-format"},{"title":"Tokenize text (PydanticAI - Cohere format)","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /pydanticai/cohere/v1/tokenize","href":"/api-reference/pydanticai-integration/tokenize-text-pydanticai--cohere-format"}]}]},{"group":"Platform","pages":[{"group":"Health","expanded":false,"pages":[{"title":"Health check","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /health","href":"/api-reference/health/health-check"}]},{"group":"Configuration","expanded":false,"pages":[{"title":"Get configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/config","href":"/api-reference/configuration/get-configuration"},{"title":"Update configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/config","href":"/api-reference/configuration/update-configuration"},{"title":"Get version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/version","href":"/api-reference/configuration/get-version"},{"title":"Get proxy configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/proxy-config","href":"/api-reference/configuration/get-proxy-configuration"},{"title":"Update proxy configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/proxy-config","href":"/api-reference/configuration/update-proxy-configuration"},{"title":"Force pricing sync","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/pricing/force-sync","href":"/api-reference/configuration/force-pricing-sync"}]},{"group":"Session","expanded":false,"pages":[{"title":"Login","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/session/login","href":"/api-reference/session/login"},{"title":"Logout","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/session/logout","href":"/api-reference/session/logout"},{"title":"Check if authentication is enabled","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/session/is-auth-enabled","href":"/api-reference/session/check-if-authentication-is-enabled"},{"title":"Issue WebSocket ticket","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/session/ws-ticket","href":"/api-reference/session/issue-websocket-ticket"}]},{"group":"Providers","expanded":false,"pages":[{"title":"List all providers","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/providers","href":"/api-reference/providers/list-all-providers"},{"title":"Add a new provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/providers","href":"/api-reference/providers/add-a-new-provider"},{"title":"Get a specific provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/providers/{provider}","href":"/api-reference/providers/get-a-specific-provider"},{"title":"Update a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/providers/{provider}","href":"/api-reference/providers/update-a-provider"},{"title":"Delete a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/providers/{provider}","href":"/api-reference/providers/delete-a-provider"},{"title":"List keys for a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/providers/{provider}/keys","href":"/api-reference/providers/list-keys-for-a-provider"},{"title":"Create a key for a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/providers/{provider}/keys","href":"/api-reference/providers/create-a-key-for-a-provider"},{"title":"Get a specific key for a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/providers/{provider}/keys/{key_id}","href":"/api-reference/providers/get-a-specific-key-for-a-provider"},{"title":"Update a key for a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/providers/{provider}/keys/{key_id}","href":"/api-reference/providers/update-a-key-for-a-provider"},{"title":"Delete a key from a provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/providers/{provider}/keys/{key_id}","href":"/api-reference/providers/delete-a-key-from-a-provider"},{"title":"List all keys","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/keys","href":"/api-reference/providers/list-all-keys"},{"title":"List models","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/models","href":"/api-reference/providers/list-models"},{"title":"List model details","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/models/details","href":"/api-reference/providers/list-model-details"},{"title":"Get model parameters","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/models/parameters","href":"/api-reference/providers/get-model-parameters"},{"title":"List base models","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/models/base","href":"/api-reference/providers/list-base-models"}]},{"group":"Plugins","expanded":false,"pages":[{"title":"List all plugins","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/plugins","href":"/api-reference/plugins/list-all-plugins"},{"title":"Create a new plugin","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/plugins","href":"/api-reference/plugins/create-a-new-plugin"},{"title":"List built-in plugin names","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/plugins/builtins","href":"/api-reference/plugins/list-built-in-plugin-names"},{"title":"Get a specific plugin","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/plugins/{name}","href":"/api-reference/plugins/get-a-specific-plugin"},{"title":"Update a plugin","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/plugins/{name}","href":"/api-reference/plugins/update-a-plugin"},{"title":"Delete a plugin","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/plugins/{name}","href":"/api-reference/plugins/delete-a-plugin"}]},{"group":"MCP","expanded":false,"pages":[{"title":"Execute MCP tool","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /v1/mcp/tool/execute","href":"/api-reference/mcp/execute-mcp-tool"},{"title":"List MCP clients","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp/clients","href":"/api-reference/mcp/list-mcp-clients"},{"title":"Add MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client","href":"/api-reference/mcp/add-mcp-client"},{"title":"Edit MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/mcp/client/{id}","href":"/api-reference/mcp/edit-mcp-client"},{"title":"Remove MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/mcp/client/{id}","href":"/api-reference/mcp/remove-mcp-client"},{"title":"Reconnect MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/reconnect","href":"/api-reference/mcp/reconnect-mcp-client"},{"title":"Refresh MCP client tools","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/refresh-tools","href":"/api-reference/mcp/refresh-mcp-client-tools"},{"title":"Complete MCP client OAuth flow","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/complete-oauth","href":"/api-reference/mcp/complete-mcp-client-oauth-flow"},{"title":"Initiate verification for a pending MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/initiate-verification","href":"/api-reference/mcp/initiate-verification-for-a-pending-mcp-client"},{"title":"Reauthorize an MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/reauthorize","href":"/api-reference/mcp/reauthorize-an-mcp-client"},{"title":"Reauthorize an MCP client against a newly registered OAuth client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/reregister","href":"/api-reference/mcp/reauthorize-an-mcp-client-against-a-newly-registered-oauth-client"},{"title":"Verify a pending per-user-headers MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/verify-headers","href":"/api-reference/mcp/verify-a-pending-per-user-headers-mcp-client"},{"title":"Verify a pending or repair a needs_reauth token_exchange MCP client","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/client/{id}/verify-exchange","href":"/api-reference/mcp/verify-a-pending-or-repair-a-needs_reauth-token_exchange-mcp-client"},{"title":"List MCP sessions","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp/sessions","href":"/api-reference/mcp/list-mcp-sessions"},{"title":"Revoke an MCP session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/mcp/sessions/{id}","href":"/api-reference/mcp/revoke-an-mcp-session"},{"title":"Re-authenticate or edit an MCP session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/sessions/{id}/reauth","href":"/api-reference/mcp/re-authenticate-or-edit-an-mcp-session"},{"title":"Get per-user-headers submission flow","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp/per-user-headers/flows/{id}","href":"/api-reference/mcp/get-per-user-headers-submission-flow"},{"title":"Submit per-user-headers values","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/mcp/per-user-headers/flows/{id}","href":"/api-reference/mcp/submit-per-user-headers-values"},{"title":"Revoke a per-user-headers credential","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/mcp/per-user-headers/credential/{id}","href":"/api-reference/mcp/revoke-a-per-user-headers-credential"}]},{"group":"Virtual MCPs","expanded":false,"pages":[{"title":"List Virtual MCPs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp/virtual-mcps","href":"/api-reference/mcp/list-virtual-mcps"},{"title":"Create Virtual MCP","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/virtual-mcps","href":"/api-reference/mcp/create-virtual-mcp"},{"title":"Get Virtual MCP by ID","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp/virtual-mcps/{id}","href":"/api-reference/mcp/get-virtual-mcp-by-id"},{"title":"Update Virtual MCP","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/mcp/virtual-mcps/{id}","href":"/api-reference/mcp/update-virtual-mcp"},{"title":"Delete Virtual MCP","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/mcp/virtual-mcps/{id}","href":"/api-reference/mcp/delete-virtual-mcp"},{"title":"Assign Virtual MCP to a virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/mcp/virtual-mcps/{id}/virtual-keys/{vkId}","href":"/api-reference/mcp/assign-virtual-mcp-to-a-virtual-key"},{"title":"Unassign Virtual MCP from a virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/mcp/virtual-mcps/{id}/virtual-keys/{vkId}","href":"/api-reference/mcp/unassign-virtual-mcp-from-a-virtual-key"}]},{"group":"MCP Tool Groups (deprecated)","expanded":false,"pages":[{"title":"List MCP Tool Groups","deprecated":true,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/mcp/tool-groups","href":"/api-reference/mcp-tool-groups/list-mcp-tool-groups"},{"title":"Create MCP Tool Group","deprecated":true,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/mcp/tool-groups","href":"/api-reference/mcp-tool-groups/create-mcp-tool-group"},{"title":"Get MCP Tool Group by ID","deprecated":true,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/mcp/tool-groups/{id}","href":"/api-reference/mcp-tool-groups/get-mcp-tool-group-by-id"},{"title":"Update MCP Tool Group","deprecated":true,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/mcp/tool-groups/{id}","href":"/api-reference/mcp-tool-groups/update-mcp-tool-group"},{"title":"Delete MCP Tool Group","deprecated":true,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/mcp/tool-groups/{id}","href":"/api-reference/mcp-tool-groups/delete-mcp-tool-group"}]},{"group":"Agent Gateway","expanded":false,"pages":[{"title":"Register agent","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/agents","href":"/api-reference/agent-gateway/register-agent"},{"title":"List agents","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents","href":"/api-reference/agent-gateway/list-agents"},{"title":"Get agent","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/{name}","href":"/api-reference/agent-gateway/get-agent"},{"title":"Replace agent","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/agents/{name}","href":"/api-reference/agent-gateway/replace-agent"},{"title":"Delete agent","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/agents/{name}","href":"/api-reference/agent-gateway/delete-agent"},{"title":"Inspect agent card","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/agents/inspect","href":"/api-reference/agent-gateway/inspect-agent-card"},{"title":"List stored push configurations","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/push-configs","href":"/api-reference/agent-gateway/list-stored-push-configurations"},{"title":"Delete stored push configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/agents/push-configs/{agent}/{task}/{config}","href":"/api-reference/agent-gateway/delete-stored-push-configuration"},{"title":"List agent history","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/history","href":"/api-reference/agent-gateway/list-agent-history"},{"title":"Delete agent history","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/agents/history","href":"/api-reference/agent-gateway/delete-agent-history"},{"title":"Get agent history statistics","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/history/stats","href":"/api-reference/agent-gateway/get-agent-history-statistics"},{"title":"Get agent history histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/history/histogram","href":"/api-reference/agent-gateway/get-agent-history-histogram"},{"title":"Get top agents","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/history/top-agents","href":"/api-reference/agent-gateway/get-top-agents"},{"title":"Get agent history filter values","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/history/filterdata","href":"/api-reference/agent-gateway/get-agent-history-filter-values"},{"title":"Get agent history entry","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/agents/history/{id}","href":"/api-reference/agent-gateway/get-agent-history-entry"},{"title":"Get gateway agent card","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /agents/a2a/{name}/.well-known/agent-card.json","href":"/api-reference/agent-gateway/get-gateway-agent-card"},{"title":"Call agent over JSON-RPC","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/json-rpc","href":"/api-reference/agent-gateway/call-agent-over-json-rpc"},{"title":"Send message","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/rest/message:send","href":"/api-reference/agent-gateway/send-message"},{"title":"Send streaming message","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/rest/message:stream","href":"/api-reference/agent-gateway/send-streaming-message"},{"title":"List tasks","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /agents/a2a/{name}/rest/tasks","href":"/api-reference/agent-gateway/list-tasks"},{"title":"Get task","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /agents/a2a/{name}/rest/tasks/{taskId}","href":"/api-reference/agent-gateway/get-task"},{"title":"Cancel task","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/rest/tasks/{taskId}:cancel","href":"/api-reference/agent-gateway/cancel-task"},{"title":"Subscribe to task","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/rest/tasks/{taskId}:subscribe","href":"/api-reference/agent-gateway/subscribe-to-task"},{"title":"Create task push configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/rest/tasks/{taskId}/pushNotificationConfigs","href":"/api-reference/agent-gateway/create-task-push-configuration"},{"title":"List task push configurations","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /agents/a2a/{name}/rest/tasks/{taskId}/pushNotificationConfigs","href":"/api-reference/agent-gateway/list-task-push-configurations"},{"title":"Get task push configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /agents/a2a/{name}/rest/tasks/{taskId}/pushNotificationConfigs/{configId}","href":"/api-reference/agent-gateway/get-task-push-configuration"},{"title":"Delete task push configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /agents/a2a/{name}/rest/tasks/{taskId}/pushNotificationConfigs/{configId}","href":"/api-reference/agent-gateway/delete-task-push-configuration"},{"title":"Get extended agent card","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /agents/a2a/{name}/rest/extendedAgentCard","href":"/api-reference/agent-gateway/get-extended-agent-card"},{"title":"Receive upstream push notification","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /agents/a2a/{name}/push/callback","href":"/api-reference/agent-gateway/receive-upstream-push-notification"}]},{"group":"OAuth","expanded":false,"pages":[{"title":"Get per-user OAuth flow detail","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/oauth/per-user/flows/{id}","href":"/api-reference/oauth/get-per-user-oauth-flow-detail"},{"title":"Start the upstream OAuth authorization for a pending flow","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/oauth/per-user/flows/{id}/start","href":"/api-reference/oauth/start-the-upstream-oauth-authorization-for-a-pending-flow"},{"title":"OAuth callback endpoint","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/oauth/callback","href":"/api-reference/oauth/oauth-callback-endpoint"},{"title":"Get OAuth config status","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/oauth/config/{id}/status","href":"/api-reference/oauth/get-oauth-config-status"},{"title":"Revoke OAuth config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/oauth/config/{id}","href":"/api-reference/oauth/revoke-oauth-config"}]},{"group":"Logging","expanded":false,"pages":[{"title":"Get logs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs","href":"/api-reference/logging/get-logs"},{"title":"Delete logs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/logs","href":"/api-reference/logging/delete-logs"},{"title":"Get a single log entry","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/{id}","href":"/api-reference/logging/get-a-single-log-entry"},{"title":"Get logs for a session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/sessions/{session_id}","href":"/api-reference/logging/get-logs-for-a-session"},{"title":"Get aggregate totals for a session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/sessions/{session_id}/summary","href":"/api-reference/logging/get-aggregate-totals-for-a-session"},{"title":"Get log statistics","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/stats","href":"/api-reference/logging/get-log-statistics"},{"title":"Get request count histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram","href":"/api-reference/logging/get-request-count-histogram"},{"title":"Get token usage histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/tokens","href":"/api-reference/logging/get-token-usage-histogram"},{"title":"Get cost histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/cost","href":"/api-reference/logging/get-cost-histogram"},{"title":"Get model usage histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/models","href":"/api-reference/logging/get-model-usage-histogram"},{"title":"Get latency histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/latency","href":"/api-reference/logging/get-latency-histogram"},{"title":"Get cost histogram by provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/cost/by-provider","href":"/api-reference/logging/get-cost-histogram-by-provider"},{"title":"Get token histogram by provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/tokens/by-provider","href":"/api-reference/logging/get-token-histogram-by-provider"},{"title":"Get latency histogram by provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/latency/by-provider","href":"/api-reference/logging/get-latency-histogram-by-provider"},{"title":"Get throughput histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/throughput","href":"/api-reference/logging/get-throughput-histogram"},{"title":"Get throughput histogram by provider","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/throughput/by-provider","href":"/api-reference/logging/get-throughput-histogram-by-provider"},{"title":"Get cost histogram by dimension","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/cost/by-dimension","href":"/api-reference/logging/get-cost-histogram-by-dimension"},{"title":"Get token histogram by dimension","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/tokens/by-dimension","href":"/api-reference/logging/get-token-histogram-by-dimension"},{"title":"Get latency histogram by dimension","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/histogram/latency/by-dimension","href":"/api-reference/logging/get-latency-histogram-by-dimension"},{"title":"Get dropped requests count","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/dropped","href":"/api-reference/logging/get-dropped-requests-count"},{"title":"Get available filter data","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/filterdata","href":"/api-reference/logging/get-available-filter-data"},{"title":"Get model usage rankings","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/rankings","href":"/api-reference/logging/get-model-usage-rankings"},{"title":"Get rankings by governance dimension","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/rankings/by-dimension","href":"/api-reference/logging/get-rankings-by-governance-dimension"},{"title":"Get user usage rankings","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/logs/rankings/users","href":"/api-reference/logging/get-user-usage-rankings"},{"title":"Get consolidated dashboard data","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/dashboard","href":"/api-reference/logging/get-consolidated-dashboard-data"},{"title":"Recalculate log costs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/logs/recalculate-cost","href":"/api-reference/logging/recalculate-log-costs"},{"title":"Get log cost recalculation status","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/logs/recalculate-cost/status","href":"/api-reference/logging/get-log-cost-recalculation-status"},{"title":"Cancel log cost recalculation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/logs/recalculate-cost/cancel","href":"/api-reference/logging/cancel-log-cost-recalculation"},{"title":"Get MCP tool logs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs","href":"/api-reference/logging/get-mcp-tool-logs"},{"title":"Delete MCP tool logs","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/mcp-logs","href":"/api-reference/logging/delete-mcp-tool-logs"},{"title":"Get MCP tool log by ID","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs/{id}","href":"/api-reference/logging/get-mcp-tool-log-by-id"},{"title":"Get MCP tool log statistics","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs/stats","href":"/api-reference/logging/get-mcp-tool-log-statistics"},{"title":"Get available MCP log filter data","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs/filterdata","href":"/api-reference/logging/get-available-mcp-log-filter-data"},{"title":"Get MCP tool call volume histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs/histogram","href":"/api-reference/logging/get-mcp-tool-call-volume-histogram"},{"title":"Get MCP cost histogram","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs/histogram/cost","href":"/api-reference/logging/get-mcp-cost-histogram"},{"title":"Get top MCP tools by call count","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/mcp-logs/histogram/top-tools","href":"/api-reference/logging/get-top-mcp-tools-by-call-count"}]},{"group":"Prompt Repository","expanded":false,"pages":[{"title":"List folders","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/folders","href":"/api-reference/prompt-repository/list-folders"},{"title":"Create folder","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/prompt-repo/folders","href":"/api-reference/prompt-repository/create-folder"},{"title":"Get folder","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/folders/{id}","href":"/api-reference/prompt-repository/get-folder"},{"title":"Update folder","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/prompt-repo/folders/{id}","href":"/api-reference/prompt-repository/update-folder"},{"title":"Delete folder","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/prompt-repo/folders/{id}","href":"/api-reference/prompt-repository/delete-folder"},{"title":"List prompts","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/prompts","href":"/api-reference/prompt-repository/list-prompts"},{"title":"Create prompt","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/prompt-repo/prompts","href":"/api-reference/prompt-repository/create-prompt"},{"title":"Get prompt","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/prompts/{id}","href":"/api-reference/prompt-repository/get-prompt"},{"title":"Update prompt","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/prompt-repo/prompts/{id}","href":"/api-reference/prompt-repository/update-prompt"},{"title":"Delete prompt","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/prompt-repo/prompts/{id}","href":"/api-reference/prompt-repository/delete-prompt"},{"title":"List prompt versions","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/prompts/{id}/versions","href":"/api-reference/prompt-repository/list-prompt-versions"},{"title":"Create prompt version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/prompt-repo/prompts/{id}/versions","href":"/api-reference/prompt-repository/create-prompt-version"},{"title":"Get prompt version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/versions/{id}","href":"/api-reference/prompt-repository/get-prompt-version"},{"title":"Delete prompt version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/prompt-repo/versions/{id}","href":"/api-reference/prompt-repository/delete-prompt-version"},{"title":"List prompt sessions","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/prompts/{id}/sessions","href":"/api-reference/prompt-repository/list-prompt-sessions"},{"title":"Create prompt session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/prompt-repo/prompts/{id}/sessions","href":"/api-reference/prompt-repository/create-prompt-session"},{"title":"Get prompt session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/prompt-repo/sessions/{id}","href":"/api-reference/prompt-repository/get-prompt-session"},{"title":"Update prompt session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/prompt-repo/sessions/{id}","href":"/api-reference/prompt-repository/update-prompt-session"},{"title":"Delete prompt session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/prompt-repo/sessions/{id}","href":"/api-reference/prompt-repository/delete-prompt-session"},{"title":"Rename prompt session","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/prompt-repo/sessions/{id}/rename","href":"/api-reference/prompt-repository/rename-prompt-session"},{"title":"Commit session as version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/prompt-repo/sessions/{id}/commit","href":"/api-reference/prompt-repository/commit-session-as-version"}]},{"group":"Skills","expanded":false,"pages":[{"title":"Upload skill file","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/skills/files/upload","href":"/api-reference/skills/upload-skill-file"},{"title":"Clean up orphan skill files","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/skills/files/orphans","href":"/api-reference/skills/clean-up-orphan-skill-files"},{"title":"Get all-skills version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/all/version","href":"/api-reference/skills/get-all-skills-version"},{"title":"Bump all-skills version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/skills/all/version","href":"/api-reference/skills/bump-all-skills-version"},{"title":"List skills","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills","href":"/api-reference/skills/list-skills"},{"title":"Create skill","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/skills","href":"/api-reference/skills/create-skill"},{"title":"Get skill","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/{id}","href":"/api-reference/skills/get-skill"},{"title":"Update skill","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/skills/{id}","href":"/api-reference/skills/update-skill"},{"title":"Delete skill","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/skills/{id}","href":"/api-reference/skills/delete-skill"},{"title":"List skill versions","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/{id}/versions","href":"/api-reference/skills/list-skill-versions"},{"title":"Shift served skill version","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/skills/{id}/shift-version","href":"/api-reference/skills/shift-served-skill-version"},{"title":"Get Claude Code skills marketplace","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/serve/claude-code/.claude-plugin/marketplace.json","href":"/api-reference/skills/get-claude-code-skills-marketplace"},{"title":"Get Codex skills marketplace JSON","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/serve/codex/.agents/plugins/marketplace.json","href":"/api-reference/skills/get-codex-skills-marketplace-json"},{"title":"Download all skills as ZIP","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/serve/all/download.zip","href":"/api-reference/skills/download-all-skills-as-zip"},{"title":"Download skill as ZIP","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/serve/{skill-name}/download.zip","href":"/api-reference/skills/download-skill-as-zip"},{"title":"Download skill file","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/skills/serve/{skill-name}/files/{filepath}","href":"/api-reference/skills/download-skill-file"}]},{"group":"Cache","expanded":false,"pages":[{"title":"Clear cache entry by cache ID","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/cache/clear/{cacheId}","href":"/api-reference/cache/clear-cache-entry-by-cache-id"},{"title":"Clear cache by cache key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/cache/clear-by-key/{cacheKey}","href":"/api-reference/cache/clear-cache-by-cache-key"}]},{"group":"Vault","expanded":false,"pages":[{"title":"Flush vault secret cache","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/vault/flush-cache","href":"/api-reference/vault/flush-vault-secret-cache"}]},{"group":"Infrastructure","expanded":false,"pages":[{"title":"WebSocket connection","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /ws","href":"/api-reference/infrastructure/websocket-connection"},{"title":"MCP protocol SSE stream","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /mcp","href":"/api-reference/infrastructure/mcp-protocol-sse-stream"},{"title":"MCP protocol message","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /mcp","href":"/api-reference/infrastructure/mcp-protocol-message"},{"title":"Prometheus metrics","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /metrics","href":"/api-reference/infrastructure/prometheus-metrics"},{"title":"Inspect a request without forwarding it","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /inspect","href":"/api-reference/infrastructure/inspect-a-request-without-forwarding-it"}]},{"group":"API Keys","expanded":false,"pages":[{"title":"List API keys","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/api-keys","href":"/api-reference/api-keys/list-api-keys"},{"title":"Create an API key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/api-keys","href":"/api-reference/api-keys/create-an-api-key"},{"title":"Get an API key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/api-keys/{id}","href":"/api-reference/api-keys/get-an-api-key"},{"title":"Update an API key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/api-keys/{id}","href":"/api-reference/api-keys/update-an-api-key"},{"title":"Delete an API key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/api-keys/{id}","href":"/api-reference/api-keys/delete-an-api-key"}]},{"group":"Webhooks","expanded":false,"pages":[{"title":"List webhook endpoints","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/webhooks","href":"/api-reference/webhooks/list-webhook-endpoints"},{"title":"Create a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/webhooks","href":"/api-reference/webhooks/create-a-webhook-endpoint"},{"title":"Get a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/webhooks/{id}","href":"/api-reference/webhooks/get-a-webhook-endpoint"},{"title":"Update a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/webhooks/{id}","href":"/api-reference/webhooks/update-a-webhook-endpoint"},{"title":"Delete a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook-endpoint"},{"title":"Rotate a webhook signing secret","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/webhooks/{id}/rotate-secret","href":"/api-reference/webhooks/rotate-a-webhook-signing-secret"},{"title":"Send a test delivery","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/webhooks/{id}/test","href":"/api-reference/webhooks/send-a-test-delivery"},{"title":"List delivery history","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/webhooks/{id}/deliveries","href":"/api-reference/webhooks/list-delivery-history"},{"title":"Search delivery history","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/webhooks/deliveries","href":"/api-reference/webhooks/search-delivery-history"},{"title":"Re-queue a delivery","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/webhooks/deliveries/{id}/redeliver","href":"/api-reference/webhooks/re-queue-a-delivery"}]},{"group":"Notifications","expanded":false,"pages":[{"title":"List dashboard notifications","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/notifications","href":"/api-reference/notifications/list-dashboard-notifications"},{"title":"Publish a dashboard notification","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/notifications","href":"/api-reference/notifications/publish-a-dashboard-notification"}]},{"group":"News Feeds","expanded":false,"pages":[{"title":"List news feeds","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/rss/feeds","href":"/api-reference/news-feeds/list-news-feeds"},{"title":"Add a custom news feed","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/rss/feeds","href":"/api-reference/news-feeds/add-a-custom-news-feed"},{"title":"Update a news feed","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/rss/feeds/{id}","href":"/api-reference/news-feeds/update-a-news-feed"},{"title":"Delete a custom news feed","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/rss/feeds/{id}","href":"/api-reference/news-feeds/delete-a-custom-news-feed"},{"title":"List news items","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/rss/items","href":"/api-reference/news-feeds/list-news-items"},{"title":"Get news settings","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/rss/settings","href":"/api-reference/news-feeds/get-news-settings"},{"title":"Turn news on or off","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/rss/settings","href":"/api-reference/news-feeds/turn-news-on-or-off"}]},{"group":"Warp","expanded":false,"pages":[{"title":"Read Warp configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/warp/config","href":"/api-reference/warp/read-warp-configuration"},{"title":"Update Warp configuration","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/warp/config","href":"/api-reference/warp/update-warp-configuration"},{"title":"Start a Warp log embedding backfill","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/warp/log-index/backfill","href":"/api-reference/warp/start-a-warp-log-embedding-backfill"},{"title":"Read Warp log embedding backfill progress","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/warp/log-index/backfill/status","href":"/api-reference/warp/read-warp-log-embedding-backfill-progress"},{"title":"Cancel a Warp log embedding backfill","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/warp/log-index/backfill/cancel","href":"/api-reference/warp/cancel-a-warp-log-embedding-backfill"},{"title":"Ask Warp a question","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/warp/chat","href":"/api-reference/warp/ask-warp-a-question"},{"title":"Read Warp semantic search index status","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/warp/log-index/status","href":"/api-reference/warp/read-warp-semantic-search-index-status"},{"title":"List the caller's Warp conversations","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/warp/conversations","href":"/api-reference/warp/list-the-callers-warp-conversations"},{"title":"Read one Warp conversation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/warp/conversations/{id}","href":"/api-reference/warp/read-one-warp-conversation"},{"title":"Delete a Warp conversation","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/warp/conversations/{id}","href":"/api-reference/warp/delete-a-warp-conversation"}]}]},{"group":"Governance","pages":[{"group":"Teams","expanded":false,"pages":[{"title":"List teams","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/teams","href":"/api-reference/governance/list-teams"},{"title":"Create team","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/teams","href":"/api-reference/governance/create-team"},{"title":"Get team","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/teams/{team_id}","href":"/api-reference/governance/get-team"},{"title":"Update team","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/teams/{team_id}","href":"/api-reference/governance/update-team"},{"title":"Delete team","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/teams/{team_id}","href":"/api-reference/governance/delete-team"},{"title":"List team members","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/teams/{team_id}/members","href":"/api-reference/teams/list-team-members"},{"title":"Add team member","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/teams/{team_id}/members","href":"/api-reference/teams/add-team-member"},{"title":"Remove team member","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/teams/{team_id}/members/{user_id}","href":"/api-reference/teams/remove-team-member"},{"title":"Get user's teams","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/{user_id}/teams","href":"/api-reference/users/get-users-teams"},{"title":"Update user's team assignments","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/users/{user_id}/teams","href":"/api-reference/users/update-users-team-assignments"},{"title":"List customers attached to a team","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/teams/{team_id}/customers","href":"/api-reference/teams/list-customers-attached-to-a-team"},{"title":"Attach a customer to a team","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/teams/{team_id}/customers","href":"/api-reference/teams/attach-a-customer-to-a-team"},{"title":"Detach a customer from a team","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/teams/{team_id}/customers/{customer_id}","href":"/api-reference/teams/detach-a-customer-from-a-team"},{"title":"List teams attached to a customer","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/customers/{customer_id}/teams","href":"/api-reference/customers/list-teams-attached-to-a-customer"}]},{"group":"Virtual Keys","expanded":false,"pages":[{"title":"List virtual keys","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/virtual-keys","href":"/api-reference/governance/list-virtual-keys"},{"title":"Create virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/virtual-keys","href":"/api-reference/governance/create-virtual-key"},{"title":"Get virtual key quota","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/virtual-keys/quota","href":"/api-reference/governance/get-virtual-key-quota"},{"title":"Rotate multiple virtual keys","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/virtual-keys/rotate","href":"/api-reference/governance/rotate-multiple-virtual-keys"},{"title":"Get virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/virtual-keys/{vk_id}","href":"/api-reference/governance/get-virtual-key"},{"title":"Update virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/virtual-keys/{vk_id}","href":"/api-reference/governance/update-virtual-key"},{"title":"Delete virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/virtual-keys/{vk_id}","href":"/api-reference/governance/delete-virtual-key"},{"title":"Rotate virtual key","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/virtual-keys/{vk_id}/rotate","href":"/api-reference/governance/rotate-virtual-key"},{"title":"List users attached to a virtual key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/virtual-keys/{vk_id}/users","href":"/api-reference/virtual-keys/list-users-attached-to-a-virtual-key"},{"title":"Attach users to a virtual key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/virtual-keys/{vk_id}/users","href":"/api-reference/virtual-keys/attach-users-to-a-virtual-key"},{"title":"Detach a user from a virtual key","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/virtual-keys/{vk_id}/users/{user_id}","href":"/api-reference/virtual-keys/detach-a-user-from-a-virtual-key"},{"title":"Set virtual key budget override","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/virtual-keys/{vk_id}/budgets/{budget_id}/override","href":"/api-reference/governance/set-virtual-key-budget-override"},{"title":"Remove virtual key budget override","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/virtual-keys/{vk_id}/budgets/{budget_id}/override","href":"/api-reference/governance/remove-virtual-key-budget-override"},{"title":"List virtual keys available to a user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/{user_id}/virtual-keys","href":"/api-reference/users/list-virtual-keys-available-to-a-user"},{"title":"Mint an extra virtual key for a user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/users/{user_id}/virtual-keys","href":"/api-reference/users/mint-an-extra-virtual-key-for-a-user"},{"title":"Get user's virtual keys by email","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/email/{email}/virtual-keys","href":"/api-reference/users/get-users-virtual-keys-by-email"}]},{"group":"Customers","expanded":false,"pages":[{"title":"List customers","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/customers","href":"/api-reference/governance/list-customers"},{"title":"Create customer","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/customers","href":"/api-reference/governance/create-customer"},{"title":"Get customer","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/customers/{customer_id}","href":"/api-reference/governance/get-customer"},{"title":"Update customer","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/customers/{customer_id}","href":"/api-reference/governance/update-customer"},{"title":"Delete customer","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/customers/{customer_id}","href":"/api-reference/governance/delete-customer"}]},{"group":"Users","expanded":false,"pages":[{"title":"List users","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users","href":"/api-reference/users/list-users"},{"title":"Create user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/users","href":"/api-reference/users/create-user"},{"title":"Get user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/{user_id}","href":"/api-reference/users/get-user"},{"title":"Delete user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/users/{user_id}","href":"/api-reference/users/delete-user"},{"title":"Get user by email","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/email/{email}","href":"/api-reference/users/get-user-by-email"},{"title":"Get current user permissions","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/me/permissions","href":"/api-reference/users/get-current-user-permissions"},{"title":"Get the calling user's virtual-key creation policy","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/me/vk-creation-policy","href":"/api-reference/users/get-the-calling-users-virtual-key-creation-policy"},{"title":"Assign role to user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/users/{user_id}/role","href":"/api-reference/users/assign-role-to-user"},{"title":"Create user governance","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/users/{user_id}/governance","href":"/api-reference/users/create-user-governance"},{"title":"Update user governance","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/users/{user_id}/governance","href":"/api-reference/users/update-user-governance"},{"title":"Delete user governance","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/users/{user_id}/governance","href":"/api-reference/users/delete-user-governance"}]},{"group":"Business Units","expanded":false,"pages":[{"title":"List business units","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/business-units","href":"/api-reference/governance/list-business-units"},{"title":"Create business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/business-units","href":"/api-reference/governance/create-business-unit"},{"title":"Get business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/business-units/{business_unit_id}","href":"/api-reference/governance/get-business-unit"},{"title":"Update business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/business-units/{business_unit_id}","href":"/api-reference/governance/update-business-unit"},{"title":"Delete business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/business-units/{business_unit_id}","href":"/api-reference/governance/delete-business-unit"},{"title":"List business unit users","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/business-units/{business_unit_id}/users","href":"/api-reference/governance/list-business-unit-users"},{"title":"Assign user to business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/business-units/{business_unit_id}/users","href":"/api-reference/governance/assign-user-to-business-unit"},{"title":"Remove user from business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/business-units/{business_unit_id}/users/{user_id}","href":"/api-reference/governance/remove-user-from-business-unit"},{"title":"Create business unit governance","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/business-units/{business_unit_id}/governance","href":"/api-reference/governance/create-business-unit-governance"},{"title":"Update business unit governance","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/business-units/{business_unit_id}/governance","href":"/api-reference/governance/update-business-unit-governance"},{"title":"Delete business unit governance","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/business-units/{business_unit_id}/governance","href":"/api-reference/governance/delete-business-unit-governance"},{"title":"List customers attached to a business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/business-units/{business_unit_id}/customers","href":"/api-reference/business-units/list-customers-attached-to-a-business-unit"},{"title":"Attach customers to a business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/business-units/{business_unit_id}/customers","href":"/api-reference/business-units/attach-customers-to-a-business-unit"},{"title":"Detach a customer from a business unit","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/business-units/{business_unit_id}/customers/{customer_id}","href":"/api-reference/business-units/detach-a-customer-from-a-business-unit"},{"title":"List business units attached to a customer","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/customers/{customer_id}/business-units","href":"/api-reference/customers/list-business-units-attached-to-a-customer"}]},{"group":"Access Profiles","expanded":false,"pages":[{"title":"List access profiles","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/access-profiles","href":"/api-reference/access-profiles/list-access-profiles"},{"title":"Create access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/access-profiles","href":"/api-reference/access-profiles/create-access-profile"},{"title":"Get access profile by ID","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/access-profiles/{profile_id}","href":"/api-reference/access-profiles/get-access-profile-by-id"},{"title":"Update access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/access-profiles/{profile_id}","href":"/api-reference/access-profiles/update-access-profile"},{"title":"Delete access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/access-profiles/{profile_id}","href":"/api-reference/access-profiles/delete-access-profile"},{"title":"Activate access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/access-profiles/{profile_id}/activate","href":"/api-reference/access-profiles/activate-access-profile"},{"title":"Deactivate access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/access-profiles/{profile_id}/deactivate","href":"/api-reference/access-profiles/deactivate-access-profile"},{"title":"Clone an access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/access-profiles/{profile_id}/clone","href":"/api-reference/access-profiles/clone-an-access-profile"},{"title":"Propagate template changes to user copies","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/access-profiles/{profile_id}/propagate","href":"/api-reference/access-profiles/propagate-template-changes-to-user-copies"},{"title":"Attach roles to access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/access-profiles/{profile_id}/roles","href":"/api-reference/access-profiles/attach-roles-to-access-profile"},{"title":"Detach role from access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/access-profiles/{profile_id}/roles/{role_id}","href":"/api-reference/access-profiles/detach-role-from-access-profile"},{"title":"List version snapshots for an access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/access-profiles/{profile_id}/versions","href":"/api-reference/access-profiles/list-version-snapshots-for-an-access-profile"},{"title":"Get a single version snapshot","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/access-profiles/{profile_id}/versions/{version}","href":"/api-reference/access-profiles/get-a-single-version-snapshot"},{"title":"List audit log entries for a single profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/access-profiles/{profile_id}/audit-logs","href":"/api-reference/access-profiles/list-audit-log-entries-for-a-single-profile"},{"title":"List workspace-wide audit log entries","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/access-profiles/audit-logs","href":"/api-reference/access-profiles/list-workspace-wide-audit-log-entries"},{"title":"List access profiles held by a user","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/{user_id}/access-profiles","href":"/api-reference/access-profiles/list-access-profiles-held-by-a-user"},{"title":"Detach a user's access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/users/{user_id}/access-profiles/{profile_id}","href":"/api-reference/access-profiles/detach-a-users-access-profile"},{"title":"Set a user's access-profile budget override","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/users/{user_id}/access-profiles/{profile_id}/budgets/{budget_id}/override","href":"/api-reference/access-profiles/set-a-users-access-profile-budget-override"},{"title":"Remove a user's access-profile budget override","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/users/{user_id}/access-profiles/{profile_id}/budgets/{budget_id}/override","href":"/api-reference/access-profiles/remove-a-users-access-profile-budget-override"},{"title":"Add an extra virtual key under a user's access profile (deprecated) (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/users/{user_id}/access-profiles/{profile_id}/virtual-keys","href":"/api-reference/access-profiles/add-an-extra-virtual-key-under-a-users-access-profile-deprecated-deprecated-path"},{"title":"Delete a virtual key from a user's access profile","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/users/{user_id}/access-profiles/virtual-keys/{vk_id}","href":"/api-reference/access-profiles/delete-a-virtual-key-from-a-users-access-profile"}]},{"group":"Projects","expanded":false,"pages":[{"title":"List projects","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/projects","href":"/api-reference/projects/list-projects"},{"title":"Create project","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/projects","href":"/api-reference/projects/create-project"},{"title":"Get project","description":"Returns one project with its caps, its provider and MCP access, and the\npart of its roster the caller may see. A project outside the caller's data\naccess reads as not found rather than forbidden.\n","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/projects/{project_id}","href":"/api-reference/projects/get-project"},{"title":"Update project","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/projects/{project_id}","href":"/api-reference/projects/update-project"},{"title":"Delete project","description":"Deletes the project with its providers, its caps, the spend recorded\nagainst them, and its roster. A roster is not a reason to refuse, so there\nis no force flag. Log rows keep the attribution they already carry.\n","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/projects/{project_id}","href":"/api-reference/projects/delete-project"},{"title":"List project members","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/projects/{project_id}/members","href":"/api-reference/projects/list-project-members"},{"title":"Add project members","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/projects/{project_id}/members","href":"/api-reference/projects/add-project-members"},{"title":"Update project member caps","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/projects/{project_id}/members/{member_id}","href":"/api-reference/projects/update-project-member-caps"},{"title":"Remove project member","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/projects/{project_id}/members/{member_id}","href":"/api-reference/projects/remove-project-member"},{"title":"List a user's projects","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/users/{user_id}/projects","href":"/api-reference/projects/list-a-users-projects"}]},{"group":"RBAC","expanded":false,"pages":[{"title":"List roles","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/rbac/roles","href":"/api-reference/rbac/list-roles"},{"title":"Create role","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/rbac/roles","href":"/api-reference/rbac/create-role"},{"title":"Get role by ID","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/rbac/roles/{role_id}","href":"/api-reference/rbac/get-role-by-id"},{"title":"Update role","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/rbac/roles/{role_id}","href":"/api-reference/rbac/update-role"},{"title":"Delete role","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/governance/rbac/roles/{role_id}","href":"/api-reference/rbac/delete-role"},{"title":"List permissions assigned to a role","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/rbac/roles/{role_id}/permissions","href":"/api-reference/rbac/list-permissions-assigned-to-a-role"},{"title":"Replace the permission set on a role","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/governance/rbac/roles/{role_id}/permissions","href":"/api-reference/rbac/replace-the-permission-set-on-a-role"},{"title":"List RBAC resources","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/rbac/resources","href":"/api-reference/rbac/list-rbac-resources"},{"title":"List RBAC operations","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/rbac/operations","href":"/api-reference/rbac/list-rbac-operations"},{"title":"List all RBAC permissions","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/rbac/permissions","href":"/api-reference/rbac/list-all-rbac-permissions"}]},{"group":"Audit Logs","expanded":false,"pages":[{"title":"List audit logs","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/audit-logs","href":"/api-reference/audit-logs/list-audit-logs"},{"title":"Get audit log filter data","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/audit-logs/filterdata","href":"/api-reference/audit-logs/get-audit-log-filter-data"},{"title":"Export audit logs","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/audit-logs/export","href":"/api-reference/audit-logs/export-audit-logs"},{"title":"Get audit log by ID","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/audit-logs/{id}","href":"/api-reference/audit-logs/get-audit-log-by-id"},{"title":"Verify audit log signature","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/governance/audit-logs/{id}/verify","href":"/api-reference/audit-logs/verify-audit-log-signature"}]},{"group":"Budgets \u0026 Rate Limits","expanded":false,"pages":[{"title":"List budgets","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/budgets","href":"/api-reference/governance/list-budgets"},{"title":"List rate limits","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/rate-limits","href":"/api-reference/governance/list-rate-limits"},{"title":"Approve a budget increase request","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/governance/budget-requests/{request_id}/approve","href":"/api-reference/governance/approve-a-budget-increase-request"}]},{"group":"Model Configs","expanded":false,"pages":[{"title":"List model limits","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/model-configs","href":"/api-reference/governance/list-model-limits"},{"title":"Create model config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/model-configs","href":"/api-reference/governance/create-model-config"},{"title":"Get model config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/model-configs/{mc_id}","href":"/api-reference/governance/get-model-config"},{"title":"Update model config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/model-configs/{mc_id}","href":"/api-reference/governance/update-model-config"},{"title":"Delete model config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/model-configs/{mc_id}","href":"/api-reference/governance/delete-model-config"}]},{"group":"Provider Governance","expanded":false,"pages":[{"title":"List provider governance","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/providers","href":"/api-reference/governance/list-provider-governance"},{"title":"Update provider governance","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/providers/{provider_name}","href":"/api-reference/governance/update-provider-governance"},{"title":"Delete provider governance","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/providers/{provider_name}","href":"/api-reference/governance/delete-provider-governance"}]},{"group":"Pricing Overrides","expanded":false,"pages":[{"title":"List pricing overrides","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/governance/pricing-overrides","href":"/api-reference/governance/list-pricing-overrides"},{"title":"Create pricing override","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/governance/pricing-overrides","href":"/api-reference/governance/create-pricing-override"},{"title":"Update pricing override","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/governance/pricing-overrides/{id}","href":"/api-reference/governance/update-pricing-override"},{"title":"Delete pricing override","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/governance/pricing-overrides/{id}","href":"/api-reference/governance/delete-pricing-override"}]}]},{"group":"Routing","pages":[{"group":"Routing Rules","expanded":false,"pages":[{"title":"List routing rules","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/routing/rules","href":"/api-reference/routing/list-routing-rules"},{"title":"Create routing rule","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/routing/rules","href":"/api-reference/routing/create-routing-rule"},{"title":"Get routing rule","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/routing/rules/{rule_id}","href":"/api-reference/routing/get-routing-rule"},{"title":"Update routing rule","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/routing/rules/{rule_id}","href":"/api-reference/routing/update-routing-rule"},{"title":"Delete routing rule","deprecated":null,"version":null,"openapi":"/openapi/openapi.json delete /api/routing/rules/{rule_id}","href":"/api-reference/routing/delete-routing-rule"}]},{"group":"Complexity Analyzer","expanded":false,"pages":[{"title":"Get complexity analyzer config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/routing/complexity-analyzer-config","href":"/api-reference/routing/get-complexity-analyzer-config"},{"title":"Update complexity analyzer config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json put /api/routing/complexity-analyzer-config","href":"/api-reference/routing/update-complexity-analyzer-config"},{"title":"Reset complexity analyzer config","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/routing/complexity-analyzer-config/reset","href":"/api-reference/routing/reset-complexity-analyzer-config"},{"title":"Get complexity classifier status","deprecated":null,"version":null,"openapi":"/openapi/openapi.json get /api/routing/complexity-analyzer-status","href":"/api-reference/routing/get-complexity-classifier-status"},{"title":"Retry failed complexity classifier warmup","deprecated":null,"version":null,"openapi":"/openapi/openapi.json post /api/routing/complexity-analyzer-status/retry","href":"/api-reference/routing/retry-failed-complexity-classifier-warmup"}]},{"group":"Adaptive Routing","expanded":false,"pages":[{"title":"Get adaptive routing settings","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/adaptive-routing/config","href":"/api-reference/adaptive-routing/get-adaptive-routing-settings"},{"title":"Update adaptive routing settings","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/adaptive-routing/config","href":"/api-reference/adaptive-routing/update-adaptive-routing-settings"}]},{"group":"Circuit Breaker","expanded":false,"pages":[{"title":"List circuit breaker policies","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/circuit-breaker/policies","href":"/api-reference/circuit-breaker/list-circuit-breaker-policies"},{"title":"Create circuit breaker policy","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json post /api/circuit-breaker/policies","href":"/api-reference/circuit-breaker/create-circuit-breaker-policy"},{"title":"Update circuit breaker policy","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json put /api/circuit-breaker/policies/{name}","href":"/api-reference/circuit-breaker/update-circuit-breaker-policy"},{"title":"Delete circuit breaker policy","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json delete /api/circuit-breaker/policies/{name}","href":"/api-reference/circuit-breaker/delete-circuit-breaker-policy"},{"title":"Get circuit breaker state","deprecated":null,"version":null,"tag":"Enterprise","openapi":"/openapi/openapi.json get /api/circuit-breaker/state","href":"/api-reference/circuit-breaker/get-circuit-breaker-state"}]}]},{"group":"Deprecated","pages":[{"group":"Virtual Keys","expanded":false,"pages":[{"title":"List users attached to a virtual key (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/virtual-keys/{vk_id}/users","href":"/api-reference/virtual-keys/list-users-attached-to-a-virtual-key-deprecated-path"},{"title":"Attach users to a virtual key (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/virtual-keys/{vk_id}/users","href":"/api-reference/virtual-keys/attach-users-to-a-virtual-key-deprecated-path"},{"title":"Detach a user from a virtual key (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/virtual-keys/{vk_id}/users/{user_id}","href":"/api-reference/virtual-keys/detach-a-user-from-a-virtual-key-deprecated-path"}]},{"group":"Teams","expanded":false,"pages":[{"title":"List customers attached to a team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/teams/{team_id}/customers","href":"/api-reference/teams/list-customers-attached-to-a-team-deprecated-path"},{"title":"Attach a customer to a team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/teams/{team_id}/customers","href":"/api-reference/teams/attach-a-customer-to-a-team-deprecated-path"},{"title":"Detach a customer from a team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/teams/{team_id}/customers/{customer_id}","href":"/api-reference/teams/detach-a-customer-from-a-team-deprecated-path"},{"title":"List team members (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/teams/{team_id}/members","href":"/api-reference/teams/list-team-members-deprecated-path"},{"title":"Add team member (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/teams/{team_id}/members","href":"/api-reference/teams/add-team-member-deprecated-path"},{"title":"Remove team member (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/teams/{team_id}/members/{user_id}","href":"/api-reference/teams/remove-team-member-deprecated-path"}]},{"group":"Customers","expanded":false,"pages":[{"title":"List teams attached to a customer (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/customers/{customer_id}/teams","href":"/api-reference/customers/list-teams-attached-to-a-customer-deprecated-path"}]},{"group":"RBAC","expanded":false,"pages":[{"title":"List roles (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/roles","href":"/api-reference/rbac/list-roles-deprecated-path"},{"title":"Create role (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/roles","href":"/api-reference/rbac/create-role-deprecated-path"},{"title":"Get role by ID (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/roles/{role_id}","href":"/api-reference/rbac/get-role-by-id-deprecated-path"},{"title":"Update role (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/roles/{role_id}","href":"/api-reference/rbac/update-role-deprecated-path"},{"title":"Delete role (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/roles/{role_id}","href":"/api-reference/rbac/delete-role-deprecated-path"},{"title":"List permissions assigned to a role (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/roles/{role_id}/permissions","href":"/api-reference/rbac/list-permissions-assigned-to-a-role-deprecated-path"},{"title":"Replace the permission set on a role (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/roles/{role_id}/permissions","href":"/api-reference/rbac/replace-the-permission-set-on-a-role-deprecated-path"},{"title":"List RBAC resources (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/resources","href":"/api-reference/rbac/list-rbac-resources-deprecated-path"},{"title":"List RBAC operations (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/operations","href":"/api-reference/rbac/list-rbac-operations-deprecated-path"},{"title":"List all RBAC permissions (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/permissions","href":"/api-reference/rbac/list-all-rbac-permissions-deprecated-path"}]},{"group":"Users","expanded":false,"pages":[{"title":"List users (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users","href":"/api-reference/users/list-users-deprecated-path"},{"title":"Create user (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/users","href":"/api-reference/users/create-user-deprecated-path"},{"title":"Get user (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/{user_id}","href":"/api-reference/users/get-user-deprecated-path"},{"title":"Delete user (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/users/{user_id}","href":"/api-reference/users/delete-user-deprecated-path"},{"title":"Get current user permissions (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/me/permissions","href":"/api-reference/users/get-current-user-permissions-deprecated-path"},{"title":"Assign role to user (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/users/{user_id}/role","href":"/api-reference/users/assign-role-to-user-deprecated-path"},{"title":"Get user's teams (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/{user_id}/teams","href":"/api-reference/users/get-users-teams-deprecated-path"},{"title":"Update user's team assignments (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/users/{user_id}/teams","href":"/api-reference/users/update-users-team-assignments-deprecated-path"},{"title":"Get user's virtual keys by email (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/email/{email}/virtual-keys","href":"/api-reference/users/get-users-virtual-keys-by-email-deprecated-path"},{"title":"Get user by email (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/email/{email}","href":"/api-reference/users/get-user-by-email-deprecated-path"},{"title":"List virtual keys available to a user (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/{user_id}/virtual-keys","href":"/api-reference/users/list-virtual-keys-available-to-a-user-deprecated-path"}]},{"group":"Governance","expanded":false,"pages":[{"title":"List teams (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/teams","href":"/api-reference/governance/list-teams-deprecated-path"},{"title":"Create team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/teams","href":"/api-reference/governance/create-team-deprecated-path"},{"title":"Get team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/teams/{team_id}","href":"/api-reference/governance/get-team-deprecated-path"},{"title":"Update team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/teams/{team_id}","href":"/api-reference/governance/update-team-deprecated-path"},{"title":"Delete team (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/teams/{team_id}","href":"/api-reference/governance/delete-team-deprecated-path"}]},{"group":"Access Profiles","expanded":false,"pages":[{"title":"List access profiles (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/access-profiles","href":"/api-reference/access-profiles/list-access-profiles-deprecated-path"},{"title":"Create access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/access-profiles","href":"/api-reference/access-profiles/create-access-profile-deprecated-path"},{"title":"Get access profile by ID (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/access-profiles/{profile_id}","href":"/api-reference/access-profiles/get-access-profile-by-id-deprecated-path"},{"title":"Update access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/access-profiles/{profile_id}","href":"/api-reference/access-profiles/update-access-profile-deprecated-path"},{"title":"Delete access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/access-profiles/{profile_id}","href":"/api-reference/access-profiles/delete-access-profile-deprecated-path"},{"title":"Activate access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/access-profiles/{profile_id}/activate","href":"/api-reference/access-profiles/activate-access-profile-deprecated-path"},{"title":"Deactivate access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/access-profiles/{profile_id}/deactivate","href":"/api-reference/access-profiles/deactivate-access-profile-deprecated-path"},{"title":"Clone an access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/access-profiles/{profile_id}/clone","href":"/api-reference/access-profiles/clone-an-access-profile-deprecated-path"},{"title":"Propagate template changes to user copies (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/access-profiles/{profile_id}/propagate","href":"/api-reference/access-profiles/propagate-template-changes-to-user-copies-deprecated-path"},{"title":"Attach roles to access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/access-profiles/{profile_id}/roles","href":"/api-reference/access-profiles/attach-roles-to-access-profile-deprecated-path"},{"title":"Detach role from access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/access-profiles/{profile_id}/roles/{role_id}","href":"/api-reference/access-profiles/detach-role-from-access-profile-deprecated-path"},{"title":"List version snapshots for an access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/access-profiles/{profile_id}/versions","href":"/api-reference/access-profiles/list-version-snapshots-for-an-access-profile-deprecated-path"},{"title":"Get a single version snapshot (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/access-profiles/{profile_id}/versions/{version}","href":"/api-reference/access-profiles/get-a-single-version-snapshot-deprecated-path"},{"title":"List audit log entries for a single profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/access-profiles/{profile_id}/audit-logs","href":"/api-reference/access-profiles/list-audit-log-entries-for-a-single-profile-deprecated-path"},{"title":"List workspace-wide audit log entries (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/access-profiles/audit-logs","href":"/api-reference/access-profiles/list-workspace-wide-audit-log-entries-deprecated-path"},{"title":"List access profiles held by a user (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/users/{user_id}/access-profiles","href":"/api-reference/access-profiles/list-access-profiles-held-by-a-user-deprecated-path"},{"title":"Set a user's access-profile budget override (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/users/{user_id}/access-profiles/{profile_id}/budgets/{budget_id}/override","href":"/api-reference/access-profiles/set-a-users-access-profile-budget-override-deprecated-path"},{"title":"Remove a user's access-profile budget override (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/users/{user_id}/access-profiles/{profile_id}/budgets/{budget_id}/override","href":"/api-reference/access-profiles/remove-a-users-access-profile-budget-override-deprecated-path"},{"title":"Detach a user's access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/users/{user_id}/access-profiles/{profile_id}","href":"/api-reference/access-profiles/detach-a-users-access-profile-deprecated-path"},{"title":"Add an extra virtual key under a user's access profile (deprecated) (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json post /api/users/{user_id}/access-profiles/{profile_id}/virtual-keys","href":"/api-reference/access-profiles/add-an-extra-virtual-key-under-a-users-access-profile-deprecated-deprecated-path"},{"title":"Delete a virtual key from a user's access profile (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json delete /api/users/{user_id}/access-profiles/virtual-keys/{vk_id}","href":"/api-reference/access-profiles/delete-a-virtual-key-from-a-users-access-profile-deprecated-path"}]},{"group":"Audit Logs","expanded":false,"pages":[{"title":"List audit logs (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/audit-logs","href":"/api-reference/audit-logs/list-audit-logs-deprecated-path"},{"title":"Get audit log filter data (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/audit-logs/filterdata","href":"/api-reference/audit-logs/get-audit-log-filter-data-deprecated-path"},{"title":"Export audit logs (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/audit-logs/export","href":"/api-reference/audit-logs/export-audit-logs-deprecated-path"},{"title":"Get audit log by ID (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/audit-logs/{id}","href":"/api-reference/audit-logs/get-audit-log-by-id-deprecated-path"},{"title":"Verify audit log signature (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/audit-logs/{id}/verify","href":"/api-reference/audit-logs/verify-audit-log-signature-deprecated-path"}]},{"group":"Adaptive Routing","expanded":false,"pages":[{"title":"Get adaptive routing settings (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json get /api/load-balancer-config","href":"/api-reference/adaptive-routing/get-adaptive-routing-settings-deprecated-path"},{"title":"Update adaptive routing settings (deprecated path)","deprecated":true,"version":null,"tag":"Removing soon","openapi":"/openapi/openapi.json put /api/load-balancer-config","href":"/api-reference/adaptive-routing/update-adaptive-routing-settings-deprecated-path"}]}]}]},{"tab":"Contributing","icon":"code-pull-request","pages":[{"title":"Contributing","href":"/contributing/setting-up-repo"}]},{"tab":"Benchmarks","icon":"chart-line","pages":[{"title":"Benchmarks","href":"/benchmarking/getting-started"}]},{"tab":"Changelogs","icon":"bolt","menu":[{"item":"Open Source","icon":"rocket","pages":[{"title":"Open Source","href":"/changelogs/v2.3.2"}]},{"item":"Enterprise","icon":"building","pages":[{"title":"Enterprise","href":"/changelogs/ent-v2.3.2"}]},{"item":"Edge","icon":"grip","pages":[{"title":"Edge","href":"/changelogs/edge-v0.9.4"}]},{"item":"Bifrost CLI","icon":"laptop-code","pages":[{"title":"Bifrost CLI","href":"/changelogs/cli-v1.0.0"}]},{"item":"Helm","icon":"box","pages":[{"title":"Helm","href":"/changelogs/helm-v2.1.45"}]}],"pages":[{"title":"Changelogs","href":"/changelogs/v2.3.2"}]}]},"title":"Update project - Bifrost","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-BRm_l__d.js","utils-f1l1Oc-G.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BlhqDhJO.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DHCB7rsC.js","snippetPresets-CYXLx6Hv.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-B78P2dEq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C4YLPVAh.js","shallow-vlLnTDkQ.js","getApiPlaygroundDisplay-D_98hhvf.js","CodeSnippet-DtnZHGqq.js","CodeSnippets-CLFb8KJt.js","Page-kQh739Uz.js","getPastedJson-Cq-zlbnU.js","icon-sN3t983t.js","MethodPill-P_YQ2s09.js","DuplicateIcon-BVzyNsGJ.js","createIcon-B3jqgqC6.js","DynamicMarkdown-Crwq6WG_.js","SectionHeading-C7pGS2Bb.js","axios-vUo_bRtp.js","Markdown-BuPH8yuW.js","clsx-CCOYKgaU.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BnkC_6oA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BM4S31-f.js"]}