{"openapi":"3.1.0","info":{"title":"kenari API","version":"1.0.0","summary":"OpenAI- and Anthropic-compatible LLM gateway, billed in Indonesian Rupiah.","description":"kenari exposes one base URL that speaks both the OpenAI Chat Completions API and the Anthropic Messages API. It routes each request to an upstream provider, meters tokens, and debits Rupiah from a prepaid balance. Point an OpenAI SDK at `https:\/\/kenari.id\/v1` and an Anthropic SDK at `https:\/\/kenari.id` (it adds `\/v1\/messages` itself), and keep the rest of your code.\n\nAuthenticate with an API key created in the dashboard (`Authorization: Bearer kn-...`). `GET \/v1\/models` is public; the chat, messages, and image endpoints require a key. Bring your own provider key (BYOK) in the dashboard and traffic served by your key costs nothing.\n\nPrices in this spec and in `GET \/v1\/models` are micro-Rupiah per 1,000,000 tokens (Rupiah times 1,000,000). Divide by 1,000,000 for Rupiah per 1M tokens.","contact":{"name":"kenari","url":"https:\/\/kenari.id\/docs"},"license":{"name":"Proprietary"}},"servers":[{"url":"https:\/\/kenari.id","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Models","description":"Discover available models and live pricing."},{"name":"Tools","description":"The tools kenari offers an agent over MCP, for a client that discovers them at runtime."},{"name":"Chat","description":"OpenAI-compatible chat completions."},{"name":"Messages","description":"Anthropic-compatible messages."},{"name":"Responses","description":"OpenAI Responses API compatible, stateless subset for coding-agent clients."},{"name":"Images","description":"OpenAI-compatible image generation."},{"name":"Embeddings","description":"OpenAI-compatible embeddings, billed per input token."},{"name":"Rerank","description":"Cohere-style document reranking, billed per input token."},{"name":"Audio","description":"OpenAI-compatible text-to-speech and speech-to-text."},{"name":"Music","description":"OpenAI-compatible music generation, billed per song."},{"name":"Web","description":"Direct web search and fetch, billed per search."},{"name":"Video","description":"Async video generation, billed per second of rendered video."},{"name":"Account","description":"Account plan and coupon quota."},{"name":"Workspace","description":"Manage a team workspace with an API key that has workspace access: members, invites, seats, PAYG limits and funding."},{"name":"Anthropic passthrough","description":"Forwards Managed Agents (agents, environments, sessions, vaults, deployments, deployment runs, memory stores), Files, Skills and Message Batches to Anthropic with your own Anthropic API key, and streams the response back. Members only. Shared keys and keys with a model scope, spend cap or token cap are refused with HTTP 403. With exactly one connected Anthropic API key it is used automatically. With more than one, name one in the x-kenari-credential header (HTTP 409 credential_required without it, HTTP 404 credential_not_found for an id that is not an active key of this account). With none, HTTP 409 anthropic_credential_required. Only anthropic-version, anthropic-beta, content-type, accept and last-event-id are forwarded. Request bodies up to 100 MB. Not metered by kenari, the Anthropic organization behind your key is billed directly."}],"paths":{"\/v1\/agents":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsGet","summary":"Agents: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsPost","summary":"Agents: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsPut","summary":"Agents: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsPatch","summary":"Agents: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsDelete","summary":"Agents: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/agents\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsGetPath","summary":"Agents: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsPostPath","summary":"Agents: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsPutPath","summary":"Agents: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsPatchPath","summary":"Agents: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicAgentsDeletePath","summary":"Agents: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/agents` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/environments":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsGet","summary":"Environments: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsPost","summary":"Environments: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsPut","summary":"Environments: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsPatch","summary":"Environments: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsDelete","summary":"Environments: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/environments\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsGetPath","summary":"Environments: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsPostPath","summary":"Environments: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsPutPath","summary":"Environments: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsPatchPath","summary":"Environments: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicEnvironmentsDeletePath","summary":"Environments: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/environments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/sessions":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsGet","summary":"Sessions: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsPost","summary":"Sessions: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsPut","summary":"Sessions: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsPatch","summary":"Sessions: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsDelete","summary":"Sessions: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/sessions\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsGetPath","summary":"Sessions: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsPostPath","summary":"Sessions: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsPutPath","summary":"Sessions: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsPatchPath","summary":"Sessions: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicSessionsDeletePath","summary":"Sessions: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/sessions` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/vaults":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsGet","summary":"Vaults: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsPost","summary":"Vaults: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsPut","summary":"Vaults: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsPatch","summary":"Vaults: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsDelete","summary":"Vaults: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/vaults\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsGetPath","summary":"Vaults: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsPostPath","summary":"Vaults: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsPutPath","summary":"Vaults: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsPatchPath","summary":"Vaults: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicVaultsDeletePath","summary":"Vaults: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/vaults` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/deployments":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsGet","summary":"Deployments: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsPost","summary":"Deployments: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsPut","summary":"Deployments: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsPatch","summary":"Deployments: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsDelete","summary":"Deployments: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/deployments\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsGetPath","summary":"Deployments: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsPostPath","summary":"Deployments: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsPutPath","summary":"Deployments: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsPatchPath","summary":"Deployments: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentsDeletePath","summary":"Deployments: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/deployments` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/deployment_runs":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsGet","summary":"Deployment runs: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsPost","summary":"Deployment runs: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsPut","summary":"Deployment runs: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsPatch","summary":"Deployment runs: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsDelete","summary":"Deployment runs: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/deployment_runs\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsGetPath","summary":"Deployment runs: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsPostPath","summary":"Deployment runs: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsPutPath","summary":"Deployment runs: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsPatchPath","summary":"Deployment runs: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicDeploymentRunsDeletePath","summary":"Deployment runs: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/deployment_runs` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/memory_stores":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresGet","summary":"Memory stores: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresPost","summary":"Memory stores: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresPut","summary":"Memory stores: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresPatch","summary":"Memory stores: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresDelete","summary":"Memory stores: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/memory_stores\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresGetPath","summary":"Memory stores: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresPostPath","summary":"Memory stores: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresPutPath","summary":"Memory stores: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresPatchPath","summary":"Memory stores: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicMemoryStoresDeletePath","summary":"Memory stores: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/memory_stores` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/files":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesGet","summary":"Files: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesPost","summary":"Files: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesPut","summary":"Files: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesPatch","summary":"Files: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesDelete","summary":"Files: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/files\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesGetPath","summary":"Files: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesPostPath","summary":"Files: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesPutPath","summary":"Files: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesPatchPath","summary":"Files: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicFilesDeletePath","summary":"Files: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/files` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/skills":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsGet","summary":"Skills: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsPost","summary":"Skills: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsPut","summary":"Skills: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsPatch","summary":"Skills: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsDelete","summary":"Skills: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/skills\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsGetPath","summary":"Skills: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsPostPath","summary":"Skills: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsPutPath","summary":"Skills: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsPatchPath","summary":"Skills: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicSkillsDeletePath","summary":"Skills: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/skills` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/messages\/batches":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesGet","summary":"Message Batches: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesPost","summary":"Message Batches: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesPut","summary":"Message Batches: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesPatch","summary":"Message Batches: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesDelete","summary":"Message Batches: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/messages\/batches\/{path}":{"get":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesGetPath","summary":"Message Batches: GET passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"post":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesPostPath","summary":"Message Batches: POST passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"put":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesPutPath","summary":"Message Batches: PUT passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"patch":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesPatchPath","summary":"Message Batches: PATCH passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}},"delete":{"tags":["Anthropic passthrough"],"operationId":"anthropicMessagesBatchesDeletePath","summary":"Message Batches: DELETE passthrough","description":"Forwarded to Anthropic's `\/v1\/messages\/batches` API with your own Anthropic API key. See the Anthropic passthrough tag for the rules.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"The rest of the Anthropic path, possibly several segments. Encoded slashes and `..` are refused with HTTP 400."},{"$ref":"#\/components\/parameters\/AnthropicCredential"}],"responses":{"200":{"description":"Anthropic's response as returned, streamed without buffering. Other Anthropic statuses pass through too, except 502 and 504 which become HTTP 503. Anthropic's request id arrives as `anthropic-request-id`.","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"401":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"403":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"404":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"409":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"413":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"429":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"500":{"$ref":"#\/components\/responses\/ManagedAgentsError"},"503":{"$ref":"#\/components\/responses\/ManagedAgentsError"}}}},"\/v1\/models":{"get":{"tags":["Models"],"operationId":"listModels","summary":"List models and live pricing","description":"Returns the models the gateway can serve, with live per-token pricing in Rupiah and capability metadata (context window, modalities, reasoning, tool calling). Public: no key required. The set of models is dynamic, so query this endpoint instead of hardcoding a list. With an admin key the items also carry an internal `backends` array.\n\nBy default the listing is chat-only (same shape as OpenRouter). Pass `?modality=embedding`, `?modality=rerank`, `?modality=moderation`, or `?modality=systemone` to list only models of that specialized modality, with that modality's per-1M rate carried in `pricing.input`. Any other value returns `400` with the accepted values in the error message. The absent-param behavior is preserved byte for byte so existing chat clients keep working.","security":[{},{"bearerAuth":[]}],"parameters":[{"name":"modality","in":"query","required":false,"schema":{"type":"string","enum":["embedding","rerank","moderation","systemone"],"description":"Filter to one specialized modality. Absent returns chat models only."}}],"responses":{"200":{"description":"An OpenAI-style list envelope.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ModelList"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/models\/changes":{"get":{"tags":["Models"],"operationId":"listCatalogChanges","summary":"List recent catalog changes","description":"Public: no key required. Price changes, plan changes, new revisions of a model and new and retired models, newest first by confirmation time. A change appears here only once it is confirmed: price, plan and revision changes after they hold for about ten minutes, new models and removals after about an hour, and scheduled price changes and retirements at once. The items carry model ids, Rupiah prices per 1M tokens (per image for image models, per the unit of each price line for models priced by lines) and, for a revision, its version text and note, nothing else. `channel` is the public Telegram channel handle that gets the same changes, or null.","security":[{},{"bearerAuth":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Epoch seconds. Only changes confirmed at or after this moment, the moment a change enters this list. A poller can pass the time of its last poll."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"description":"Page size. Values above 200 are clamped to 200."}],"responses":{"200":{"description":"The changes, newest first.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CatalogChangeList"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/tools":{"get":{"tags":["Tools"],"operationId":"listTools","summary":"List the agent tools","description":"Public: no key required. The tools the kenari MCP server at \/mcp lists, with each tool's input schema, its MCP annotations and how it bills: free, per_call (a flat fee per call, or per song), per_token (the model's price per token), per_page (a price per page read), per_second (a price per second of audio or video), per_image (a price per image made) or per_1k_chars (a price per 1,000 characters of text). A tool that bills runs the matching \/v1 route and is charged exactly like that route. Cached for 5 minutes.","security":[{}],"responses":{"200":{"description":"The tools.","content":{"application\/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"type":"object","required":["object","name","title","description","input_schema","annotations","billing"],"properties":{"object":{"type":"string","enum":["tool"]},"name":{"type":"string","example":"kenari_ask"},"title":{"type":"string"},"description":{"type":"string"},"input_schema":{"type":"object","description":"JSON Schema of the tool's arguments."},"annotations":{"type":"object","properties":{"title":{"type":"string"},"readOnlyHint":{"type":"boolean"},"destructiveHint":{"type":"boolean"},"idempotentHint":{"type":"boolean"},"openWorldHint":{"type":"boolean"}}},"billing":{"type":"string","enum":["free","per_call","per_token","per_page","per_second","per_image","per_1k_chars"]}}}}}}}}}}}},"\/v1\/chat\/completions":{"post":{"tags":["Chat"],"operationId":"createChatCompletion","summary":"Create a chat completion","description":"OpenAI-compatible. The request and response bodies match the OpenAI Chat Completions schema; unspecified fields are forwarded to the upstream model. The routing fields `provider`, `models` and `route` are forwarded only on your own keys, never on kenari-owned lanes. `plugins` is read by kenari's file parser and never forwarded. Set `stream: true` for a `text\/event-stream` of `data:` chunks ending with `data: [DONE]`. The `model` field accepts a model id from `GET \/v1\/models`, a `:free` variant, one of your named routes, or a BYOK id of the form `byok\/<provider>\/<upstream-model-id>`, which dispatches on a provider key you saved in the dashboard and costs nothing.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChatCompletionRequest"}}}},"responses":{"200":{"description":"A chat completion, or a Server-Sent Event stream when `stream` is true.","headers":{"x-kenari-plan-remaining":{"$ref":"#\/components\/headers\/KenariPlanRemaining"},"x-kenari-balance-micro-idr":{"$ref":"#\/components\/headers\/KenariBalanceMicroIdr"},"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChatCompletionResponse"}},"text\/event-stream":{"schema":{"type":"string","description":"`data:` lines, each carrying an OpenAI chat completion chunk; the stream ends with `data: [DONE]`."}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/messages":{"post":{"tags":["Messages"],"operationId":"createMessage","summary":"Create a message","description":"Anthropic-compatible. The request and response bodies match the Anthropic Messages schema. The routing fields `provider`, `models` and `route` are forwarded only on your own keys, never on kenari-owned lanes. `plugins` is not used on this route and is never forwarded. `max_tokens` is optional; when omitted the server applies a default. Set `stream: true` for Anthropic-style SSE events (`message_start`, `content_block_delta`, `message_stop`). Errors use the Anthropic error envelope.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MessagesRequest"}}}},"responses":{"200":{"description":"A message, or an Anthropic-style SSE stream when `stream` is true.","headers":{"x-kenari-plan-remaining":{"$ref":"#\/components\/headers\/KenariPlanRemaining"},"x-kenari-balance-micro-idr":{"$ref":"#\/components\/headers\/KenariBalanceMicroIdr"},"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MessagesResponse"}},"text\/event-stream":{"schema":{"type":"string","description":"Anthropic-style `event:`\/`data:` SSE blocks."}}}},"400":{"$ref":"#\/components\/responses\/AnthropicError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/AnthropicError"},"403":{"$ref":"#\/components\/responses\/AnthropicError"},"404":{"$ref":"#\/components\/responses\/AnthropicError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLargeAnthropic"},"415":{"$ref":"#\/components\/responses\/AnthropicError"},"422":{"$ref":"#\/components\/responses\/AnthropicError"},"429":{"$ref":"#\/components\/responses\/AnthropicError"},"500":{"$ref":"#\/components\/responses\/AnthropicError"},"503":{"$ref":"#\/components\/responses\/AnthropicError"}}}},"\/v1\/messages\/count_tokens":{"post":{"tags":["Messages"],"operationId":"countMessageTokens","summary":"Count input tokens","description":"Anthropic-compatible. Takes the same request body as `\/v1\/messages` and returns an estimated input token count for client-side context tracking. Read-only: it does not dispatch to a model, bill the wallet, or validate the model id.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MessagesRequest"}}}},"responses":{"200":{"description":"Estimated input token count.","content":{"application\/json":{"schema":{"type":"object","required":["input_tokens"],"properties":{"input_tokens":{"type":"integer","description":"Estimated input token count."}}}}}},"400":{"$ref":"#\/components\/responses\/AnthropicError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"413":{"$ref":"#\/components\/responses\/PayloadTooLargeAnthropic"},"500":{"$ref":"#\/components\/responses\/AnthropicError"}}}},"\/v1\/responses":{"post":{"tags":["Responses"],"operationId":"createResponse","summary":"Create a response","description":"OpenAI Responses API compatible, stateless subset for coding-agent clients (e.g. Codex CLI with wire_api = \"responses\"). Supports the input item shapes message (developer\/user\/assistant), function_call, and function_call_output; flat top-level function tools; tool_choice; and reasoning.effort. `store` is accepted and ignored, kenari never persists a response server-side; a non-null `previous_response_id` returns 400 since there is nothing to chain from. The routing fields `provider`, `models` and `route` and the field `plugins` are not read on this route, so they are never forwarded, on your own keys or on kenari-owned lanes. Set `stream: true` for a `text\/event-stream` of Responses-style SSE events (`response.created`, `response.output_item.added`, `response.output_text.delta` \/ `response.function_call_arguments.delta`, `response.output_item.done`, `response.completed`).","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResponsesRequest"}}}},"responses":{"200":{"description":"A response, or a Responses-style SSE stream when `stream` is true.","headers":{"x-kenari-plan-remaining":{"$ref":"#\/components\/headers\/KenariPlanRemaining"},"x-kenari-balance-micro-idr":{"$ref":"#\/components\/headers\/KenariBalanceMicroIdr"},"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResponsesResponse"}},"text\/event-stream":{"schema":{"type":"string","description":"Responses-style `event:`\/`data:` SSE blocks."}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/images\/generations":{"post":{"tags":["Images"],"operationId":"createImage","summary":"Generate an image","description":"OpenAI-compatible image generation, for models flagged as image models in the catalog. Billed per generated image (n times the model's per-image price), debited from your wallet. Calling it with a text model returns 400. Long jobs hold the connection open with a heartbeat; read the full body before parsing.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageRequest"}}}},"responses":{"200":{"description":"An OpenAI-style image response.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageResponse"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/images\/edits":{"post":{"tags":["Images"],"operationId":"createImageEdit","summary":"Edit an image (image-to-image)","description":"OpenAI-compatible image editing, for models flagged as image models in the catalog. Accepts multipart\/form-data with one or more `image` files (repeat the field, up to 16), a `prompt`, and a `model`. An optional `mask` file restricts the edit to the transparent region. Billed per generated image (n times the model's per-image price), not per source file, debited from your wallet. Calling it with a text model returns 400. Long jobs hold the connection open with a heartbeat. Read the full body before parsing.","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","required":["image","prompt","model"],"properties":{"image":{"type":"array","items":{"type":"string","format":"binary"},"description":"One or more source images to edit. Repeat the `image` (or `image[]`) form field. Up to 16 files. PNG, JPEG, or WebP. Billed per generated image (`n`), not per source file."},"mask":{"type":"string","format":"binary","description":"Optional PNG mask; transparent regions mark where the edit applies."},"prompt":{"type":"string","description":"Description of the desired edit."},"model":{"type":"string","description":"Image model id from the catalog, e.g. `gpt-image-2`."},"n":{"type":"integer","description":"Number of images. Default `1`."},"size":{"type":"string","description":"Image size, e.g. \"1024x1024\"."},"response_format":{"type":"string","enum":["url","b64_json"],"description":"Output format. Default is url."},"quality":{"type":"string","enum":["low","medium","high","xhigh","max","auto","standard"],"description":"Optional render quality. Applied when the model supports it."},"output_format":{"type":"string","enum":["png","jpeg","webp"],"description":"Optional image file format. Applied when the model supports it."},"output_compression":{"type":"integer","minimum":0,"maximum":100,"description":"Optional compression for webp or jpeg. Applied when the model supports it."},"input_fidelity":{"type":"string","enum":["high","low"],"description":"Optional. How closely the edit follows the source. Applied when the model supports it."},"user":{"type":"string","description":"Accepted for SDK compatibility. Not forwarded."},"safety_identifier":{"type":"string","description":"Accepted for SDK compatibility. Not forwarded."}}}}}},"responses":{"200":{"description":"An OpenAI-style image response.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageResponse"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/embeddings":{"post":{"tags":["Embeddings"],"operationId":"createEmbedding","summary":"Create embeddings","description":"OpenAI-compatible embeddings, for models flagged as embedding models in the catalog. Billed per input token (a deterministic local estimate, since the upstream reports no usage), debited from your wallet. Calling it with a non-embedding model returns 400.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EmbeddingRequest"}}}},"responses":{"200":{"description":"An OpenAI-style embeddings response.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EmbeddingResponse"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/moderations":{"post":{"tags":["Moderations"],"operationId":"createModeration","summary":"Classify content","description":"OpenAI-compatible moderations, for models flagged as moderation models in the catalog. Billed per input token (a deterministic local estimate), debited from your wallet; free by default. Calling it with a non-moderation model returns 400.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ModerationRequest"}}}},"responses":{"200":{"description":"An OpenAI-style moderations response.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ModerationResponse"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/rerank":{"post":{"tags":["Rerank"],"operationId":"createRerank","summary":"Rerank documents","description":"Cohere-style reranking, for models flagged as rerank models in the catalog. Billed per input token (query plus every document, a deterministic local estimate), debited from your wallet. Calling it with a non-rerank model returns 400. Request size limits: up to 100 documents, 8192 bytes per document, 512 KiB combined document size, 8192 bytes for the query.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RerankRequest"}}}},"responses":{"200":{"description":"A Cohere-style rerank response, sorted best match first.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RerankResponse"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/systemone":{"post":{"tags":["System One"],"operationId":"createSystemOne","summary":"Evaluate a System One model","description":"System One evaluation for models such as Jev, Clef and Clairic. Send a state plus typed questions (noul, choice, score, or box) and receive one typed answer per question. Clairic extracts values instead: send fields in place of questions and receive one typed value per field. Send exactly one of questions or fields. Models whose input modalities include image also take images in assets or images. Models whose input modalities include audio or video also take audio clips and videos, as base64 only. Billed per input token from usage.input_tokens, images, audio and video included. Output tokens are reported and not billed. There is no streaming. The whole request body, images, audio and video included, is at most 32 MiB, and a larger one returns 413. Calling it with a model that is not a System One model returns 400, and so does sending something the model cannot take.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/SystemOneRequest"}}}},"responses":{"200":{"description":"One answer per question, plus token usage.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/SystemOneResponse"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/audio\/speech":{"post":{"tags":["Audio"],"operationId":"createSpeech","summary":"Text to speech","description":"OpenAI-compatible text-to-speech, for models flagged as TTS models in the catalog. Billed per 1k input characters (rounded up), debited from your wallet. Returns raw audio bytes (default audio\/mpeg). Calling it with a non-TTS model returns 400.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string"},"input":{"type":"string","description":"Text to synthesize. When the model publishes `max_input_chars` in `\/v1\/models`, an input longer than that is rejected with a 400 and nothing is charged. Synthesis is not streamed and the upstream enforces its own time limit, so a long input on a model with no published ceiling can still time out: split long text into several requests."},"voice":{"type":"string","description":"Optional voice id, matched case-insensitively. Voice names are specific to the model, so a value valid for one model may be rejected by another: read the model's `voices` array from `\/v1\/models` for the legal names. Omit it to get the model's default (the first entry of that array). When the model publishes `voices` and this value is not one of them, the request is rejected with a 400 naming the legal values."},"response_format":{"type":"string","enum":["mp3","wav","pcm","opus","aac","flac"],"description":"Output audio format, matched case-insensitively. These six are the formats this gateway can label a response with, but a given model may produce only some of them: read the model's `formats` array from `\/v1\/models` for what it actually serves. Omit it to get the model's default (the first entry of that array, or mp3 when the model publishes no `formats`). When the model publishes `formats` and this value is not one of them, the request is rejected with a 400 naming the legal values, because returning a different format than the one requested would mislabel the response. A model that publishes no `formats` accepts only mp3, wav and pcm, and quietly serves mp3 for anything else."},"speed":{"type":"number"},"language":{"type":"string","description":"Optional language hint. Default \"auto\"."}}}}}},"responses":{"200":{"description":"Raw audio bytes. The Content-Type follows the format this gateway resolved and sent upstream, never the upstream's own header. That is the requested `response_format` in every case except a model publishing no `formats`, where an unsupported request resolves to mp3 and the header says `audio\/mpeg`.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"audio\/mpeg":{"schema":{"type":"string","format":"binary"}},"audio\/wav":{"schema":{"type":"string","format":"binary"}},"audio\/pcm":{"schema":{"type":"string","format":"binary"}},"audio\/ogg":{"schema":{"type":"string","format":"binary"}},"audio\/aac":{"schema":{"type":"string","format":"binary"}},"audio\/flac":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/audio\/transcriptions":{"post":{"tags":["Audio"],"operationId":"createTranscription","summary":"Speech to text","description":"OpenAI-compatible speech-to-text, for models flagged as STT models in the catalog. Accepts multipart\/form-data with a `file` field (audio bytes) and a `model` field. Billed per second of audio (duration rounded up), debited from your wallet. Calling it with a non-STT model returns 400.","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","required":["file","model"],"properties":{"file":{"type":"string","format":"binary","description":"Audio file to transcribe."},"model":{"type":"string","description":"STT model id from the catalog."},"language":{"type":"string","description":"Optional ISO-639-1 language code, e.g. 'en' or 'id'."},"prompt":{"type":"string","description":"Optional context hint to improve accuracy."},"temperature":{"type":"number","minimum":0,"maximum":1,"description":"Sampling temperature (0 is deterministic)."},"response_format":{"type":"string","enum":["json","text","verbose_json","srt","vtt"],"description":"Output format. gpt-transcribe accepts only json and text. text, srt and vtt return plain text. verbose_json includes segments and duration. Default is json."},"timestamp_granularities":{"type":"array","items":{"type":"string","enum":["word","segment"]},"description":"Optional word or segment timestamps. Applied when the model supports it. gpt-transcribe refuses them."}}}}}},"responses":{"200":{"description":"Transcription result.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"type":"object","description":"Rebuilt by kenari from the fields below rather than relayed from the provider, so any field the provider sends that is not listed here is dropped.","properties":{"text":{"type":"string","description":"The transcribed text."},"task":{"type":"string","enum":["transcribe","translate"],"description":"Operation performed (verbose_json only)."},"language":{"type":"string","description":"Detected language, ISO-639-1 code or English name, lowercase (verbose_json only)."},"duration":{"type":"number","description":"Audio duration in seconds (verbose_json only)."},"segments":{"type":"array","description":"Per-segment timings and text (verbose_json only, model-dependent).","items":{"type":"object","properties":{"id":{"type":"integer"},"seek":{"type":"integer"},"start":{"type":"number"},"end":{"type":"number"},"text":{"type":"string"},"tokens":{"type":"array","items":{"type":"integer"}},"temperature":{"type":"number"},"avg_logprob":{"type":"number"},"compression_ratio":{"type":"number"},"no_speech_prob":{"type":"number"}}}},"words":{"type":"array","description":"Per-word timings (verbose_json only, model-dependent).","items":{"type":"object","properties":{"word":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}}}}}}},"text\/plain":{"schema":{"type":"string","description":"Plain transcribed text (response_format=text only)."}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/audio\/translations":{"post":{"tags":["Audio"],"operationId":"createTranslation","summary":"Translate speech into English","description":"OpenAI speech translation, for models flagged as STT models in the catalog. Same multipart body as transcriptions, without a language hint. Billed per second of audio. The transcript is English. Returns 400 for a model that cannot translate.","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","required":["file","model"],"properties":{"file":{"type":"string","format":"binary","description":"Audio file to translate into English."},"model":{"type":"string","description":"STT model id from the catalog."},"prompt":{"type":"string","description":"Optional style hint."},"temperature":{"type":"number","minimum":0,"maximum":1},"response_format":{"type":"string","enum":["json","text","verbose_json","srt","vtt"],"description":"Output format. Default is json."}}}}}},"responses":{"200":{"description":"English translation of the audio.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}}}},"text\/plain":{"schema":{"type":"string"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"415":{"$ref":"#\/components\/responses\/OpenAIError"},"422":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/music\/generations":{"post":{"tags":["Music"],"operationId":"createMusicGeneration","summary":"Generate a song","description":"OpenAI-compatible music generation, for models flagged as music models in the catalog. Billed a flat per-song price, debited from your wallet. Returns a JSON envelope carrying the generated song as base64 audio. Music models come in two families that take different input and return different containers. Tell them apart by `formats` on the model in `GET \/v1\/models`: `[\"mp3\"]` is an mp3 model and `[\"m4a\", \"wav\"]` is an m4a model, the first entry being the default container. On an mp3 model, `instrumental` true requires `prompt` and ignores `lyrics`, and a sung request requires `lyrics`. On an m4a model, `prompt` is always required, `lyrics` are optional words for a vocal, and `instrumental` true rejects `lyrics`. Calling it with a non-music model returns 400. Measured generations run about two to three minutes and the gateway allows up to fifteen, so set your own client timeout to at least five minutes rather than the default. The gateway holds the response open while the song is generated, and the body may be preceded by whitespace, so parse it as JSON rather than reading it as raw bytes. Song length is a property of the model and cannot be requested: where the catalog records one, the model publishes `max_duration_secs` in `\/v1\/models`.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["model"],"properties":{"model":{"type":"string","description":"Music model id from the catalog."},"prompt":{"type":"string","description":"The description of the track. On an mp3 model it is required when `instrumental` is true and optional style guidance on a sung request. On an m4a model it is always required. Length is counted in Unicode characters, not bytes, and the ceiling is per model: read `max_prompt_chars` for the model in `\/v1\/models`. When the model publishes none, assume 2000 on an mp3 model and 10000 on an m4a model. A longer prompt is rejected with a 400 and nothing is charged."},"lyrics":{"type":"string","description":"The words of a sung track. On an mp3 model they are required when `instrumental` is false or absent. On an m4a model they are optional and make the track a vocal of those words, and they are rejected together with `instrumental` true. Length is counted in Unicode characters, not bytes, and the ceiling is per model: read `max_lyrics_chars` for the model in `\/v1\/models`. When the model publishes none, assume 3500 on an mp3 model and 10000 on an m4a model. Longer lyrics are rejected with a 400 and nothing is charged."},"instrumental":{"type":"boolean","description":"Generate an instrumental track. Default false. When true, `prompt` is required. On an mp3 model `lyrics` is then ignored, and on an m4a model sending `lyrics` with it returns 400."},"response_format":{"type":"string","enum":["mp3","m4a","wav"],"description":"Output audio format. An mp3 model accepts only mp3, which is also its default. An m4a model accepts m4a (the default) and wav. The model's `formats` in `\/v1\/models` lists what it accepts, the default first. Asking for a format the model does not produce returns 400. The `format` field on the response is the bytes that were actually returned."}}}}}},"responses":{"200":{"description":"A JSON envelope carrying the generated song. The body may be preceded by ASCII space characters (the gateway writes them to hold the connection open past the grace period), so parse it as JSON. A failure that lands past the grace period comes back under this 200 as the standard OpenAI error object in `error`. The `data` array has exactly one element.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","required":["b64_json","format"],"properties":{"b64_json":{"type":"string","description":"Standard base64 of the audio bytes. Decode it to a file; there is nothing to download. The container is whatever `format` says."},"format":{"type":"string","enum":["mp3","m4a","wav"],"description":"Container of `b64_json`. mp3 on an mp3 model. m4a, or wav when that was requested, on an m4a model."}}}}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/videos\/generations":{"post":{"tags":["Video"],"operationId":"createVideo","summary":"Generate a video","description":"Start an async video render. Returns a job id with status 'rendering'. Poll `GET \/v1\/videos\/{id}` until status is 'done' (url provided) or 'failed'\/'expired'. Billed up front at the model's per-second rate times the requested duration; refunded on failure. What a model takes as input is listed in `modalities.input` of `GET \/v1\/models`: `text` for a prompt on its own, `image` for a start frame, `video` for a reference clip. A request with an input the model does not take answers 400 before any balance is deducted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["model","prompt"],"properties":{"model":{"type":"string"},"prompt":{"type":"string","description":"Text description of the video to generate."},"duration":{"type":"integer","minimum":1,"maximum":15,"default":6,"description":"Duration in seconds. Default 6 and range 1 to 15, unless the model declares its own duration list, in which case only those values are accepted and the first is the default. A value outside the list is refused before any balance is deducted."},"image_url":{"type":"string","description":"Source image for image-to-video. Sending it selects the model's image-to-video variant. The URL must answer with the image itself: a redirect is not followed and the render fails."},"end_image_url":{"type":"string","description":"Optional final frame, paired with image_url. Also selects the image-to-video variant."},"input_images":{"type":"array","items":{"type":"string"},"description":"One or more reference images, each an https URL or a data URL. A non-empty list selects the image-to-video variant. A reference is material the model keeps consistent (a character, a product, a style), not a frame the clip opens or ends on. How many a model takes is its `max_reference_images` on `GET \/v1\/models`, where 0 means none. A model that takes none answers 400, so send the start frame as `image_url` (and optionally `end_image_url`) instead, as kling-v3 needs. A model that takes some answers 400 above its figure. On the seedance models references cannot be combined with `image_url` or `end_image_url`, so send frames or references, not both."},"video_url":{"type":"string","description":"Reference clip for reference-to-video. Takes priority over image_url, so a request carrying both is a reference render with a still attached. kling-v3 and seedance-2.0 take no reference clip and answer 400: send the start frame as image_url (and optionally end_image_url), or a prompt on its own."},"reference_video_url":{"type":"string","description":"Alias of video_url."},"aspect_ratio":{"type":"string","description":"Output aspect ratio, e.g. '16:9' or '9:16'."},"resolution":{"type":"string","description":"Resolution tier, for example '720p' or '1080p'. A model that sells several tiers charges a different per-second rate for each and defaults to the first it declares. Asking a tiered model for a tier it does not sell is refused before any balance is deducted, never downgraded to a cheaper tier. On a model with a single rate the tier does not change what you pay, but it is still passed to the provider, which may reject a value it does not recognise."}}}}}},"responses":{"200":{"description":"Video job accepted. Poll the job id until done.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Job id to poll."},"object":{"type":"string","const":"video.job"},"status":{"type":"string","const":"rendering"},"model":{"type":"string"}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/videos\/extensions":{"post":{"tags":["Video"],"operationId":"extendVideo","summary":"Extend an existing video","description":"Start an async video extension render from the last frame of an existing clip. Returns a job id with status 'rendering'. Poll `GET \/v1\/videos\/{id}` until done.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["model","video"],"properties":{"model":{"type":"string"},"prompt":{"type":"string","description":"Optional text prompt for the extension."},"duration":{"type":"integer","minimum":1,"maximum":15,"default":6,"description":"Duration in seconds for the extension segment (1-15, default 6)."},"video":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL of the source video to extend."}}}}}}}},"responses":{"200":{"description":"Video extension job accepted.","headers":{"x-kenari-model-forwarded":{"$ref":"#\/components\/headers\/KenariModelForwarded"}},"content":{"application\/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Job id to poll."},"object":{"type":"string","const":"video.job"},"status":{"type":"string","const":"rendering"},"model":{"type":"string"}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/videos\/{id}":{"get":{"tags":["Video"],"operationId":"getVideoJob","summary":"Poll a video job","description":"Fetch the current status of a video render job. Status is 'rendering' while in progress, 'done' (with a url field containing the video URL) on success, or 'failed'\/'expired' on error. On failure the reserved cost is refunded to your wallet.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Job id returned by POST \/v1\/videos\/generations or POST \/v1\/videos\/extensions."}],"responses":{"200":{"description":"Current job status.","content":{"application\/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["rendering","done","failed","expired"]},"url":{"type":["string","null"],"description":"kenari-hosted URL for the finished clip when status is 'done'. Fetch it with the same API key; see GET \/v1\/videos\/{id}\/content."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"500":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/videos\/{id}\/content":{"get":{"tags":["Video"],"operationId":"getVideoContent","summary":"Download a finished video","description":"Stream the rendered clip. This is the URL returned in the `url` field of a 'done' job, and it is served by kenari rather than by the upstream renderer. Requires the same API key, and only the account that created the job can read it. Returns 400 while the job is still rendering.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Job id returned by POST \/v1\/videos\/generations or POST \/v1\/videos\/extensions."}],"responses":{"200":{"description":"The video bytes.","content":{"video\/mp4":{"schema":{"type":"string","format":"binary"}},"video\/webm":{"schema":{"type":"string","format":"binary"}},"video\/quicktime":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"503":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/web\/search":{"post":{"tags":["Web"],"operationId":"webSearch","summary":"Search the web","description":"Run a web search and return ranked results (title, URL, content snippet). Requires a `kn-` key. Billed at the per-search rate regardless of model funding (metered and BYOK both pay). The backend source is never revealed in the response.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query."},"max_results":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Number of results to return (1-10, default 5)."}}}}}},"responses":{"200":{"description":"Search results.","content":{"application\/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"content":{"type":"string"}}}},"id":{"type":"string","description":"Request identifier."},"cost_micro_idr":{"type":"integer","description":"Fee charged in micro-Rupiah (Rupiah * 1,000,000)."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/x\/search":{"post":{"tags":["Web"],"operationId":"xSearch","summary":"Search X (Twitter)","description":"Run a live X (formerly Twitter) search and return a synthesized answer with x.com source links. Requires a `kn-` key. Billed at the per-search rate (metered and BYOK both pay). The backend source is never revealed in the response. Optional `x_search_filter` scopes the search by handle, date range, and media understanding.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query."},"x_search_filter":{"type":"object","description":"Optional filter. allowed_x_handles and excluded_x_handles are mutually exclusive, at most 20 each. Dates are YYYY-MM-DD.","properties":{"allowed_x_handles":{"type":"array","items":{"type":"string"}},"excluded_x_handles":{"type":"array","items":{"type":"string"}},"from_date":{"type":"string"},"to_date":{"type":"string"},"enable_image_understanding":{"type":"boolean"},"enable_video_understanding":{"type":"boolean"}}}}}}}},"responses":{"200":{"description":"Search answer with citations.","content":{"application\/json":{"schema":{"type":"object","properties":{"answer":{"type":"string","description":"Synthesized answer from live X search."},"citations":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"}}}},"id":{"type":"string","description":"Request identifier."},"cost_micro_idr":{"type":"integer","description":"Fee charged in micro-Rupiah (Rupiah * 1,000,000)."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/ocr":{"post":{"tags":["Web"],"operationId":"ocr","summary":"Read a document to text","description":"Read a PDF or document image to text without a completion model in the loop. Requires a `kn-` key. Billed per page read, from the same Rupiah balance as tokens. The reading backend is never revealed in the response. Send a base64 data URL: a plain http URL is not fetched. Echo a previously issued `reuse_id` instead of a file to re-read a document already paid for, which costs nothing. A `reuse_id` issued by the `file-parser` plugin on \/v1\/chat\/completions works here and the reverse. Two limits apply and either can refuse first: a page cap set by kenari, and a document size limit of about 15 MB.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"file":{"type":"object","description":"The document. Provide this OR reuse_id, never both.","required":["filename","file_data"],"properties":{"filename":{"type":"string"},"file_data":{"type":"string","description":"Data URL: data:<media-type>;base64,<contents>. Accepted: application\/pdf, image\/png, image\/jpeg, image\/webp, image\/gif, image\/tiff."}}},"reuse_id":{"type":"string","description":"Echo of a previously issued reuse_id. Serves the stored reading and is not billed. Provide this OR file, never both."},"engine":{"type":"string","description":"Optional. Only \"ocr\" is accepted."}}}}}},"responses":{"200":{"description":"The extracted document text.","content":{"application\/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Request identifier."},"pages":{"type":"integer","description":"Pages actually read, which is what the charge is computed from."},"cost_micro_idr":{"type":"integer","description":"Fee charged in micro-Rupiah (Rupiah * 1,000,000). Zero when a stored reading was served."},"name":{"type":"string","description":"The filename as sent."},"hash":{"type":"string","description":"sha256 of the extracted text."},"content":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"text":{"type":"string"}}}},"confidence":{"type":"number","description":"Mean per-page score from the reading engine. Null when the engine reported none."},"low_confidence":{"type":"boolean","description":"True when confidence falls below kenari's floor, or the engine reported no score. A warning, not a guarantee."},"reuse_id":{"type":"string","description":"Echo this to re-read the document without paying again."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/account\/quota":{"get":{"tags":["Account"],"operationId":"getAccountQuota","summary":"Get plan and coupon quota","description":"Returns the account's plan windows and any active coupon in Rupiah, without fractional values. `plan` is `null` if the account has never subscribed, the plan has lapsed, or the plan is inactive. Windows with no limit are omitted, and `coupon` is returned separately from plan windows. Requires a `kn-` key. Shared keys receive HTTP 403 with code `shared_key_not_allowed`. Keys with a model scope, spend cap or token cap are restricted and receive HTTP 403 with code `restricted_key_not_allowed`. A restricted key reads its own usage through `GET \/v1\/usage`, `\/v1\/usage\/daily` and `\/v1\/usage\/log`.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current plan and coupon quota. `plan` and `coupon` can each be `null`.","content":{"application\/json":{"schema":{"type":"object","required":["plan","coupon","alert_pct"],"properties":{"alert_pct":{"type":"integer","enum":[50,80,90],"description":"The account's quota warning percent (Settings, Notifications). Clients can warn when a window's `used_frac` reaches this value divided by 100."},"plan":{"nullable":true,"type":"object","properties":{"name":{"type":"string"},"windows":{"type":"object","properties":{"week":{"$ref":"#\/components\/schemas\/QuotaWindow"},"month":{"$ref":"#\/components\/schemas\/QuotaWindow"},"five_hour":{"$ref":"#\/components\/schemas\/QuotaWindow"}}}}},"coupon":{"nullable":true,"type":"object","properties":{"name":{"type":"string"},"used_rp":{"type":"integer","description":"Rupiah used from this coupon."},"remaining_rp":{"type":["integer","null"],"description":"Rupiah still available from this coupon, or `null` if the coupon has no spending limit."},"expires_at":{"type":"string","format":"date-time","description":"Date and time when this coupon expires, in RFC 3339 UTC format."},"scope_models":{"type":"array","items":{"type":"string"},"description":"Public catalog model IDs covered by this coupon."}}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/account\/balance":{"get":{"tags":["Account"],"operationId":"getAccountBalance","summary":"Get wallet balance","description":"Returns the account's wallet balance in integer micro-Rupiah (IDR x 1,000,000). `reserved_micro_idr` is the worst-case amount held by requests still running on the instance that answered, best-effort. `available_micro_idr` is the balance minus that, never below 0. The balance itself is signed and is negative when the wallet is overdrawn. Requires a `kn-` key. Shared keys receive HTTP 403 with code `shared_key_not_allowed`. Keys with a model scope, spend cap or token cap are restricted and receive HTTP 403 with code `restricted_key_not_allowed`. A restricted key reads its own usage through `GET \/v1\/usage`, `\/v1\/usage\/daily` and `\/v1\/usage\/log`.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current wallet balance.","content":{"application\/json":{"schema":{"type":"object","required":["object","balance_micro_idr","reserved_micro_idr","available_micro_idr","currency"],"properties":{"object":{"type":"string","enum":["account.balance"]},"balance_micro_idr":{"type":"integer","format":"int64","description":"Wallet balance in micro-Rupiah. Negative when the wallet is overdrawn."},"reserved_micro_idr":{"type":"integer","format":"int64","description":"Worst-case micro-Rupiah held by requests still running on the instance that answered, best-effort."},"available_micro_idr":{"type":"integer","format":"int64","description":"Balance minus reserved, clamped at 0."},"currency":{"type":"string","enum":["IDR"]}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/account\/keys":{"post":{"tags":["Account"],"operationId":"createAccountKey","summary":"Create a per-tool key","description":"Mints a child key labelled `kenari-cli \u00b7 <tool> \u00b7 <host>` under the calling key. Only the key that `kenari login` returned may call this: any other key receives HTTP 403 with code `cli_login_key_required`, including a child key and a key created in the dashboard. Shared keys receive HTTP 403 with code `shared_key_not_allowed`, and keys with a model scope, spend cap or token cap receive HTTP 403 with code `restricted_key_not_allowed`. `tool` is 1 to 40 characters of `a-z`, `0-9`, `.` and `-`. `host` is 1 to 64 characters of `A-Z`, `a-z`, `0-9`, `.`, `_` and `-`. Anything else returns HTTP 400. A login key may hold 30 active children, beyond which HTTP 409 with code `child_key_cap` is returned. Children also count toward the account's key limit: at that limit HTTP 400 with code `bad_request` and message `key limit reached` is returned. Limited to 20 requests per minute per key, beyond which HTTP 429 with code `rate_limit_exceeded` is returned. The `key` value is shown once. Revoking the login key in the dashboard revokes its children too.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["tool","host"],"properties":{"tool":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-z0-9.-]+$","example":"claude-code"},"host":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._-]+$","example":"laptop"}}}}}},"responses":{"201":{"description":"The new child key.","content":{"application\/json":{"schema":{"type":"object","required":["id","key","prefix","label","created_at"],"properties":{"id":{"type":"string"},"key":{"type":"string","description":"The plaintext `kn-` key. Returned once."},"prefix":{"type":"string"},"label":{"type":"string"},"created_at":{"type":"integer","format":"int64","description":"Unix seconds."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"409":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}},"get":{"tags":["Account"],"operationId":"listAccountKeys","summary":"List per-tool keys","description":"Returns the active child keys of the calling key, newest first. `last_used_at` is Unix seconds, or null when the key has no recorded use in the last 90 days. Same caller rules as creating a child: only the key that `kenari login` returned may call this.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The caller's active child keys.","content":{"application\/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"type":"object","required":["id","prefix","label","created_at","last_used_at"],"properties":{"id":{"type":"string"},"prefix":{"type":"string"},"label":{"type":"string"},"created_at":{"type":"integer","format":"int64"},"last_used_at":{"type":["integer","null"],"format":"int64"}}}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/account\/keys\/{id}":{"delete":{"tags":["Account"],"operationId":"revokeAccountKey","summary":"Revoke a per-tool key","description":"Revokes one active child key of the calling key. Any other id, including the caller's own id, a sibling login key's child, another account's key and an unknown id, returns HTTP 404. Same caller rules as creating a child: only the key that `kenari login` returned may call this.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The key was revoked.","content":{"application\/json":{"schema":{"type":"object","required":["id","revoked"],"properties":{"id":{"type":"string"},"revoked":{"type":"boolean","enum":[true]}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"404":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/usage":{"get":{"tags":["Account"],"operationId":"getUsage","summary":"Get usage summary","description":"Per-model usage for the whole account over a window, one row per model and billing kind, sorted by charged cost descending. Money is integer micro-Rupiah. The window may span at most 366 days. Requires a `kn-` key. Shared keys receive HTTP 403 with code `shared_key_not_allowed`. Keys with a model scope, spend cap or token cap are restricted: they read only the usage of their own key, and an `api_key_id` naming another key returns HTTP 400. Unrestricted keys read the whole account, and an Owner or Admin key may narrow it to one person with `user_id`. Limited to 60 requests per minute per account across the three usage routes, beyond which HTTP 429 with code `rate_limit_exceeded` is returned. Malformed parameters return HTTP 400 with code `bad_request`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"description":"Inclusive window start, unix seconds. Wins over `range`. With only `end`, the window starts 30 days before it.","schema":{"type":"integer","minimum":0}},{"name":"end","in":"query","required":false,"description":"Inclusive window end, unix seconds, clamped to now. With only `start`, the window ends now.","schema":{"type":"integer","minimum":0}},{"name":"range","in":"query","required":false,"description":"Preset window ending now. Ignored when `start` or `end` is given. Default `30d`.","schema":{"type":"string","enum":["today","24h","7d","30d"]}},{"name":"model","in":"query","required":false,"description":"Only this exact model ID.","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Only the usage of this person in this workspace: the keys they hold here and their Studio tags. An Owner or Admin key may pass any person id, a stranger's id reads nothing. A Member key may pass only its holder's own id, any other returns HTTP 403 `permission_denied`. A restricted key may not pass it (HTTP 403 `restricted_key_not_allowed`). 1 to 64 characters of `A-Z`, `a-z`, `0-9`, `_` and `-`, anything else returns HTTP 400 `bad_request`.","schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["object","start","end","data","total"],"properties":{"object":{"type":"string","enum":["usage.summary"]},"start":{"type":"integer"},"end":{"type":"integer"},"data":{"type":"array","items":{"type":"object","required":["model","billing_kind","requests","prompt_tokens","completion_tokens","cached_prompt_tokens","cache_write_prompt_tokens","cost_micro_idr","catalog_micro_idr"],"properties":{"model":{"type":"string"},"billing_kind":{"type":"string","enum":["payg","plan","coupon","token_alloc","free","byok"]},"requests":{"type":"integer"},"prompt_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"},"cached_prompt_tokens":{"type":"integer"},"cache_write_prompt_tokens":{"type":"integer"},"cost_micro_idr":{"type":"integer","description":"Charged to balance, micro-Rupiah."},"catalog_micro_idr":{"type":"integer","description":"Value at list price, micro-Rupiah."}}}},"total":{"type":"object","required":["requests","prompt_tokens","completion_tokens","cached_prompt_tokens","cache_write_prompt_tokens","cost_micro_idr","catalog_micro_idr"],"properties":{"requests":{"type":"integer"},"prompt_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"},"cached_prompt_tokens":{"type":"integer"},"cache_write_prompt_tokens":{"type":"integer"},"cost_micro_idr":{"type":"integer","description":"Charged to balance, micro-Rupiah."},"catalog_micro_idr":{"type":"integer","description":"Value at list price, micro-Rupiah."}}}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/usage\/daily":{"get":{"tags":["Account"],"operationId":"getUsageDaily","summary":"Get daily usage","description":"One row per UTC day in the window, with zeros for days without usage. The window may span at most 366 days. Requires a `kn-` key. Shared keys receive HTTP 403 with code `shared_key_not_allowed`. Keys with a model scope, spend cap or token cap are restricted: they read only the usage of their own key, and an `api_key_id` naming another key returns HTTP 400. Unrestricted keys read the whole account, and an Owner or Admin key may narrow it to one person with `user_id`. Limited to 60 requests per minute per account across the three usage routes, beyond which HTTP 429 with code `rate_limit_exceeded` is returned. Malformed parameters return HTTP 400 with code `bad_request`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"description":"Inclusive window start, unix seconds. Wins over `range`. With only `end`, the window starts 30 days before it.","schema":{"type":"integer","minimum":0}},{"name":"end","in":"query","required":false,"description":"Inclusive window end, unix seconds, clamped to now. With only `start`, the window ends now.","schema":{"type":"integer","minimum":0}},{"name":"range","in":"query","required":false,"description":"Preset window ending now. Ignored when `start` or `end` is given. Default `30d`.","schema":{"type":"string","enum":["today","24h","7d","30d"]}},{"name":"model","in":"query","required":false,"description":"Only this exact model ID.","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Only the usage of this person in this workspace: the keys they hold here and their Studio tags. An Owner or Admin key may pass any person id, a stranger's id reads nothing. A Member key may pass only its holder's own id, any other returns HTTP 403 `permission_denied`. A restricted key may not pass it (HTTP 403 `restricted_key_not_allowed`). 1 to 64 characters of `A-Z`, `a-z`, `0-9`, `_` and `-`, anything else returns HTTP 400 `bad_request`.","schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["object","start","end","data"],"properties":{"object":{"type":"string","enum":["usage.daily"]},"start":{"type":"integer"},"end":{"type":"integer"},"data":{"type":"array","items":{"type":"object","required":["date","requests","cost_micro_idr"],"properties":{"date":{"type":"string","format":"date","description":"UTC day."},"requests":{"type":"integer"},"cost_micro_idr":{"type":"integer"}}}}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/usage\/log":{"get":{"tags":["Account"],"operationId":"getUsageLog","summary":"List requests","description":"Individual requests, newest first. `page` times `limit` may not exceed 10000: deeper pages return HTTP 400, so narrow the window with `start` and `end`. Requires a `kn-` key. Shared keys receive HTTP 403 with code `shared_key_not_allowed`. Keys with a model scope, spend cap or token cap are restricted: they read only the usage of their own key, and an `api_key_id` naming another key returns HTTP 400. Unrestricted keys read the whole account, and an Owner or Admin key may narrow it to one person with `user_id`. Limited to 60 requests per minute per account across the three usage routes, beyond which HTTP 429 with code `rate_limit_exceeded` is returned. Malformed parameters return HTTP 400 with code `bad_request`.","security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"description":"Inclusive window start, unix seconds. Wins over `range`. With only `end`, the window starts 30 days before it.","schema":{"type":"integer","minimum":0}},{"name":"end","in":"query","required":false,"description":"Inclusive window end, unix seconds, clamped to now. With only `start`, the window ends now.","schema":{"type":"integer","minimum":0}},{"name":"range","in":"query","required":false,"description":"Preset window ending now. Ignored when `start` or `end` is given. Default `30d`.","schema":{"type":"string","enum":["today","24h","7d","30d"]}},{"name":"model","in":"query","required":false,"description":"Only this exact model ID.","schema":{"type":"string"}},{"name":"api_key_id","in":"query","required":false,"description":"Only requests made with this key ID.","schema":{"type":"string"}},{"name":"billing_kind","in":"query","required":false,"description":"Only this billing kind.","schema":{"type":"string","enum":["payg","plan","coupon","token_alloc","free","byok"]}},{"name":"page","in":"query","required":false,"description":"Zero-based page. `page * limit` must not exceed 10000.","schema":{"type":"integer","minimum":0,"maximum":10000,"default":0}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to 1-200.","schema":{"type":"integer","default":50,"minimum":1,"maximum":200}},{"name":"user_id","in":"query","required":false,"description":"Only the usage of this person in this workspace: the keys they hold here and their Studio tags. An Owner or Admin key may pass any person id, a stranger's id reads nothing. A Member key may pass only its holder's own id, any other returns HTTP 403 `permission_denied`. A restricted key may not pass it (HTTP 403 `restricted_key_not_allowed`). 1 to 64 characters of `A-Z`, `a-z`, `0-9`, `_` and `-`, anything else returns HTTP 400 `bad_request`. Pass it again with every `page`, the filter is not carried between pages.","schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["object","start","end","data","page","limit","has_more","total"],"properties":{"object":{"type":"string","enum":["list"]},"start":{"type":"integer"},"end":{"type":"integer"},"data":{"type":"array","items":{"type":"object","required":["created_at","model","vendor","billing_kind","prompt_tokens","completion_tokens","cached_prompt_tokens","cache_write_prompt_tokens","cost_micro_idr","catalog_micro_idr"],"properties":{"created_at":{"type":"integer","description":"Unix seconds."},"model":{"type":"string"},"vendor":{"type":"string","description":"Maker of the model."},"api_key_id":{"type":["string","null"],"description":"ID of the key that made the request."},"billing_kind":{"type":"string","enum":["payg","plan","coupon","token_alloc","free","byok"]},"prompt_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"},"cached_prompt_tokens":{"type":"integer"},"cache_write_prompt_tokens":{"type":"integer"},"cost_micro_idr":{"type":"integer"},"catalog_micro_idr":{"type":"integer"}}}},"page":{"type":"integer"},"limit":{"type":"integer"},"has_more":{"type":"boolean"},"total":{"type":"integer","description":"Requests matching the filters in the window."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/OpenAIError"},"429":{"$ref":"#\/components\/responses\/OpenAIError"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/web\/fetch":{"post":{"tags":["Web"],"operationId":"webFetch","summary":"Fetch a URL","description":"Fetch a URL and return its content as text, along with extracted links. Requires a `kn-` key. Billed at the per-search rate.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to fetch."}}}}}},"responses":{"200":{"description":"Fetched page content.","content":{"application\/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string","description":"Page content as plain text."},"links":{"type":"array","items":{"type":"string"},"description":"Extracted hyperlinks."},"id":{"type":"string","description":"Request identifier."},"cost_micro_idr":{"type":"integer","description":"Fee charged in micro-Rupiah."}}}}}},"400":{"$ref":"#\/components\/responses\/OpenAIError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"$ref":"#\/components\/responses\/OpenAIError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"500":{"$ref":"#\/components\/responses\/OpenAIError"}}}},"\/v1\/workspace":{"get":{"tags":["Workspace"],"operationId":"getWorkspace","summary":"Get the workspace","description":"Returns the workspace the key belongs to: its id, name and kind, the holder's role, the member limit, whether it buys seats (`seat_mode`), the saldo in micro-Rupiah and the PAYG limit a new member joins with. `default_cap_micro_idr` is read by an Owner or Admin only and is null for a Member. On a workspace that is not a team the answer carries only `id`, `kind` and `role`. The one workspace route that also answers for a personal workspace. Needs workspace access Baca (level 1) or higher, with a key held by any member of the workspace.","x-workspace-access":1,"x-workspace-holder":"any_member","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The workspace.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkspaceInfo"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}},"patch":{"tags":["Workspace"],"operationId":"renameWorkspace","summary":"Rename the workspace","description":"Renames the team workspace. The name is trimmed, 1 to 40 characters, with no control characters. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":40,"description":"The new workspace name."}}}}}},"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["workspace"],"properties":{"workspace":{"$ref":"#\/components\/schemas\/WorkspaceView"}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/members":{"get":{"tags":["Workspace"],"operationId":"listWorkspaceMembers","summary":"List members","description":"Lists the members with their role, seat, PAYG limit and PAYG spend. A Member's key reads the limit and spend of its own row only, and every other row carries null there. `default_cap_micro_idr` is read by an Owner or Admin only. Needs workspace access Baca (level 1) or higher, with a key held by any member of the workspace.","x-workspace-access":1,"x-workspace-holder":"any_member","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["members","default_cap_micro_idr"],"properties":{"members":{"type":"array","items":{"$ref":"#\/components\/schemas\/WorkspaceMember"}},"default_cap_micro_idr":{"type":["integer","null"],"format":"int64","description":"The PAYG limit a new member joins with, null when none is set or for a Member's key."}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/members\/{user_id}":{"patch":{"tags":["Workspace"],"operationId":"updateWorkspaceMemberRole","summary":"Change a member's role","description":"Sets a member's role to `admin` or `member`. The Owner's role never changes here, ownership moves only in the dashboard. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"description":"The person's id, as `user_id` in the members list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["admin","member"]}}}}}},"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["user_id","role"],"properties":{"user_id":{"type":"string"},"role":{"type":"string","enum":["admin","member"]}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}},"delete":{"tags":["Workspace"],"operationId":"removeWorkspaceMember","summary":"Remove a member","description":"Removes a member and, in the same step, either revokes the keys they hold in this workspace or hands them to another member. The body is required. A shared key handed to a Member is revoked instead of moved. The Owner cannot be removed, and a holder cannot remove themselves because leaving is a dashboard action. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"description":"The person's id, as `user_id` in the members list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"string","enum":["revoke","transfer"],"description":"What happens to the keys the person holds here: `revoke` revokes them, `transfer` gives them to `transfer_to`."},"transfer_to":{"type":"string","description":"Required with `keys: transfer`. The id of another member who takes the keys."}}}}}},"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["removed","keys_revoked","keys_transferred"],"properties":{"removed":{"type":"boolean","enum":[true]},"keys_revoked":{"type":"integer"},"keys_transferred":{"type":"integer"}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/members\/{user_id}\/cap":{"put":{"tags":["Workspace"],"operationId":"setWorkspaceMemberCap","summary":"Set a member's PAYG limit","description":"Sets or removes the PAYG limit of one member, the most they may draw from the workspace saldo in their rolling 30 day window. `cap_micro_idr` is a whole rupiah amount from Rp 1 to Rp 1,000,000,000 in micro-Rupiah, or null to remove the limit, and the key must be present. A change never touches the spend already counted. The Owner has no limit, and a person's own limit is set by someone else. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"description":"The person's id, as `user_id` in the members list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["cap_micro_idr"],"properties":{"cap_micro_idr":{"type":["integer","null"],"format":"int64","minimum":1000000,"maximum":1000000000000000,"multipleOf":1000000,"description":"Micro-Rupiah, a multiple of 1,000,000, or null for no limit."}}}}}},"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["user_id","cap"],"properties":{"user_id":{"type":"string"},"cap":{"oneOf":[{"$ref":"#\/components\/schemas\/WorkspaceMemberCap"},{"type":"null"}]}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/member-cap-default":{"put":{"tags":["Workspace"],"operationId":"setWorkspaceMemberCapDefault","summary":"Set the PAYG limit for new members","description":"Sets the PAYG limit a member gets when they accept an invite, or removes it with null. Members already in the workspace keep the limit they have. Same range as a member's own limit, and the key must be present. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["cap_micro_idr"],"properties":{"cap_micro_idr":{"type":["integer","null"],"format":"int64","minimum":1000000,"maximum":1000000000000000,"multipleOf":1000000,"description":"Micro-Rupiah, a multiple of 1,000,000, or null for no limit."}}}}}},"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["default_cap_micro_idr"],"properties":{"default_cap_micro_idr":{"type":["integer","null"],"format":"int64"}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/invites":{"get":{"tags":["Workspace"],"operationId":"listWorkspaceInvites","summary":"List pending invites","description":"Lists the invites that are not accepted, not revoked and not expired, newest first. The invite token is never returned, it only travels in the invitee's email. Needs workspace access Baca (level 1) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":1,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["invites"],"properties":{"invites":{"type":"array","items":{"$ref":"#\/components\/schemas\/WorkspaceInvite"}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}},"post":{"tags":["Workspace"],"operationId":"createWorkspaceInvite","summary":"Invite someone","description":"Invites an address as `admin` or `member`. The invite is emailed in the holder's name and is valid for 7 days. `email_sent` is false when the mail could not be sent, and the invite still exists. A workspace holds at most 50 pending invites (HTTP 429 `pending_limit_reached`) and takes at most 20 new invites per 24 hours (HTTP 429 `daily_limit_reached`). An address that is already a member, or a workspace at its member limit, returns HTTP 409. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["email","role"],"properties":{"email":{"type":"string","maxLength":254,"description":"The address to invite, up to 254 characters."},"role":{"type":"string","enum":["admin","member"]}}}}}},"responses":{"201":{"description":"The invite.","content":{"application\/json":{"schema":{"type":"object","required":["id","email","role","expires_at","email_sent"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","member"]},"expires_at":{"type":"integer","format":"int64","description":"Unix seconds."},"email_sent":{"type":"boolean"}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/invites\/{id}":{"delete":{"tags":["Workspace"],"operationId":"revokeWorkspaceInvite","summary":"Revoke an invite","description":"Revokes a pending invite so its link stops working. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The invite id, as `id` in the invites list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"boolean","enum":[true]}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/seats":{"get":{"tags":["Workspace"],"operationId":"listWorkspaceSeats","summary":"List seats","description":"Lists the seats and the billing header. An Owner or Admin reads every seat with the holder's email and the money figures. A Member reads their own seat only, with `seat_mode` and `cycle_end`. A level 3 key also reads `personal_balance_micro_idr`, the holder's Pribadi saldo, which keys below level 3 never see. Needs workspace access Baca (level 1) or higher, with a key held by any member of the workspace.","x-workspace-access":1,"x-workspace-holder":"any_member","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["seat_mode","cycle_end","seats"],"properties":{"seat_mode":{"type":"boolean","description":"True when the workspace buys per-seat plans."},"plan_status":{"type":"string","description":"Owner and Admin only. The state of the workspace's plan."},"cycle_end":{"type":["integer","null"],"format":"int64","description":"Unix seconds."},"auto_renew":{"type":"boolean","description":"Owner and Admin only."},"renewal_total_micro_idr":{"type":"integer","format":"int64","description":"Owner and Admin only. What the next renewal charges, in micro-Rupiah."},"personal_balance_micro_idr":{"type":["integer","null"],"format":"int64","description":"Level 3 only, null in a personal workspace. The holder's Pribadi saldo, in micro-Rupiah."},"seats":{"type":"array","items":{"$ref":"#\/components\/schemas\/WorkspaceSeat"}}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}},"post":{"tags":["Workspace"],"operationId":"addWorkspaceSeats","summary":"Buy seats","description":"Buys `count` seats (1 to 25) of one plan, charged to the workspace saldo, and assigns the first to `user_id` when given. A saldo that is short returns HTTP 402 with `error.gap_micro_idr`. A purchase charges the price at the time it is made, so call `POST \/v1\/workspace\/seats\/quote` first. a `pay_from` other than `workspace` (`personal` included) is refused with HTTP 400 `pay_from_personal_not_supported`: move saldo first with `POST \/v1\/workspace\/fund-from-personal`. The `Idempotency-Key` header is required. Limited to 10 requests per minute per key. Needs workspace access Kelola + pembayaran (level 3), with a key held by an Owner or Admin of the workspace.","x-workspace-access":3,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/IdempotencyKeyRequired"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["plan_id","count"],"properties":{"plan_id":{"type":"string","description":"A plan id from the plan list."},"count":{"type":"integer","minimum":1,"maximum":25},"user_id":{"type":"string","description":"The member who gets the first seat. Omit to leave the seats unassigned."},"pay_from":{"type":"string","enum":["workspace"],"default":"workspace","description":"Only `workspace` is accepted. Any other value, `personal` included, returns HTTP 400 `pay_from_personal_not_supported`."}}}}}},"responses":{"200":{"description":"OK.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"type":"object","required":["ok","seat_ids","charged_micro_idr","seat_mode"],"properties":{"ok":{"type":"boolean","enum":[true]},"seat_ids":{"type":"array","items":{"type":"string"}},"charged_micro_idr":{"type":"integer","format":"int64","description":"Charged to the workspace saldo, in micro-Rupiah."},"seat_mode":{"type":"boolean"}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"description":"The saldo is short. `error.gap_micro_idr` says by how much, in micro-Rupiah, and `error.source` is `personal` when the short wallet is the holder's Pribadi saldo. A replayed answer carries `Idempotent-Replayed: true`.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkspaceError"}}}},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/seats\/quote":{"post":{"tags":["Workspace"],"operationId":"quoteWorkspaceSeats","summary":"Quote a seat purchase","description":"Prices adding `count` seats of `plan_id`, or raising the seat `seat_id` to `plan_id`, against the workspace saldo. Changes nothing. A level 3 key also reads `personal_saldo_micro_idr` and `personal_gap_micro_idr`. A `pay_from` other than `workspace` returns HTTP 400 `pay_from_personal_not_supported`. Needs workspace access Baca (level 1) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":1,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string","description":"A plan id from the plan list."},"count":{"type":"integer","minimum":1,"maximum":25,"description":"Seats to add. Default 1. Ignored with `seat_id`."},"seat_id":{"type":"string","description":"Price raising this seat to `plan_id` instead of adding seats."}}}}}},"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["charge_micro_idr","saldo_micro_idr","gap_micro_idr"],"properties":{"charge_micro_idr":{"type":"integer","format":"int64","description":"What the purchase charges now."},"saldo_micro_idr":{"type":"integer","format":"int64","description":"The workspace saldo."},"gap_micro_idr":{"type":"integer","format":"int64","description":"How much the workspace saldo is short, 0 when it covers the charge."},"personal_saldo_micro_idr":{"type":["integer","null"],"format":"int64","description":"Level 3 only. The holder's Pribadi saldo."},"personal_gap_micro_idr":{"type":["integer","null"],"format":"int64","description":"Level 3 only. How much the Pribadi saldo is short."}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/seats\/reactivate":{"post":{"tags":["Workspace"],"operationId":"reactivateWorkspaceSeats","summary":"Reactivate lapsed seats","description":"Buys the seats of a lapsed seat-mode workspace again: charges the renewal total to the workspace saldo, applies the pending changes and starts a fresh cycle. There is no early renewal of an active cycle. The body is ignored, except that a `pay_from` other than `workspace` (`personal` included) is refused with HTTP 400 `pay_from_personal_not_supported`. The `Idempotency-Key` header is required. Limited to 10 requests per minute per key. Needs workspace access Kelola + pembayaran (level 3), with a key held by an Owner or Admin of the workspace.","x-workspace-access":3,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/IdempotencyKeyRequired"}],"responses":{"200":{"description":"OK.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"type":"object","required":["ok","charged_micro_idr","cycle_end"],"properties":{"ok":{"type":"boolean","enum":[true]},"charged_micro_idr":{"type":"integer","format":"int64","description":"The renewal total charged, in micro-Rupiah."},"cycle_end":{"type":"integer","format":"int64","description":"Unix seconds."}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"description":"The saldo is short. `error.gap_micro_idr` says by how much, in micro-Rupiah, and `error.source` is `personal` when the short wallet is the holder's Pribadi saldo. A replayed answer carries `Idempotent-Replayed: true`.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkspaceError"}}}},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/seats\/{id}":{"patch":{"tags":["Workspace"],"operationId":"updateWorkspaceSeat","summary":"Assign or change a seat","description":"Assigns the seat to a member (`user_id`), unassigns it (`user_id: null`), raises its plan now (`plan_id`, which charges the difference for the rest of the cycle) or lowers it at renewal. Level 3 for every body, because assigning and raising share the route and a raise charges. A raise is paid from the workspace saldo, and a `pay_from` other than `workspace` (`personal` included) is refused with HTTP 400 `pay_from_personal_not_supported`. The `Idempotency-Key` header is required. Limited to 10 requests per minute per key. Needs workspace access Kelola + pembayaran (level 3), with a key held by an Owner or Admin of the workspace.","x-workspace-access":3,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The seat id, as `id` in the seats list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKeyRequired"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"user_id":{"type":["string","null"],"description":"Absent leaves the holder alone, null unassigns, a member id assigns."},"plan_id":{"type":"string","description":"The plan to move the seat to. A higher plan applies now and charges, a lower one applies at renewal."},"expect_unassigned":{"type":"boolean","default":false,"description":"Refuse when someone holds the seat by now instead of moving it away from them."},"pay_from":{"type":"string","enum":["workspace"],"default":"workspace","description":"Only `workspace` is accepted. Any other value, `personal` included, returns HTTP 400 `pay_from_personal_not_supported`."}}}}}},"responses":{"200":{"description":"OK.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"type":"object","required":["ok","charged_micro_idr"],"properties":{"ok":{"type":"boolean","enum":[true]},"charged_micro_idr":{"type":"integer","format":"int64","description":"Charged to the workspace saldo, 0 when nothing is charged."}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"description":"The saldo is short. `error.gap_micro_idr` says by how much, in micro-Rupiah, and `error.source` is `personal` when the short wallet is the holder's Pribadi saldo. A replayed answer carries `Idempotent-Replayed: true`.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkspaceError"}}}},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}},"delete":{"tags":["Workspace"],"operationId":"removeWorkspaceSeat","summary":"Remove a seat at renewal","description":"Flags the seat for removal at the next renewal. Refused with HTTP 409 when it would leave the workspace with no seat. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The seat id, as `id` in the seats list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","enum":[true]}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/seats\/{id}\/cancel-change":{"post":{"tags":["Workspace"],"operationId":"cancelWorkspaceSeatChange","summary":"Cancel a pending seat change","description":"Clears a pending lower plan and a pending removal on the seat. Needs workspace access Kelola (level 2) or higher, with a key held by an Owner or Admin of the workspace.","x-workspace-access":2,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The seat id, as `id` in the seats list.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]{1,128}$"}},{"$ref":"#\/components\/parameters\/IdempotencyKey"}],"responses":{"200":{"description":"OK.","content":{"application\/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","enum":[true]}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}},"\/v1\/workspace\/fund-from-personal":{"post":{"tags":["Workspace"],"operationId":"fundWorkspaceFromPersonal","summary":"Fund the workspace from Pribadi","description":"Moves `amount_idr` (Rp 1,000 to Rp 100,000,000) from the holder's own Pribadi saldo into this workspace. One way: money never leaves a team. Each level 3 key has a daily limit on what it may move, set when the key is created (Rp 5,000,000 by default, Rp 0 means no funding through the API) and counted over a rolling 24 hours. A transfer past it returns HTTP 403 `fund_cap_reached`. The holder gets an email for every transfer. A Pribadi saldo that is short returns HTTP 402 with `error.gap_micro_idr`. The `Idempotency-Key` header is required. Limited to 10 requests per minute per key. Needs workspace access Kelola + pembayaran (level 3), with a key held by an Owner or Admin of the workspace.","x-workspace-access":3,"x-workspace-holder":"owner_or_admin","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/IdempotencyKeyRequired"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["amount_idr"],"properties":{"amount_idr":{"type":"integer","minimum":1000,"maximum":100000000,"description":"Whole rupiah."}}}}}},"responses":{"200":{"description":"OK.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"type":"object","required":["ok","amount_micro_idr","balance_micro_idr","personal_balance_micro_idr"],"properties":{"ok":{"type":"boolean","enum":[true]},"amount_micro_idr":{"type":"integer","format":"int64","description":"The amount moved, in micro-Rupiah."},"balance_micro_idr":{"type":"integer","format":"int64","description":"The workspace saldo after the move."},"personal_balance_micro_idr":{"type":"integer","format":"int64","description":"The holder's Pribadi saldo after the move."}}}}}},"400":{"$ref":"#\/components\/responses\/WorkspaceError"},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"402":{"description":"The saldo is short. `error.gap_micro_idr` says by how much, in micro-Rupiah, and `error.source` is `personal` when the short wallet is the holder's Pribadi saldo. A replayed answer carries `Idempotent-Replayed: true`.","headers":{"Idempotent-Replayed":{"$ref":"#\/components\/headers\/IdempotentReplayed"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkspaceError"}}}},"403":{"$ref":"#\/components\/responses\/WorkspaceError"},"404":{"$ref":"#\/components\/responses\/WorkspaceError"},"409":{"$ref":"#\/components\/responses\/WorkspaceError"},"413":{"$ref":"#\/components\/responses\/PayloadTooLarge"},"429":{"$ref":"#\/components\/responses\/WorkspaceError"},"500":{"$ref":"#\/components\/responses\/WorkspaceError"}}}}},"components":{"parameters":{"AnthropicCredential":{"name":"x-kenari-credential","in":"header","required":false,"schema":{"type":"string"},"description":"Id of the Anthropic API key to use. Required when the account has more than one."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"1 to 128 visible ASCII characters. Repeating a request with the same key and the same body returns the stored answer with `Idempotent-Replayed: true` and runs nothing again. The same key with a different body or route returns HTTP 409 `idempotency_key_reused`, and while the first request is still running HTTP 409 `request_in_progress`.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[!-~]{1,128}$"}},"IdempotencyKeyRequired":{"name":"Idempotency-Key","in":"header","required":true,"description":"Required on this route, without it the answer is HTTP 400 `idempotency_key_required`. 1 to 128 visible ASCII characters. Use a new value for each purchase or transfer and reuse it only to retry that same request, which then returns the stored answer with `Idempotent-Replayed: true` instead of charging again. The same key with a different body or route returns HTTP 409 `idempotency_key_reused`, and while the first request is still running HTTP 409 `request_in_progress`.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[!-~]{1,128}$"}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"kn-...","description":"A kenari API key. Create one in the dashboard; pass it as `Authorization: Bearer kn-...`. The raw value is shown once at creation."}},"schemas":{"QuotaWindow":{"type":"object","required":["budget_rp","used_rp","used_frac","remaining_rp","resets_at"],"properties":{"budget_rp":{"type":"integer","description":"Rupiah budget of this window."},"used_rp":{"type":"integer","description":"Rupiah used in this window."},"used_frac":{"type":"number","minimum":0,"maximum":1,"description":"Fraction of this window's budget already used, from 0 to 1 at 4 decimals. Computed from the exact burn, not from the rounded Rupiah fields."},"remaining_rp":{"type":"integer","description":"Rupiah still available in this window."},"resets_at":{"type":"string","format":"date-time","description":"Date and time when this rolling window resets, in RFC 3339 UTC format."}}},"ChatMessage":{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["system","user","assistant","tool"]},"content":{"description":"A string, or an array of content parts for multimodal input. Part types are `text`, `image_url`, `input_audio`, and `file`. An `input_audio` part carries `{ \"data\": \"<raw base64>\", \"format\": \"wav\" }`. The data is raw base64 with no data URL prefix. Accepted formats are wav, mp3, mpeg, ogg, oga, aac, flac, aiff, and aif. `input_audio` cannot be combined with kenari tools. A `file` part carries `{ \"filename\": \"faktur.pdf\", \"file_data\": \"data:application\/pdf;base64,...\" }` and requires the `file-parser` plugin: kenari reads the document to text before routing and gives the model the text, so the file itself never reaches the upstream model. `file_data` must be a data URL; a remote http URL is not fetched. Accepted media types are application\/pdf, image\/png, image\/jpeg, image\/webp, image\/gif and image\/tiff. One `file` part per request: a second one is a 400, because kenari would otherwise answer about only the first document without saying so.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object","additionalProperties":true}}]},"name":{"type":"string"},"tool_calls":{"type":"array","items":{"type":"object","additionalProperties":true}},"tool_call_id":{"type":"string"}},"additionalProperties":true},"ChatCompletionRequest":{"type":"object","required":["model","messages"],"additionalProperties":true,"properties":{"model":{"type":"string","description":"A model id from GET \/v1\/models, a `:free` variant, one of your named routes, or a BYOK id of the form `byok\/<provider>\/<upstream-model-id>`.","examples":["deepseek-v4-flash","byok\/openrouter\/deepseek\/deepseek-v4-flash-0731"]},"messages":{"type":"array","items":{"$ref":"#\/components\/schemas\/ChatMessage"}},"stream":{"type":"boolean","default":false},"max_tokens":{"type":"integer"},"temperature":{"type":"number"},"top_p":{"type":"number"},"stop":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"frequency_penalty":{"type":"number"},"presence_penalty":{"type":"number"},"reasoning_effort":{"type":"string","description":"For reasoning models that advertise `reasoning_options`.","examples":["medium"]},"reasoning":{"type":"object","description":"OpenRouter-compatible unified reasoning control; translated to each provider natively.","properties":{"effort":{"type":"string","description":"Reasoning effort level: low, medium, high, xhigh, or max. Mapped to reasoning_effort (OpenAI-wire) or budget_tokens (Anthropic-wire).","examples":["medium"]},"enabled":{"type":"boolean","description":"Set false to disable reasoning on models that support it. kenari maps this to each backend's native disable param."},"max_tokens":{"type":"integer","description":"Token budget for the reasoning trace. Mapped to budget_tokens (Anthropic) or the nearest effort level (OpenAI)."},"exclude":{"type":"boolean","description":"If true, the reasoning trace is omitted from the response. Tokens are still generated and billed as output."}}},"web_search_options":{"type":"object","description":"Passthrough to upstream native search when supported. Not a kenari trigger. For kenari's provider-agnostic search on any model, use tools: [{ \"type\": \"kenari:web_search\" }]. See the Server tools docs page.","additionalProperties":true},"plugins":{"type":"array","description":"Pre-dispatch plugins. The only entry today is the file parser, which reads a `file` content part to text before the request is routed. The parse is billed per page and runs exactly once per request, not once per failover.","examples":[[{"id":"file-parser","pdf":{"engine":"ocr"}}]],"items":{"type":"object","required":["id"],"additionalProperties":true,"properties":{"id":{"type":"string","enum":["file-parser"]},"pdf":{"type":"object","properties":{"engine":{"type":"string","enum":["ocr"],"description":"Required. `ocr` reads the document with an optical character recognition engine. A missing or unknown engine is a 400, never a silent passthrough."},"reuse_id":{"type":"string","description":"A `reuse_id` returned by an earlier parse. Sending it skips the parse and costs nothing, so a follow-up question about the same document is free. It is opaque, issued by kenari, and valid only for the account that received it. Send it with no `file` part."}}}}}},"tools":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"User-defined function tools, native built-in tools (passthrough), and kenari server tools ({ \"type\": \"kenari:web_search\" }, { \"type\": \"kenari:web_fetch\" }, { \"type\": \"kenari:datetime\" }). kenari server tools run server-side: the model decides when to call, kenari executes. web_search and web_fetch bill per call; datetime is free."}},"tool_choice":{"description":"`auto`, `none`, `required`, or a tool object.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]},"response_format":{"type":"object","description":"Structured output. `{\"type\":\"text\"}` (default), `{\"type\":\"json_object\"}`, or `{\"type\":\"json_schema\",\"json_schema\":{\"name\":...,\"schema\":{...},\"strict\":true}}`. Routes that speak this wire receive the field as sent. kenari also appends a short instruction to the system prompt (the schema itself for json_schema), so the model answers in JSON on every route, including one that ignores the native field. Those instruction tokens count as input tokens.","additionalProperties":true,"properties":{"type":{"type":"string","enum":["text","json_object","json_schema"]},"json_schema":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"schema":{"type":"object","additionalProperties":true},"strict":{"type":"boolean"},"description":{"type":"string"}}}}}}},"ChatCompletionResponse":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"chat.completion"},"created":{"type":"integer"},"model":{"type":"string"},"choices":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"message":{"type":"object","properties":{"role":{"type":"string"},"content":{"type":["string","null"]},"reasoning":{"type":["string","null"],"description":"Reasoning \/ chain-of-thought text, passed through for models that emit it."},"tool_calls":{"type":"array","items":{"type":"object","additionalProperties":true}},"annotations":{"type":"array","description":"Present when a plugin produced something the caller needs back. The file parser adds one entry per parsed document. Not emitted on a streamed response.","items":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string","enum":["file"]},"file":{"type":"object","additionalProperties":true,"properties":{"hash":{"type":"string","description":"sha256 of the parsed text, prefixed `sha256:`."},"name":{"type":"string","description":"The filename you sent."},"content":{"type":"array","description":"The parsed document, as markdown text parts.","items":{"type":"object","additionalProperties":true}},"confidence":{"type":["number","null"],"description":"Mean per-page confidence reported by the engine, 0 to 1."},"low_confidence":{"type":"boolean","description":"True when the parse scored below kenari's floor, or reported no score at all. This is a WARNING, not a guarantee: a parse can be wrong while scoring above the floor, so figures read out of a scanned document need a human check either way."},"reuse_id":{"type":"string","description":"Send this back in `plugins[].pdf.reuse_id` on a follow-up turn to skip the parse and its per-page charge."}}}}}}},"additionalProperties":true},"finish_reason":{"type":["string","null"]}},"additionalProperties":true}},"usage":{"$ref":"#\/components\/schemas\/Usage"}},"additionalProperties":true},"Usage":{"type":"object","properties":{"prompt_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"},"total_tokens":{"type":"integer"},"prompt_tokens_details":{"type":"object","additionalProperties":true,"description":"Includes `cached_tokens` when the upstream reports a cache read."}},"additionalProperties":true},"ModelList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Model"}}}},"CatalogChangeList":{"type":"object","required":["object","channel","all_plans","data"],"properties":{"object":{"type":"string","const":"list"},"channel":{"type":["string","null"],"description":"Public Telegram channel handle such as `@kenari_updates`, null when none is set."},"all_plans":{"type":"array","items":{"type":"string"},"description":"Names of the active public plans, cheapest first. A `plans_changed` item whose plan list equals this set is read as \"all plans\"."},"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/CatalogChange"}}}},"CatalogChangeTiers":{"type":"array","description":"Long-context price tiers at list price, ascending by `above_input_tokens`. Present on both sides of a `price_changed` record when either side has tiers (an empty array on a side without), and on the `new` of an `added` record when the model has tiers. The whole request is billed at the highest tier whose `above_input_tokens` its input tokens (cache included) exceed, else at the base prices.","items":{"type":"object","required":["above_input_tokens","input_micro_idr_per_1m","output_micro_idr_per_1m","cached_input_micro_idr_per_1m","cache_write_micro_idr_per_1m"],"properties":{"above_input_tokens":{"type":"integer"},"input_micro_idr_per_1m":{"type":"integer"},"output_micro_idr_per_1m":{"type":"integer"},"cached_input_micro_idr_per_1m":{"type":"integer","description":"0 bills cache read tokens at this tier's Input."},"cache_write_micro_idr_per_1m":{"type":"integer","description":"0 bills cache write tokens at this tier's Input."}}}},"CatalogChange":{"type":"object","required":["model","kind","detected_at","confirmed_at"],"properties":{"model":{"type":"string"},"kind":{"type":"string","enum":["added","removed","price_changed","price_scheduled","sunset_scheduled","plans_changed","updated"]},"old":{"type":["object","integer","null"],"description":"Before. For price kinds an object with `free`, `price_in`, `price_out` and `image` (micro-IDR per 1M tokens, per image for `image`). A model priced by lines instead of chat tokens or per image (embedding, rerank, moderation, speech, video, music) also has `lines`: its price lines in micro-IDR per each line's `unit`, with 0 in `price_in` and `price_out`. For `sunset_scheduled` the previous epoch seconds or null. For `plans_changed` an object `{plans}`: the public plan names that included the model, cheapest first. For `updated` an object `{revision}`: the revision announced before, null when there was none. A `price_changed` record of a model priced in tokens also has `price_cached` and `price_cache_write` (integers, micro-IDR per 1M cache read and cache write tokens) when that cache price moved, on both `old` and `new`. On a `price_changed` record of a model with long-context tiers on either side, each of the two is present on a side whenever the model has that price set on that side, moved or not, and absent when it is unset. Both are absent on every other kind and on records stored before cache prices were compared. A `price_changed` record of a model with long-context tiers on either side also has `price_tiers` on both sides (see `new`).","properties":{"price_cached":{"type":"integer","description":"price_changed only. Present when the cache read price moved, and on a price change of a model with long-context tiers whenever the model has that price set. Micro-IDR per 1M cache read tokens."},"price_cache_write":{"type":"integer","description":"price_changed only. Present when the cache write price moved, and on a price change of a model with long-context tiers whenever the model has that price set. Micro-IDR per 1M cache write tokens."},"price_tiers":{"$ref":"#\/components\/schemas\/CatalogChangeTiers"}}},"new":{"type":["object","integer","null"],"properties":{"price_cached":{"type":"integer","description":"price_changed and added. On price_changed, present when the cache read price moved, and on a price change of a model with long-context tiers whenever the model has that price set. On added, present when a model priced in tokens has a cache read price. Micro-IDR per 1M cache read tokens."},"price_cache_write":{"type":"integer","description":"price_changed and added. On price_changed, present when the cache write price moved, and on a price change of a model with long-context tiers whenever the model has that price set. On added, present when a model priced in tokens has a cache write price. Micro-IDR per 1M cache write tokens."},"price_tiers":{"$ref":"#\/components\/schemas\/CatalogChangeTiers"}},"description":"After, same shapes as `old`, `lines`, `price_cached`, `price_cache_write` and `price_tiers` included. For `price_scheduled` the prices that take effect at `effective_at`. For `added` the prices, plus `price_cached` and `price_cache_write` when a model priced in tokens has that price set, plus `price_tiers` when the new model has long-context tiers, plus `plans` (the public plan names that include the new model) when any does, plus `sunset_at` (integer epoch seconds, the moment the model is scheduled to retire) when the model is listed with a retirement already set, and `successor` (the public id of the model that replaces it) when that retirement names one. Both keys are absent when there is no date, and `successor` is never present without `sunset_at`. For `updated` an object `{revision, note}`: the model's new revision (the vendor's own version or checkpoint behind an unchanged model id) and `note`, `{id, en}` with a null member for a language without a note, or null when there is none."},"successor":{"type":["string","null"],"description":"The model named as this model's successor, for sunset_scheduled and removed. null otherwise (an `added` item carries its successor inside `new`)."},"effective_at":{"type":["integer","null"],"description":"Epoch seconds a scheduled change takes effect. Null for the other kinds."},"detected_at":{"type":"integer","description":"Epoch seconds the change was first seen."},"confirmed_at":{"type":"integer","description":"Epoch seconds the change entered this list: the same moment as `detected_at` for scheduled changes, about ten minutes later for price changes, plan changes and revisions, about an hour later for new models and removals. The list is ordered by this, newest first."}}},"Model":{"type":"object","required":["id","object","name"],"properties":{"id":{"type":"string"},"object":{"type":"string","const":"model"},"owned_by":{"type":"string","description":"The model vendor (e.g. anthropic, openai, deepseek)."},"sunset_at":{"type":["integer","null"],"description":"Epoch-seconds moment this model is scheduled to stop being served, null when none is scheduled. The row still lists and serves until then."},"context_length":{"type":"integer","description":"Maximum context window in tokens. Omitted when unknown."},"max_input_tokens":{"type":"integer","description":"Most input tokens one request may carry, when the vendor caps input below context_length (GPT-6: 922,000 of a 1,050,000 window). Omitted when context_length is the only limit. A request whose input is over it is refused with context_length_exceeded."},"max_output_tokens":{"type":"integer","description":"Maximum tokens the model can generate in one response. Omitted when unknown. This is the model's own limit, not a default Kenari applies."},"protocols":{"type":"array","description":"Wire protocols this model answers on. Present on chat models and kenari\/auto, omitted on every other row.","items":{"type":"string","enum":["openai-chat","openai-responses","anthropic-messages"]}},"modalities":{"type":"object","description":"Accepted and produced modalities. Omitted when unknown.","properties":{"input":{"type":"array","items":{"type":"string"}},"output":{"type":"array","items":{"type":"string"}}}},"reasoning":{"type":"boolean","description":"Whether the model produces reasoning \/ extended thinking."},"tool_call":{"type":"boolean","description":"Whether the model supports tool \/ function calling."},"reasoning_options":{"type":"array","items":{"type":"string"},"description":"Supported reasoning effort levels, e.g. [\"low\",\"medium\",\"high\"]."},"supported_reasoning_levels":{"type":"array","items":{"type":"string"},"description":"Same values as `reasoning_options`, in the field name some agent gateways read. Omitted when the model has no effort levels."},"pricing":{"$ref":"#\/components\/schemas\/Pricing"},"pricing_lines":{"type":"array","description":"Per-billable price lines. Same parser works across chat, image, speech, video, and specialized rows. Omitted when the row carries no sellable line.","items":{"$ref":"#\/components\/schemas\/PricingLine"}},"endpoints":{"type":"array","description":"Kenari API families this row answers (chat, embeddings, rerank, images, audio_speech, audio_transcription, videos, music). Omitted when the array is empty.","items":{"type":"string"}},"voices":{"type":"array","description":"Voices this model can speak, in operator order. Element 0 is the default, used when `\/v1\/audio\/speech` is called without `voice`. Names are the upstream vendor's own and are sent through verbatim, so they are case-sensitive vocabularies that do not overlap between vendors. Omitted when the catalog has no voices recorded for the row, in which case any voice the upstream accepts is allowed.","items":{"type":"string"}},"formats":{"type":"array","description":"Output audio formats this model can produce. Element 0 is the default. On a TTS model it is the operator's list, in operator order, and element 0 is used when `\/v1\/audio\/speech` is called without `response_format`. It is omitted when the catalog has no formats recorded for the row, in which case mp3, wav and pcm are all accepted and anything else is treated as mp3. On a music model it follows the model's family: `[\"mp3\"]` for an mp3 model and `[\"m4a\", \"wav\"]` for an m4a model, the default of `\/v1\/music\/generations` being element 0. A music model that mixes the two families is an mp3 model.","items":{"type":"string","enum":["mp3","wav","pcm","m4a"]}},"max_input_chars":{"type":"integer","description":"Longest `input` this TTS model accepts, in characters. Omitted when the catalog records no ceiling for the row, which means the gateway does not cap the length. A longer input is rejected with a 400 before anything is charged."},"max_prompt_chars":{"type":"integer","description":"Longest `prompt` this music model accepts, in characters. Omitted when the catalog records no ceiling for the row, in which case the gateway applies its built-in default of 2000 on an mp3 model and 10000 on an m4a model. A longer prompt is rejected with a 400 before anything is charged."},"max_lyrics_chars":{"type":"integer","description":"Longest `lyrics` this music model accepts, in characters. Omitted when the catalog records no ceiling for the row, in which case the gateway applies its built-in default of 3500 on an mp3 model and 10000 on an m4a model. Longer lyrics are rejected with a 400 before anything is charged."},"max_duration_secs":{"type":"integer","description":"Longest song this music model produces, in seconds. Informational: song length is a property of the model, not a request parameter, so there is nothing to send and nothing is rejected on this value. Omitted when the catalog records no figure for the row."},"video_extensions":{"type":"boolean","enum":[true],"description":"Present and true on a video model that can be extended with `POST \/v1\/videos\/extensions`. Omitted when the model cannot be extended."},"max_reference_images":{"type":"integer","minimum":0,"description":"The most reference images one `POST \/v1\/videos\/generations` request to this video model can carry in `input_images`. 0 means the model takes none, so send the start frame as `image_url` instead. Omitted on a model that is not a video model, and omitted when the gateway publishes no figure for the model, which does not mean it takes none."},"reasoning_toggle":{"type":"boolean","description":"Whether reasoning can be switched on or off per request for this model."},"modality":{"type":"string","enum":["embedding","rerank","moderation","systemone"],"description":"Specialized modality of this row. Present only on results of `?modality=`, absent on chat models."},"name":{"type":"string","description":"Display name. Always present: the model's human-readable name (for example \"GLM-5.3-Flash\"), otherwise the model id. Display only, the id is what a request names."},"backends":{"type":"array","items":{"type":"string"},"description":"Internal fulfillment backends. Present only for admin keys."},"beta":{"type":"boolean","description":"True on the kenari\/auto beta row only, which is synthesized per request and carries no catalog-backed metadata."}}},"PricingLine":{"type":"object","description":"One billable line. Micro-Rupiah per the unit named in `unit`.","required":["endpoint","billable","unit","micro_idr"],"properties":{"endpoint":{"type":"string","description":"Kenari API family the line bills on: chat, embeddings, rerank, moderations, images, audio_speech, audio_transcription, videos, or music."},"billable":{"type":"string","description":"What is being billed: input, output, cache_read, cache_write, output_image, output_audio, output_video, input_audio."},"unit":{"type":"string","enum":["token_1m","image","second","1k_chars","request","megapixel","song"]},"variant":{"type":["string","null"],"description":"Optional tier label (e.g. a 2K image size). Null for the billable-only rows."},"micro_idr":{"type":"integer","description":"Price in micro-Rupiah per `unit`."}}},"PricingTier":{"type":"object","description":"One long-context price tier, in micro-Rupiah per 1,000,000 tokens like the rest of `Pricing`. The whole request is billed at the highest tier whose `above_input_tokens` its input tokens (cache included) exceed. Rates follow the same promo convention as `Pricing.input` and `Pricing.output`, and cache dimensions are null when unset.","required":["above_input_tokens","input","output","cache_read","cache_write"],"properties":{"above_input_tokens":{"type":"integer","description":"The tier applies when the request's input tokens, cache read and cache write included, are above this number."},"input":{"type":"integer"},"output":{"type":"integer"},"cache_read":{"type":["integer","null"]},"cache_write":{"type":["integer","null"]}}},"Pricing":{"type":"object","description":"Per-token rate card. Values are micro-Rupiah per 1,000,000 tokens; divide by 1,000,000 for Rupiah per 1M tokens. Cache dimensions are null when unset. Omitted entirely for a model with no sellable price.","required":["tiers"],"properties":{"input":{"type":["integer","null"]},"output":{"type":["integer","null"]},"cache_read":{"type":["integer","null"]},"cache_write":{"type":["integer","null"]},"free":{"type":"boolean","description":"True when this is a no-charge route."},"varies":{"type":"boolean","description":"True on the kenari\/auto row only, where the served model and its price differ per request. The other pricing fields are absent there, except `tiers`, which is empty."},"currency":{"type":"string","const":"IDR"},"unit":{"type":"string","const":"micro_idr_per_1m_tokens"},"tiers":{"type":"array","description":"Long-context price tiers, ascending by `above_input_tokens`, empty when the model has none. The whole request is billed at the highest tier whose `above_input_tokens` its input tokens (cache included) exceed, else at the rates above.","items":{"$ref":"#\/components\/schemas\/PricingTier"}}}},"MessagesRequest":{"type":"object","required":["model","messages"],"additionalProperties":true,"properties":{"model":{"type":"string","examples":["deepseek-v4-flash"]},"max_tokens":{"type":"integer"},"messages":{"type":"array","items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"object","additionalProperties":true}}]}},"additionalProperties":true}},"system":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"object","additionalProperties":true}}]},"stream":{"type":"boolean","default":false},"temperature":{"type":"number"},"top_p":{"type":"number"},"top_k":{"type":"integer"},"stop_sequences":{"type":"array","items":{"type":"string"}},"tools":{"type":"array","items":{"type":"object","additionalProperties":true}},"tool_choice":{"type":"object","additionalProperties":true},"thinking":{"type":"object","additionalProperties":true,"description":"Extended-thinking config for reasoning-capable models."},"output_config":{"type":"object","additionalProperties":true,"properties":{"effort":{"type":"string","description":"low, medium, high, xhigh, or max."},"format":{"type":"object","description":"Structured output: `{\"type\":\"json_schema\",\"schema\":{...}}`. Routes that speak the Messages API receive the field as sent, and an OpenAI-shaped route receives it as `response_format`. kenari also appends a short instruction to the system prompt (the schema itself for json_schema), so the model answers in JSON on every route, including one that ignores the native field. Those instruction tokens count as input tokens.","additionalProperties":true,"properties":{"type":{"type":"string","enum":["json_schema"]},"schema":{"type":"object","additionalProperties":true}}}}},"output_format":{"type":"object","additionalProperties":true,"deprecated":true,"description":"Older spelling of `output_config.format`, accepted with the same meaning. `output_config.format` wins when both are sent."}}},"MessagesResponse":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","const":"message"},"role":{"type":"string","const":"assistant"},"model":{"type":"string"},"content":{"type":"array","items":{"type":"object","additionalProperties":true}},"stop_reason":{"type":["string","null"]},"stop_sequence":{"type":["string","null"]},"usage":{"type":"object","properties":{"input_tokens":{"type":"integer"},"output_tokens":{"type":"integer"}},"additionalProperties":true}},"additionalProperties":true},"ResponsesRequest":{"type":"object","required":["model","input"],"additionalProperties":true,"description":"Stateless subset of the OpenAI Responses API request. Only `function` tools translate (other tool types are dropped); `previous_response_id` must be absent or null.","properties":{"model":{"type":"string","examples":["gpt-5-5"]},"instructions":{"type":"string","description":"Top-level system\/developer instructions, folded into the system prompt."},"input":{"type":"array","description":"Ordered conversation items: message (role developer\/user\/assistant), function_call, function_call_output. A `reasoning` item is tolerated and ignored; any other unknown item type is dropped, not an error.","items":{"type":"object","additionalProperties":true}},"tools":{"type":"array","description":"Flat top-level tool declarations ({ \"type\": \"function\", \"name\", \"description\", \"parameters\" }). `function` tools translate. A `namespace` tool ({ \"type\": \"namespace\", \"name\", \"tools\": [function, ...] }) is flattened: each function child becomes a function tool named `<namespace>__<tool>`, and calls come back under that name. A namespace with a missing or empty name, a non-array `tools`, a nameless child, or a flattened name that collides with another tool is rejected with 400. Other types (web_search, ...) are silently dropped.","items":{"type":"object","additionalProperties":true}},"tool_choice":{"description":"`auto`, `none`, `required`, or `{ \"type\": \"function\", \"name\": ... }`.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]},"reasoning":{"type":["object","null"],"description":"Reasoning control for reasoning-capable models. Codex sends `null` when reasoning is not configured.","additionalProperties":true,"properties":{"effort":{"type":"string","description":"low, medium, high, xhigh, or max.","examples":["medium"]}}},"max_output_tokens":{"type":"integer"},"temperature":{"type":"number"},"top_p":{"type":"number"},"stream":{"type":"boolean","default":false},"store":{"type":"boolean","description":"Accepted and ignored: kenari's \/v1\/responses is always stateless (behaves as store:false)."},"previous_response_id":{"type":["string","null"],"description":"Not supported. A non-null value returns 400: kenari's \/v1\/responses has no server-side response storage to chain from."},"prompt_cache_key":{"type":"string","description":"Routing hint that keeps one conversation on the credential holding its cached prefix. Hashed with your account before it reaches an upstream, so the value you send is never forwarded and two accounts using the same string do not share a cache. Max 512 bytes; an absent or whitespace-only value maps to None."},"text":{"type":"object","description":"Output text configuration. `format.type` is `text` (the default), `json_object`, or `json_schema` with `name`, `schema`, and optional `strict` and `description` on the format object itself. Any other type returns 400. kenari also appends a short instruction to the system prompt (the schema itself for json_schema), so the model answers in JSON on every route, including one that ignores the native field. Those instruction tokens count as input tokens.","properties":{"format":{"type":"object","properties":{"type":{"type":"string","enum":["text","json_object","json_schema"]},"name":{"type":"string"},"schema":{"type":"object","additionalProperties":true},"strict":{"type":"boolean"},"description":{"type":"string"}},"additionalProperties":true}},"additionalProperties":true},"parallel_tool_calls":{"type":"boolean","description":"Accepted and ignored. The real Codex CLI sends `false` on every request, so kenari never rejects any value of this field."},"include":{"type":"array","description":"Accepted and ignored: kenari does not emit the response-side fields (encrypted reasoning, etc.) this would surface.","items":{"type":"string"}},"metadata":{"type":"object","description":"Accepted and ignored: a free-form tag kenari does not consume.","additionalProperties":true}}},"ResponsesResponse":{"type":"object","properties":{"id":{"type":"string","description":"Always prefixed `resp_`, freshly minted (never the upstream id)."},"object":{"type":"string","const":"response"},"created_at":{"type":"integer"},"status":{"type":"string","enum":["completed","incomplete"]},"incomplete_details":{"type":"object","description":"Present only when status is `incomplete`: the output was truncated by the token cap.","properties":{"reason":{"type":"string","enum":["max_output_tokens"]}}},"model":{"type":"string"},"output":{"type":"array","description":"Ordered output items: `message` (assistant text) and `function_call`.","items":{"type":"object","additionalProperties":true}},"usage":{"type":"object","properties":{"input_tokens":{"type":"integer"},"output_tokens":{"type":"integer"},"total_tokens":{"type":"integer"},"input_tokens_details":{"type":"object","properties":{"cached_tokens":{"type":"integer"}}}},"additionalProperties":true},"text":{"type":"object","description":"The output format the request asked for in `text.format`, echoed back. `{\"format\":{\"type\":\"text\"}}` when it asked for none.","properties":{"format":{"type":"object","additionalProperties":true}}}},"additionalProperties":true},"ImageRequest":{"type":"object","required":["model","prompt"],"additionalProperties":true,"properties":{"model":{"type":"string","examples":["gpt-image-2"]},"prompt":{"type":"string"},"n":{"type":"integer","default":1},"size":{"type":"string","examples":["1024x1024"]},"response_format":{"type":"string","enum":["url","b64_json"]}}},"ImageResponse":{"type":"object","properties":{"created":{"type":"integer"},"data":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Always a self-contained data: URI (data:image\/png;base64,...), never a link to an external host. Decode it inline; there is nothing to download."},"b64_json":{"type":"string"},"revised_prompt":{"type":"string"}}}}}},"EmbeddingRequest":{"type":"object","required":["model","input"],"additionalProperties":true,"properties":{"model":{"type":"string","examples":["bge-m3"]},"input":{"description":"Text to embed: a single string, or an array of strings.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}},"EmbeddingResponse":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"model":{"type":"string","description":"Echoes the model id you requested."},"data":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["embedding"]},"index":{"type":"integer"},"embedding":{"type":"array","items":{"type":"number"}}}}}}},"ModerationRequest":{"type":"object","required":["model","input"],"additionalProperties":true,"properties":{"model":{"type":"string","examples":["smoke-moderation"]},"input":{"description":"Text to classify: a single string, or an array of strings.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}},"ModerationResponse":{"type":"object","properties":{"id":{"type":"string"},"model":{"type":"string","description":"Echoes the model id you requested."},"results":{"type":"array","description":"One entry per input, in order.","items":{"type":"object","properties":{"flagged":{"type":"boolean"},"categories":{"type":"object","additionalProperties":{"type":"boolean"}},"category_scores":{"type":"object","additionalProperties":{"type":"number"}}}}}}},"RerankRequest":{"type":"object","required":["model","query","documents"],"additionalProperties":true,"properties":{"model":{"type":"string","examples":["bge-reranker-base"]},"query":{"type":"string","description":"The search query to rank documents against. Up to 8192 bytes."},"documents":{"type":"array","description":"Documents to rank, in order. Up to 100, each up to 8192 bytes, 512 KiB combined.","items":{"type":"string"}},"top_n":{"type":"integer","minimum":1,"description":"Return only the top N results (default: all documents)."},"return_documents":{"type":"boolean","description":"Include each result's document text in the response (default: false)."}}},"RerankResponse":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"model":{"type":"string","description":"Echoes the model id you requested."},"results":{"type":"array","description":"Sorted best match first.","items":{"type":"object","properties":{"index":{"type":"integer","description":"Index into the request's `documents` array."},"relevance_score":{"type":"number"},"document":{"type":"object","description":"Present only when the request set `return_documents: true`.","properties":{"text":{"type":"string"}}}}}},"usage":{"type":"object","properties":{"prompt_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}}}}},"SystemOneRequest":{"type":"object","required":["model"],"description":"Send exactly one of questions or fields. A questions call also needs state. A fields call needs state too, unless it sends an image.","oneOf":[{"required":["state","questions"]},{"required":["fields"]}],"additionalProperties":true,"properties":{"model":{"type":"string","examples":["jev-1-13:free","jev-latest","clef:free"]},"state":{"description":"Text, a JSON object, or an array of text to evaluate. An asset reference written here places that image. A Clairic call reads it as text, so an object or an array is sent on as its JSON text."},"questions":{"type":"object","additionalProperties":{"type":"object","required":["type","instructions"],"properties":{"type":{"type":"string","enum":["noul","choice","score","box"],"description":"box finds one thing in an image and needs an image in assets. It takes no criteria."},"instructions":{"description":"The question. A string, object, or array. May hold asset references."},"criteria":{"description":"Noul true\/false descriptions, a choice map, or an ordered score rubric. May hold asset references."}}}},"fields":{"type":"object","description":"Clairic only. A map of field name to a typed field, 1 to 64 fields, in place of questions. A name is 1 to 64 characters from A-Z, a-z, 0-9, underscore, dot and hyphen, and starts with a letter or underscore. Each field is sent on as given, so it also takes what Clairic reads for its type: unit, integer, decimals, items for a list, min, max, step, scale and null_threshold for an estimate or a forecast, horizon and interval for a forecast.","minProperties":1,"maxProperties":64,"additionalProperties":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["text","number","date","time","datetime","duration","list","estimate","forecast"]},"instructions":{"type":"string","description":"What the field should contain. May hold asset references."}}}},"reference_date":{"type":"string","description":"Clairic only. An ISO date that anchors dates written without a year."},"options":{"type":"object","description":"Clairic only.","properties":{"include_quantiles":{"type":"boolean","description":"Add 99 percentiles to estimates."},"return_state_text":{"type":"boolean","description":"Return the text that the spans in the answers index into, as state_text."}}},"assets":{"type":"object","description":"Images for a model whose input modalities include image. Each key is a reference string, written wherever the image belongs in state, instructions, or criteria. PNG or JPEG. Jev models take at most 16 images of 16 MiB each, with each side 280 to 1,568 px. Clef and Clairic models take at most 4 images, 4 MiB and 16 megapixels each, 8 MiB together.","additionalProperties":{"type":"object","required":["format","data_base64"],"properties":{"type":{"type":"string","enum":["image"]},"format":{"type":"string","enum":["png","jpg","jpeg"]},"data_base64":{"type":"string","description":"Standard base64 of the file, without a data: prefix."}}}},"images":{"type":"array","description":"Clef and Clairic models only: positional images placed before the state, as data URLs or objects. At most 4, 4 MiB each and 8 MiB together. Send assets or images, not both.","maxItems":4,"items":{"oneOf":[{"type":"string","description":"data:image\/png, image\/jpeg, or image\/webp base64 URL."},{"type":"object","required":["content_type","base64"],"properties":{"content_type":{"type":"string","enum":["image\/png","image\/jpeg","image\/webp"]},"base64":{"type":"string"}}}]}},"audio":{"type":"array","description":"Clef Omni only, for a model whose input modalities include audio. Up to 4 clips, WAV or MP3, 8 MiB each. Audio and videos together are at most 16 MiB. Base64 only: a URL is a 400.","maxItems":4,"items":{"oneOf":[{"type":"string","description":"data:audio\/wav or data:audio\/mpeg base64 URL."},{"type":"object","required":["content_type","base64"],"properties":{"content_type":{"type":"string","enum":["audio\/wav","audio\/x-wav","audio\/wave","audio\/mpeg","audio\/mp3"]},"base64":{"type":"string"}}}]}},"videos":{"type":"array","description":"Clef Omni only, for a model whose input modalities include video. Up to 2 videos, MP4 or WebM, 16 MiB each. Audio and videos together are at most 16 MiB. Base64 only: a URL is a 400.","maxItems":2,"items":{"oneOf":[{"type":"string","description":"data:video\/mp4 or data:video\/webm base64 URL."},{"type":"object","required":["content_type","base64"],"properties":{"content_type":{"type":"string","enum":["video\/mp4","video\/webm"]},"base64":{"type":"string"}}}]}}}},"SystemOneResponse":{"type":"object","required":["model","answers","usage"],"properties":{"model":{"type":"string","description":"The versioned model id that answered, when it is a Jev id."},"answers":{"type":"object","additionalProperties":true,"description":"One answer per question id, or per field name for a fields call. A field answer carries its type and value, and value is null when the input does not determine it."},"truncated":{"type":"boolean","description":"Clairic only. Whether the state was truncated to fit the model."},"state_text":{"type":"string","description":"Clairic only, when options.return_state_text is true. The text that the spans in the answers index into."},"usage":{"type":"object","properties":{"input_tokens":{"type":"integer"},"output_tokens":{"type":"integer"}}}}},"OpenAIErrorBody":{"type":"object","description":"OpenAI-style error envelope. `type` and `code` carry the same kenari error code, except an upstream rejection, whose `type` is `invalid_request_error` and whose `code` is the specific reason.","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string","enum":["bad_request","model_not_found","model_unavailable","upstream_error","all_providers_failed","internal_error","insufficient_balance","payg_limit_reached","key_spend_cap_reached","member_spend_cap_reached","rate_limit_exceeded","plan_limit_reached","subscribers_only","subscription_required","byok_credential_unavailable","invalid_request_error","no_wire_for_modality"]},"param":{"type":["string","null"]},"code":{"type":"string","description":"Same as type for most errors; for an upstream rejection (type invalid_request_error) it is the specific reason.","enum":["bad_request","model_not_found","model_unavailable","upstream_error","all_providers_failed","internal_error","insufficient_balance","payg_limit_reached","key_spend_cap_reached","member_spend_cap_reached","rate_limit_exceeded","plan_limit_reached","subscribers_only","subscription_required","byok_credential_unavailable","invalid_request_error","context_length_exceeded","content_policy_violation","upstream_rejected","upstream_declined","no_wire_for_modality","no_answer_after_search"]}}}}},"AnthropicErrorBody":{"type":"object","description":"Anthropic-style error envelope.","properties":{"type":{"type":"string","const":"error"},"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request_error","not_found_error","payment_required","rate_limit_error","permission_error","api_error"]},"message":{"type":"string"}}}}},"ManagedAgentsErrorBody":{"type":"object","description":"The JSON error envelope of the Anthropic passthrough, in Anthropic's shape. An error kenari raises itself adds `error.code`. An error relayed from Anthropic has no `code` and may carry a top-level `request_id`.","required":["type","error"],"properties":{"type":{"type":"string","const":"error"},"error":{"type":"object","required":["type","message"],"properties":{"type":{"type":"string","description":"kenari raises `invalid_request_error` (400, 409), `authentication_error` (401), `permission_error` (403), `not_found_error` (404), `request_too_large` (413), `rate_limit_error` (429) and `api_error` (500, 503). A relayed error can carry any other value Anthropic uses, such as `overloaded_error`, so treat the list as open."},"message":{"type":"string"},"code":{"type":"string","description":"Only on an error kenari raises itself. Branch on it when it is present.","enum":["auth_failed","invalid_path","shared_key_not_allowed","restricted_key_not_allowed","subscription_required","credential_not_found","anthropic_credential_required","credential_required","credit_limit_reached","request_too_large","rate_limit_exceeded","passthrough_busy","upstream_error"]},"param":{"type":["string","null"],"description":"Only on a 403 `shared_key_not_allowed` or `restricted_key_not_allowed`, where it is always null."}}},"request_id":{"type":"string","description":"Anthropic's request id. Only on an error relayed from Anthropic. The same id arrives in the `anthropic-request-id` header."}}},"WorkspaceError":{"type":"object","description":"The `\/v1` error envelope of the workspace routes. Branch on `error.code`. `type` follows the status: `invalid_request_error` (400), `insufficient_balance` (402), `permission_error` (403), `not_found_error` (404), `conflict_error` (409), `rate_limit_error` (429) and `server_error` (500). A 500 always carries the message `internal error`.","required":["error"],"properties":{"error":{"type":"object","required":["message","type","param","code"],"properties":{"message":{"type":"string","description":"English by default. Send `x-kenari-locale: id`, or an `Accept-Language` that starts with `id`, for Indonesian."},"type":{"type":"string","enum":["invalid_request_error","insufficient_balance","permission_error","not_found_error","conflict_error","rate_limit_error","server_error"]},"param":{"type":["string","null"]},"code":{"type":"string","enum":["workspace_access_required","shared_key_not_allowed","restricted_key_not_allowed","teams_not_enabled","not_a_team_workspace","permission_denied","invalid_request","insufficient_balance","not_found","conflict","rate_limited","pending_limit_reached","daily_limit_reached","idempotency_key_required","idempotency_key_reused","request_in_progress","fund_cap_reached","pay_from_personal_not_supported","invalid_api_key","internal_error"]},"gap_micro_idr":{"type":"integer","format":"int64","description":"Only on HTTP 402. How much is missing, in micro-Rupiah."},"source":{"type":"string","enum":["personal"],"description":"Only on HTTP 402. Present when the short wallet is the holder's Pribadi saldo."}}}}},"WorkspaceInfo":{"type":"object","required":["id","kind","role"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"],"description":"The team's name, null for a personal workspace."},"kind":{"type":"string","enum":["personal","team"]},"role":{"type":"string","enum":["owner","admin","member"],"description":"The holder's role in this workspace."},"member_limit":{"type":"integer"},"seat_mode":{"type":"boolean","description":"True when the workspace buys per-seat plans."},"balance_micro_idr":{"type":"integer","format":"int64","description":"The workspace saldo, in micro-Rupiah."},"default_cap_micro_idr":{"type":["integer","null"],"format":"int64","description":"The PAYG limit a new member joins with. Owner and Admin only, null for a Member and when none is set."}}},"WorkspaceView":{"type":"object","required":["id","name","kind","role","personal","owner_label"],"properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"kind":{"type":"string","enum":["personal","team"]},"role":{"type":"string","enum":["owner","admin","member"]},"personal":{"type":"boolean","description":"True only for the holder's own personal workspace."},"owner_label":{"type":["string","null"],"description":"The owner's username, else their email."}}},"WorkspaceMemberCap":{"type":"object","required":["cap_micro_idr","spent_micro_idr","window_end"],"properties":{"cap_micro_idr":{"type":"integer","format":"int64","description":"The PAYG limit, in micro-Rupiah."},"spent_micro_idr":{"type":"integer","format":"int64","description":"Drawn from the workspace saldo in the current window."},"window_end":{"type":"integer","format":"int64","description":"Unix seconds when the window rolls."}}},"WorkspaceMember":{"type":"object","required":["user_id","email","role","joined_at","last_seen_at","seat","cap","payg"],"properties":{"user_id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","admin","member"]},"joined_at":{"type":"integer","format":"int64","description":"Unix seconds."},"last_seen_at":{"type":["integer","null"],"format":"int64","description":"Unix seconds."},"seat":{"type":["object","null"],"required":["plan_id","active"],"properties":{"plan_id":{"type":"string"},"active":{"type":"boolean","description":"False once the workspace's plan has lapsed."}}},"cap":{"oneOf":[{"$ref":"#\/components\/schemas\/WorkspaceMemberCap"},{"type":"null"}]},"payg":{"type":["object","null"],"required":["spent_micro_idr","window_end"],"properties":{"spent_micro_idr":{"type":"integer","format":"int64","description":"Drawn from the workspace saldo in the 30 day window, capped or not."},"window_end":{"type":"integer","format":"int64","description":"Unix seconds when the window rolls."}}}}},"WorkspaceInvite":{"type":"object","required":["id","email","role","expires_at","created_at"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["admin","member"]},"expires_at":{"type":"integer","format":"int64","description":"Unix seconds."},"created_at":{"type":"integer","format":"int64","description":"Unix seconds."}}},"WorkspaceSeat":{"type":"object","required":["id","plan_id","plan_name","user_id","email","next_plan_id","remove_at_renewal","weekly_reset_available","windows"],"properties":{"id":{"type":"string"},"plan_id":{"type":"string"},"plan_name":{"type":["string","null"]},"user_id":{"type":["string","null"],"description":"The member who holds the seat, null when it is unassigned."},"email":{"type":["string","null"],"description":"The holder's address, null when the seat is unassigned. A key held by a Member reads only its holder's own seat."},"next_plan_id":{"type":["string","null"],"description":"The plan the seat moves to at renewal, null when none is pending."},"remove_at_renewal":{"type":"boolean"},"weekly_reset_available":{"type":"boolean","description":"Whether the seat's one weekly quota reset is still unused. The holder uses it from their own dashboard."},"windows":{"type":"object","description":"Spend and budget of the seat's three windows in micro-Rupiah, and the seconds until each rolls.","properties":{"cost_5h":{"type":"integer","format":"int64"},"limit_5h":{"type":"integer","format":"int64"},"cost_week":{"type":"integer","format":"int64"},"limit_week":{"type":"integer","format":"int64"},"cost_month":{"type":"integer","format":"int64"},"limit_month":{"type":"integer","format":"int64"},"resets_5h_secs":{"type":"integer","format":"int64"},"resets_week_secs":{"type":"integer","format":"int64"},"resets_month_secs":{"type":"integer","format":"int64"}}}}}},"headers":{"KenariModelForwarded":{"description":"Present only when the id you sent is not the id that served the call, as `<sent>-><served>`: a retired model whose successor served it (`model-a->model-b`), or another spelling of a listed model id, which is served as that id (`deepseek-v4.1-flash->deepseek-v4-1-flash`). Another spelling means different upper or lower case, `.` for `-`, or one vendor prefix such as `deepseek\/`. It counts only when it matches exactly one listed id, and `:free` or a level suffix is never added or dropped. A key limited to certain models is judged on the listed id. The call is billed as the served model, and the response `model` names it. Absent on every other response. API clients read it directly. Browser scripts cannot, because it is not exposed through CORS.","schema":{"type":"string","example":"model-a->model-b"}},"KenariPlanRemaining":{"description":"Remaining fraction of each plan window that has a budget, for example `week=0.19, month=0.70`. Window names are `five_hour`, `week` and `month`, in that order; a window with no budget is left out. Values run from 0 to 1 at 2 decimals and describe the plan before this request's cost. Present only on a 2xx reply, only for an account owner's key (not a shared key, not a key with a model scope, spend cap or token cap), and only while the plan is active. A non-stream reply that outlives the keepalive grace period is rebuilt without it.","schema":{"type":"string","example":"week=0.19, month=0.70"}},"KenariBalanceMicroIdr":{"description":"Available wallet balance in micro-Rupiah (balance minus other in-flight holds, never below 0). Present only when the request is billed from saldo, on a 2xx reply, for an account owner's key. Absent when a plan, coupon or allocation paid for the request. A non-stream reply that outlives the keepalive grace period is rebuilt without it.","schema":{"type":"integer","format":"int64","example":12400000}},"IdempotentReplayed":{"description":"`true` when the response is the stored answer of an earlier request with the same `Idempotency-Key`, and nothing ran again. Absent on a first answer. A stored refusal is replayed the same way.","schema":{"type":"string","enum":["true"]}}},"responses":{"OpenAIError":{"description":"Error in the OpenAI envelope. Status codes: 400 bad_request \/ model_not_found \/ model_unavailable (a model that served customers recently and is switched off) \/ upstream 4xx, 402 insufficient_balance \/ payg_limit_reached \/ key_spend_cap_reached \/ member_spend_cap_reached, 403 subscribers_only \/ subscription_required (a ChatGPT or Grok login, asked for by a byok\/ id or by a named route, on an account without an active kenari plan, see \/plan) \/ byok_credential_unavailable (no credential behind a byok\/ id can be used right now, or the credential of a named route with no other step left is switched off, signed out or unusable, and the message names it by its label when it has one), 429 rate_limit_exceeded \/ plan_limit_reached \/ upstream 429, 500 internal_error, 503 upstream_error \/ all_providers_failed (may carry Retry-After: the soonest rate-limit refill among the lanes tried, 1-60 s, or a short hint when every channel is cooling) \/ no_answer_after_search (a model that kept calling kenari:web_search and the like past the search limit and gave no answer; no tokens billed). An upstream rejection uses type invalid_request_error with code context_length_exceeded \/ model_not_found \/ content_policy_violation \/ invalid_request_error \/ upstream_rejected \/ upstream_declined and preserves the upstream 4xx status (400, 403, 404, 413, 422, 429; any other 4xx becomes 400).","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OpenAIErrorBody"}}}},"AnthropicError":{"description":"Error in the Anthropic envelope. Same HTTP statuses as the OpenAI path; `error.type` is invalid_request_error (400), not_found_error (400), payment_required (402), permission_error (403), rate_limit_error (429), or api_error (500\/503).","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AnthropicErrorBody"}}}},"Unauthorized":{"description":"Missing or invalid `kn-` key. The body is a short plain-text string, not a JSON envelope, because the request is rejected before the API layer.","content":{"text\/plain":{"schema":{"type":"string"}}}},"PayloadTooLarge":{"description":"The request is too large. A request body over 32 MiB (33,554,432 bytes) is refused by kenari itself: the body is the plain-text string `request body too large` with `Content-Type: text\/plain; charset=utf-8`, not JSON and with no `error` object. A body sent without a `Content-Length` is refused the same way as soon as it passes 32 MiB. On a route that sends the request on to a model's provider, a 413 from that provider is relayed as the JSON error in the OpenAI envelope instead, with `type` `invalid_request_error` and a `code` that names the reason, such as `upstream_rejected`, so read the `Content-Type` header before you parse a 413.","content":{"text\/plain":{"schema":{"type":"string","example":"request body too large"}},"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OpenAIErrorBody"}}}},"PayloadTooLargeAnthropic":{"description":"The request is too large. A request body over 32 MiB (33,554,432 bytes) is refused by kenari itself: the body is the plain-text string `request body too large` with `Content-Type: text\/plain; charset=utf-8`, not JSON and with no `error` object. A body sent without a `Content-Length` is refused the same way as soon as it passes 32 MiB. On a route that sends the request on to a model's provider, a 413 from that provider is relayed as the JSON error in the Anthropic envelope instead, with `error.type` `invalid_request_error`, so read the `Content-Type` header before you parse a 413.","content":{"text\/plain":{"schema":{"type":"string","example":"request body too large"}},"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AnthropicErrorBody"}}}},"ManagedAgentsError":{"description":"Error on the Anthropic passthrough, in Anthropic's JSON envelope `{\"type\": \"error\", \"error\": {\"type\", \"message\"}}`. It comes from kenari or from Anthropic. kenari's own errors add `error.code`, the value to branch on. 400 `invalid_path`. 401 `auth_failed` (the `kn-` key is missing, wrong, expired or revoked). 403 `shared_key_not_allowed`, `restricted_key_not_allowed` or `subscription_required`. 404 `credential_not_found`. 409 `anthropic_credential_required`, `credential_required` or `credit_limit_reached`. 413 `request_too_large` (a request body over 100 MiB, 104,857,600 bytes). 429 `rate_limit_exceeded` (the account's per-minute limit), `passthrough_busy` (too many passthrough requests in progress) or `auth_failed` (one client IP sent too many requests on a shared key). 500 `auth_failed` (the key lookup failed). 503 `upstream_error` (Anthropic could not be reached, or answered 502 or 504). An error Anthropic answers with is relayed with Anthropic's own status and body, except a 502 or 504 (the 503 above), so it has no `error.code` and may carry Anthropic's top-level `request_id`. One body is not JSON. A 500 for a failure inside kenari, such as a database or credential error, is the plain-text string `internal error` with `Content-Type: text\/plain; charset=utf-8`, so read the `Content-Type` header before you parse a 500. The 401 is JSON here, unlike the plain-text 401 of the other `\/v1` routes.","headers":{"Retry-After":{"description":"Seconds to wait. Sent with every 429. A 429 relayed from Anthropic keeps Anthropic's value when it sent one.","schema":{"type":"integer"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ManagedAgentsErrorBody"}},"text\/plain":{"schema":{"type":"string","example":"internal error"}}}},"WorkspaceError":{"description":"Error in the `\/v1` envelope, `error.code` tells which. 400 `invalid_request` (also a path id that is not 1 to 128 characters of `A-Z`, `a-z`, `0-9`, `_` and `-`), `idempotency_key_required`, `pay_from_personal_not_supported`. 401 `invalid_api_key` (the key stopped being valid during the request). 402 `insufficient_balance` with `gap_micro_idr`. 403 `workspace_access_required` (the key's level is too low or it is a CLI key), `shared_key_not_allowed`, `restricted_key_not_allowed` (a model scope, spend cap or token cap), `teams_not_enabled`, `not_a_team_workspace`, `permission_denied` (the holder's role or the workspace rules refuse it), `fund_cap_reached`. 404 `not_found`. 409 `conflict`, `idempotency_key_reused`, `request_in_progress`. 429 `rate_limited` (60 changes per minute per key, 10 on the paid routes, with `Retry-After`), `pending_limit_reached`, `daily_limit_reached`. 500 `internal_error`.","headers":{"Retry-After":{"description":"Seconds to wait. Sent with every 429: the limiter's own wait when it has one, otherwise 60.","schema":{"type":"integer"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WorkspaceError"}}}}}}}