# Antirion Admin API — OpenAPI 3.1 contract. # Resource `spec` bodies reference schema/antirion-config.schema.json `$defs`. openapi: 3.1.0 info: title: Antirion Admin API version: v1 summary: Configuration, runtime state, reports and operations of an Antirion gateway. description: | The Admin API of Antirion, served only on the admin listener under `/admin/v1` and published by the gateway at `GET /admin/v1/openapi.json`. Within `v1`, changes are additive only. **Representation.** Collection resources are `{name, spec, metadata}`; singleton settings are `{spec, metadata}`. `spec` is exactly the config fragment of that entry (schema: `schema/antirion-config.schema.json`); `metadata` is read-only and ignored on write. Secrets are never returned: a field set by reference shows the reference, a literal shows `"[REDACTED]"`, and writing `"[REDACTED]"` keeps the stored value. **Verbs.** `GET` list/read; `POST` to a collection creates (201, `Location`; 409 `already_exists`); `PUT` creates (201) or replaces (200); `PATCH` (`application/merge-patch+json`, RFC 7396 on the representation, body `{"spec": {…}}`); `DELETE` (204). Custom actions are `POST //:` or `POST /:`. Every mutation accepts `?wait=` and answers with `x-antirion-config-generation` and `x-antirion-config-propagated`. Unknown query parameters are 400 `invalid_parameter`. **Lists** return `{items, next_cursor}`, take `limit` and `cursor`, are ordered by name (collections) or newest first (time series). **Concurrency.** Resource reads return a strong `ETag`; `PUT`/`PATCH`/`DELETE` honour `If-Match`; `PUT` honours `If-None-Match: *`; apply takes `If-Match: ""` (412 `precondition_failed` on mismatch). `POST` honours `Idempotency-Key`. **Authentication.** `Authorization: Bearer ` (service-account tokens `ak-antirion-…` and the bootstrap credential) or the `antirion_session` cookie from `POST /auth/session` or OIDC login. Cookie-authenticated `POST`/`PUT`/`PATCH`/`DELETE` must send an `Origin` equal to `auth.admin.public_origin` (403 otherwise). Virtual keys are always 401. Public operations: OIDC login and callback, and `POST /auth/session`. **Errors** use the admin envelope `{"error": {code, message, request_id, details[]}}`: | Status | `error.code` | When | |---|---|---| | 400 | `malformed_document` | Body is not parseable YAML/JSON, duplicate keys, custom tags | | 400 | `validation_failed` | Well-formed but invalid; `details[]` lists every problem | | 400 | `invalid_parameter` | Unknown or invalid query parameter, invalid cursor | | 401 | `unauthenticated` | Missing/invalid admin credential; any virtual key | | 403 | `forbidden` | Authenticated operator lacks the permission | | 404 | `not_found` | Unknown resource, collection or path; resource outside the operator's scope | | 405 | `method_not_allowed` | E.g. writing a static setting; `Allow` header set | | 409 | `already_exists` | POST create of an existing name | | 409 | `resource_in_use` | DELETE of a resource that others reference; `details[]` lists referrers | | 409 | `managed_by_apply` | Write to an apply-managed resource while `admin.config.lock_applied` is true | | 412 | `precondition_failed` | `If-Match` / `If-None-Match` mismatch | | 413 | `payload_too_large` | Body above `admin.api.max_document` | | 415 | `unsupported_media_type` | Content type not JSON/YAML/merge-patch | | 422 | `idempotency_key_reused` | Same `Idempotency-Key`, different body | | 429 | `rate_limited` | Admin rate limit, `Retry-After` set | | 500 | `internal` | Bug | | 503 | `store_unavailable` | The store cannot be written, `Retry-After` set | **Extensions.** `x-antirion-permission` names the permission an operation needs, in the scope of the resource it touches; `authenticated` means any authenticated principal, `public` no credential, and `role:gateway_admin` the role itself. contact: name: Elias Biondo url: https://github.com/eliasbiondo/antirion license: name: Apache License 2.0 identifier: Apache-2.0 jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema servers: - url: '{scheme}://{admin_listener}/admin/v1' variables: scheme: default: http enum: - http - https admin_listener: default: 127.0.0.1:8081 description: The admin listener (`server`). security: - adminToken: [] - operatorSession: [] tags: - name: Config document description: Export, validate, diff, apply and roll back the config document. - name: Settings description: Singleton settings of the config document (`/settings/`). - name: Providers and deployments description: Providers, deployments, provider types and capabilities. - name: Models and routes description: Models, routes and routing state. - name: Tenancy description: Organizations, teams, projects and users. - name: Keys description: Virtual keys. - name: Access control description: Role bindings, roles and admin tokens. - name: Sessions description: Operator sessions and SSO. - name: Guardrails description: Guardrail definitions and the test action. - name: Extensions description: Extensions and their runtime counters. - name: MCP and A2A description: MCP servers and gateways, A2A agents. - name: Health description: Deployment health and provider status. - name: Limits, budgets and spend description: Limit and budget state, prices, ledger and spend reports. - name: Cache description: Cache invalidation and status. - name: Observability description: Request logs, analytics and alert deliveries. - name: Alerts description: Alert instances, rules and channels, webhook tests and delivery status. - name: Audit description: The append-only audit log. - name: Governance description: Change requests, the playground, ingress pause and jobs. - name: Cluster description: Detailed health, nodes, convergence and drain. - name: Discovery description: Status and this document. - name: Test mode description: Deterministic test controls, only with `--test-mode`. paths: /a2a/agents: get: operationId: listA2aAgents summary: List A2A agents tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: A2A agents, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/A2aAgentList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read post: operationId: createA2aAgent summary: Create a A2A agent tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/A2aAgentCreate' responses: '201': description: A2A agent created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/A2aAgentResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /a2a/agents/{name}: get: operationId: getA2aAgent summary: Read a A2A agent tags: - MCP and A2A parameters: - $ref: '#/components/parameters/A2aAgentName' responses: '200': description: The A2A agent. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/A2aAgentResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read put: operationId: replaceA2aAgent summary: Create or replace a A2A agent tags: - MCP and A2A parameters: - $ref: '#/components/parameters/A2aAgentName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/A2aAgentReplace' responses: '200': description: A2A agent replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/A2aAgentResource' '201': description: A2A agent created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/A2aAgentResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write patch: operationId: patchA2aAgent summary: Merge-patch a A2A agent tags: - MCP and A2A parameters: - $ref: '#/components/parameters/A2aAgentName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: A2A agent patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/A2aAgentResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write delete: operationId: deleteA2aAgent summary: Delete a A2A agent tags: - MCP and A2A parameters: - $ref: '#/components/parameters/A2aAgentName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: A2A agent deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /alerts: get: operationId: listAlerts summary: List alert instances tags: - Alerts parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - name: status in: query required: false description: Instance status. schema: type: array items: enum: - firing - acknowledged - resolved explode: true - name: severity in: query required: false description: Severity. schema: type: array items: enum: - critical - warning - info explode: true - name: category in: query required: false description: Category. schema: type: array items: type: string explode: true - name: rule in: query required: false description: Rule name. schema: type: array items: type: string explode: true - name: q in: query required: false description: Search. schema: type: string - name: scope in: query required: false description: Instances whose scope has every given `:` (for example `model:gpt-5`), repeatable. schema: type: array items: type: string pattern: ^[a-z_]+:.+$ explode: true responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AlertList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read /alerts/channels: get: operationId: listAlertChannels summary: List Alert channels tags: - Alerts parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Alert channels, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AlertChannelList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read post: operationId: createAlertChannel summary: Create a alert channel tags: - Alerts parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AlertChannelCreate' responses: '201': description: alert channel created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertChannelResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/channels/{channel}: get: operationId: getAlertChannel summary: Read a alert channel tags: - Alerts parameters: - $ref: '#/components/parameters/ChannelName' responses: '200': description: The alert channel. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/AlertChannelResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read put: operationId: replaceAlertChannel summary: Create or replace a alert channel tags: - Alerts parameters: - $ref: '#/components/parameters/ChannelName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AlertChannelReplace' responses: '200': description: alert channel replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertChannelResource' '201': description: alert channel created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertChannelResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write patch: operationId: patchAlertChannel summary: Merge-patch a alert channel tags: - Alerts parameters: - $ref: '#/components/parameters/ChannelName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: alert channel patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertChannelResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write delete: operationId: deleteAlertChannel summary: Delete a alert channel tags: - Alerts parameters: - $ref: '#/components/parameters/ChannelName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: alert channel deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/channels/{channel}:test: post: operationId: testAlertChannel summary: Send a test notification tags: - Alerts parameters: - $ref: '#/components/parameters/ChannelName' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/deliveries: get: operationId: listAlertDeliveries summary: Alert delivery attempts (last 7 days) tags: - Observability parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/Alert_webhook' - $ref: '#/components/parameters/Alert_event_type' - $ref: '#/components/parameters/Alert_result' responses: '200': description: Attempts. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AlertDeliveryList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /alerts/deliveries/{event_id}:redeliver: post: operationId: redeliverAlert summary: Re-send an alert event tags: - Observability parameters: - $ref: '#/components/parameters/EventId' responses: '202': description: Re-delivery queued. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: type: object properties: event_id: type: string required: - event_id '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /alerts/rules: get: operationId: listAlertRules summary: List Alert rules tags: - Alerts parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Alert rules, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AlertRuleList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read post: operationId: createAlertRule summary: Create a alert rule tags: - Alerts parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AlertRuleCreate' responses: '201': description: alert rule created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertRuleResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/rules/{rule}: get: operationId: getAlertRule summary: Read a alert rule tags: - Alerts parameters: - $ref: '#/components/parameters/AlertRuleName' responses: '200': description: The alert rule. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/AlertRuleResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read put: operationId: replaceAlertRule summary: Create or replace a alert rule tags: - Alerts parameters: - $ref: '#/components/parameters/AlertRuleName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AlertRuleReplace' responses: '200': description: alert rule replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertRuleResource' '201': description: alert rule created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertRuleResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write patch: operationId: patchAlertRule summary: Merge-patch a alert rule tags: - Alerts parameters: - $ref: '#/components/parameters/AlertRuleName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: alert rule patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AlertRuleResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write delete: operationId: deleteAlertRule summary: Delete a alert rule tags: - Alerts parameters: - $ref: '#/components/parameters/AlertRuleName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: alert rule deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/webhooks/{webhook}:rotate_secret: post: operationId: rotateWebhookSecret summary: Generate a webhook signing secret tags: - Alerts parameters: - $ref: '#/components/parameters/WebhookName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SecretRotate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/SecretRotated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/webhooks/{webhook}:test: post: operationId: testWebhook summary: Send a test event to a webhook tags: - Alerts parameters: - $ref: '#/components/parameters/WebhookName' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/{alert_id}: get: operationId: getAlert summary: Read an alert instance tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read /alerts/{alert_id}:acknowledge: post: operationId: acknowledgeAlert summary: Acknowledge an alert tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/{alert_id}:escalate: post: operationId: escalateAlert summary: Page the escalation channels tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/{alert_id}:note: post: operationId: noteAlert summary: Add a note to an alert tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AlertNote' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/{alert_id}:resolve: post: operationId: resolveAlert summary: Resolve an alert tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/{alert_id}:snooze: post: operationId: snoozeAlert summary: Snooze an alert tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AlertSnooze' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /alerts/{alert_id}:unsnooze: post: operationId: unsnoozeAlert summary: End a snooze tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Alert' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: alerts:write /analytics/latency_histogram: get: operationId: getLatencyHistogram summary: Latency histogram tags: - Observability parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Log_request_id' - $ref: '#/components/parameters/Log_organization' - $ref: '#/components/parameters/Log_team' - $ref: '#/components/parameters/Log_project' - $ref: '#/components/parameters/Log_key' - $ref: '#/components/parameters/Log_model' - $ref: '#/components/parameters/Log_provider' - $ref: '#/components/parameters/Log_deployment' - $ref: '#/components/parameters/Log_status_code' - $ref: '#/components/parameters/Log_code' - $ref: '#/components/parameters/Log_response_path' - $ref: '#/components/parameters/Log_end_user' - $ref: '#/components/parameters/Log_session_id' - $ref: '#/components/parameters/Log_tag' - name: status_class in: query required: false description: Status class. schema: type: array items: enum: - 1xx - 2xx - 3xx - 4xx - 5xx explode: true - name: latency_ms_min in: query required: false description: Minimum latency. schema: type: number - name: latency_ms_max in: query required: false description: Maximum latency. schema: type: number - name: cost_usd_min in: query required: false description: Minimum cost. schema: $ref: '#/components/schemas/Money' - name: cost_usd_max in: query required: false description: Maximum cost. schema: $ref: '#/components/schemas/Money' - name: cache in: query required: false description: Cache outcome. schema: type: array items: enum: - hit - miss - semantic_hit - bypass explode: true - name: stream in: query required: false description: Streamed. schema: type: boolean - name: guardrail in: query required: false description: Guardrail name. schema: type: array items: type: string explode: true - name: guardrail_verdict in: query required: false description: Guardrail verdict. schema: type: array items: type: string explode: true - name: guardrail_category in: query required: false description: Guardrail category. schema: type: array items: type: string explode: true - name: flagged in: query required: false description: Any non-pass guardrail verdict. schema: type: boolean - name: requested_model in: query required: false description: Name as sent (aliases). schema: type: array items: type: string explode: true - name: user in: query required: false description: Key owner. schema: type: array items: type: string explode: true - name: environment in: query required: false description: Environment tag value. schema: type: array items: type: string explode: true - name: q in: query required: false description: Substring search. schema: type: string - name: measure in: query required: false description: Measure. schema: enum: - latency_ms - ttft_ms - name: buckets in: query required: false description: Bucket count. schema: type: integer minimum: 5 maximum: 50 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LatencyHistogram' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /analytics/usage: get: operationId: getUsageAnalytics summary: Aggregated usage tags: - Observability parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Interval' - $ref: '#/components/parameters/AnalyticsGroupBy' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/Log_request_id' - $ref: '#/components/parameters/Log_organization' - $ref: '#/components/parameters/Log_team' - $ref: '#/components/parameters/Log_project' - $ref: '#/components/parameters/Log_key' - $ref: '#/components/parameters/Log_model' - $ref: '#/components/parameters/Log_provider' - $ref: '#/components/parameters/Log_deployment' - $ref: '#/components/parameters/Log_status_code' - $ref: '#/components/parameters/Log_code' - $ref: '#/components/parameters/Log_response_path' - $ref: '#/components/parameters/Log_end_user' - $ref: '#/components/parameters/Log_session_id' - $ref: '#/components/parameters/Log_tag' - name: status_class in: query required: false description: Status class. schema: type: array items: enum: - 1xx - 2xx - 3xx - 4xx - 5xx explode: true - name: latency_ms_min in: query required: false description: Minimum latency. schema: type: number - name: latency_ms_max in: query required: false description: Maximum latency. schema: type: number - name: cost_usd_min in: query required: false description: Minimum cost. schema: $ref: '#/components/schemas/Money' - name: cost_usd_max in: query required: false description: Maximum cost. schema: $ref: '#/components/schemas/Money' - name: cache in: query required: false description: Cache outcome. schema: type: array items: enum: - hit - miss - semantic_hit - bypass explode: true - name: stream in: query required: false description: Streamed. schema: type: boolean - name: guardrail in: query required: false description: Guardrail name. schema: type: array items: type: string explode: true - name: guardrail_verdict in: query required: false description: Guardrail verdict. schema: type: array items: type: string explode: true - name: guardrail_category in: query required: false description: Guardrail category. schema: type: array items: type: string explode: true - name: flagged in: query required: false description: Any non-pass guardrail verdict. schema: type: boolean - name: requested_model in: query required: false description: Name as sent (aliases). schema: type: array items: type: string explode: true - name: user in: query required: false description: Key owner. schema: type: array items: type: string explode: true - name: environment in: query required: false description: Environment tag value. schema: type: array items: type: string explode: true - name: q in: query required: false description: Substring search. schema: type: string - name: tz in: query required: false description: IANA zone for day alignment. schema: type: string - name: top in: query required: false description: Keep the n largest groups. schema: type: integer minimum: 1 maximum: 100 responses: '200': description: Buckets; totals equal the sum of the matching records. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/UsageAnalytics' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /anomalies: get: operationId: listAnomalies summary: List key anomaly flags description: Newest first; only flags whose key the caller may read. tags: - Keys parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: key in: query required: false description: Key name. schema: type: string - name: user in: query required: false description: Key owner. schema: type: string - name: state in: query required: false description: Flag state. schema: enum: - open - dismissed - name: kind in: query required: false description: Flag kind. schema: type: array items: enum: - spike - network - user_agent - country - exposed explode: true responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AnomalyList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: keys:read /anomalies/{anomaly_id}: get: operationId: getAnomaly summary: Read an anomaly flag tags: - Keys parameters: - $ref: '#/components/parameters/AnomalyId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Anomaly' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: keys:read /anomalies/{anomaly_id}:dismiss: post: operationId: dismissAnomaly summary: Dismiss an anomaly flag tags: - Keys parameters: - $ref: '#/components/parameters/AnomalyId' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Anomaly' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:update /audit: get: operationId: listAudit summary: List audit entries tags: - Audit description: 'The audit log is append-only: PUT, PATCH and DELETE on `/audit…` are 405.' parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Audit_actor' - $ref: '#/components/parameters/Audit_resource' - $ref: '#/components/parameters/Audit_action' - $ref: '#/components/parameters/Audit_outcome' - $ref: '#/components/parameters/Audit_kind' responses: '200': description: Entries newest first, tenancy-scoped; visible within 5 s. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AuditList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: audit:read /audit/{id}: get: operationId: getAuditEntry summary: One audit entry tags: - Audit description: 'The audit log is append-only: PUT, PATCH and DELETE on `/audit…` are 405.' parameters: - $ref: '#/components/parameters/AuditId' responses: '200': description: The entry. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AuditEntry' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: audit:read /auth/device: post: operationId: startDeviceAuthorization summary: Start a sign-in from the command line description: RFC 8628 device authorization, while `auth.admin.device_authorization.enabled`; 404 otherwise. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeviceAuthorizationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/DeviceAuthorizationRequest' responses: '200': description: OK. content: application/json: schema: $ref: '#/components/schemas/DeviceAuthorization' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' security: [] x-antirion-permission: public /auth/device/token: post: operationId: pollDeviceToken summary: Poll for the admin token of a device sign-in description: RFC 8628 §3.4. The token, once a person approved the sign-in, is answered exactly once. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeviceTokenRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/DeviceTokenRequest' responses: '200': description: The admin token. content: application/json: schema: $ref: '#/components/schemas/DeviceToken' '400': description: The RFC 6749 §5.2 answer while the sign-in is undecided (`authorization_pending`, `slow_down`) or over (`access_denied`, `expired_token`), and for an unknown code (`invalid_grant`), a missing one (`invalid_request`) or another grant type (`unsupported_grant_type`). content: application/json: schema: $ref: '#/components/schemas/DeviceTokenError' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' security: [] x-antirion-permission: public /auth/device:approve: post: operationId: approveDeviceAuthorization summary: Approve a sign-in from the command line description: By the signed-in person the token is issued to; audited as `auth.device.approve`. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeviceUserCode' responses: '200': description: OK. content: application/json: schema: $ref: '#/components/schemas/DeviceAuthorizationState' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/device:check: post: operationId: checkDeviceAuthorization summary: Read a sign-in from the command line description: What the console shows before a person approves or denies it. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeviceUserCode' responses: '200': description: OK. content: application/json: schema: $ref: '#/components/schemas/DeviceAuthorizationState' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/device:deny: post: operationId: denyDeviceAuthorization summary: Deny a sign-in from the command line description: Audited as `auth.device.deny`. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeviceUserCode' responses: '200': description: OK. content: application/json: schema: $ref: '#/components/schemas/DeviceAuthorizationState' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/invitations:accept: post: operationId: acceptInvitation summary: Accept an invitation tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvitationAccept' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LocalLoginStep' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/invitations:check: post: operationId: checkInvitation summary: Check an invitation link without using it description: Answers 200 with the token's state whatever it is; the invitation's email, organization and expiry only while it is valid. Answers other than `valid` count against the caller's sign-in throttle. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TokenCheckRequest' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvitationCheck' '400': $ref: '#/components/responses/BadRequest' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/local/login: post: operationId: localLogin summary: Local sign-in, password step tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocalLogin' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LocalLoginStep' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/local/mfa: post: operationId: localMfa summary: Local sign-in, second-factor step tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MfaVerify' responses: '200': description: Session started. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Set-Cookie: $ref: '#/components/headers/SetCookie' content: application/json: schema: $ref: '#/components/schemas/Me' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/local/password_reset: post: operationId: requestPasswordReset summary: Request a password reset email tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PasswordResetRequest' responses: '202': description: Always the same answer. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/local/password_reset:confirm: post: operationId: confirmPasswordReset summary: Set a new password from a reset link tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PasswordResetConfirm' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LocalLoginStep' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/local/password_reset:check: post: operationId: checkPasswordReset summary: Check a password-reset link without using it description: Answers 200 with the token's state whatever it is, and its expiry while it is valid; never an account, an email or a user. 404 while resets are not offered, as the two reset endpoints. Answers other than `valid` count against the caller's sign-in throttle. tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TokenCheckRequest' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PasswordResetCheck' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/login_options: get: operationId: getLoginOptions summary: Public sign-in options tags: - Sessions parameters: - name: organization in: query required: false description: Organization the sign-in is for. schema: type: string responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LoginOptions' '400': $ref: '#/components/responses/BadRequest' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/logout: post: operationId: logout summary: End the current session tags: - Sessions responses: '204': description: Session deleted server-side; the cookie is cleared. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Set-Cookie: $ref: '#/components/headers/SetCookie' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /auth/me: get: operationId: getMe summary: The calling principal tags: - Sessions responses: '200': description: Principal, bindings and effective permissions. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Me' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated patch: operationId: updateMe summary: Update the caller's profile tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MeUpdate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Me' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/mfa: get: operationId: listMfaFactors summary: List the caller's second factors tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/MfaFactorList' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /auth/me/mfa/totp: post: operationId: enrollTotp summary: Start enrolling a TOTP factor tags: - Sessions description: 'Without a credential, the `challenge` of a local sign-in step that answered `next: enroll_mfa` authenticates the call; confirming the factor then starts the session.' security: - adminToken: [] - operatorSession: [] - {} requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/MfaEnrollStart' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/MfaEnrollment' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/mfa/totp:confirm: post: operationId: confirmTotp summary: Confirm a TOTP factor tags: - Sessions description: 'Without a credential, the `challenge` of a local sign-in step that answered `next: enroll_mfa` authenticates the call; confirming the factor then starts the session.' security: - adminToken: [] - operatorSession: [] - {} requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MfaConfirm' responses: '200': description: Confirmed; recovery codes on the first factor. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RecoveryCodes' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/mfa/webauthn: post: operationId: enrollWebauthn summary: Start enrolling a WebAuthn factor tags: - Sessions description: 'Without a credential, the `challenge` of a local sign-in step that answered `next: enroll_mfa` authenticates the call; confirming the factor then starts the session.' security: - adminToken: [] - operatorSession: [] - {} requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/MfaEnrollStart' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/MfaEnrollment' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/mfa/webauthn:confirm: post: operationId: confirmWebauthn summary: Confirm a WebAuthn factor tags: - Sessions description: 'Without a credential, the `challenge` of a local sign-in step that answered `next: enroll_mfa` authenticates the call; confirming the factor then starts the session.' security: - adminToken: [] - operatorSession: [] - {} requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MfaConfirm' responses: '200': description: Confirmed; recovery codes on the first factor. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RecoveryCodes' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/mfa/{factor_id}: delete: operationId: deleteMfaFactor summary: Remove a second factor tags: - Sessions parameters: - $ref: '#/components/parameters/FactorId' responses: '204': description: Removed. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/mfa:regenerate_recovery_codes: post: operationId: regenerateRecoveryCodes summary: Replace the recovery codes tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MfaConfirm' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RecoveryCodes' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/preferences: get: operationId: getPreferences summary: Read the caller's preferences tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Preferences' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated put: operationId: replacePreferences summary: Replace the caller's preferences tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Preferences' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Preferences' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/tokens: get: operationId: listPersonalTokens summary: List the caller's personal admin tokens tags: - Sessions parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PersonalTokenList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated post: operationId: createPersonalToken summary: Create a personal admin token tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PersonalTokenCreate' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PersonalTokenCreated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/tokens/{kid}: delete: operationId: deletePersonalToken summary: Revoke a personal admin token tags: - Sessions parameters: - $ref: '#/components/parameters/TokenKid' responses: '204': description: Revoked. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/push: get: operationId: getMyPush summary: The gateway's VAPID public key and the caller's browser push subscriptions description: For a human user (403 otherwise); the key is generated on first use. tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PushOverview' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/push:test: post: operationId: testMyPush summary: Send a test notification to each of the caller's browsers now tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PushTestResult' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/push/subscriptions: get: operationId: listMyPushSubscriptions summary: The caller's browser push subscriptions tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PushSubscriptionList' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated post: operationId: createMyPushSubscription summary: Subscribe a browser to the caller's push notifications description: The same endpoint again replaces its subscription; at most 10 per user (409 `limit_reached`). tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PushSubscriptionCreate' responses: '201': description: Subscribed. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PushSubscription' '400': $ref: '#/components/responses/BadRequest' '409': $ref: '#/components/responses/Conflict' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me/push/subscriptions/{subscription_id}: delete: operationId: deleteMyPushSubscription summary: Remove one of the caller's browser push subscriptions tags: - Sessions parameters: - name: subscription_id in: path required: true schema: type: string responses: '204': description: Removed. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '404': $ref: '#/components/responses/NotFound' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/me:change_password: post: operationId: changePassword summary: Change the caller's password tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ChangePassword' responses: '204': description: Changed; other sessions ended. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/oauth/{provider}/callback: get: operationId: oauthCallback summary: GitHub sign-in callback tags: - Sessions parameters: - $ref: '#/components/parameters/OauthProvider' - $ref: '#/components/parameters/OidcCode' - $ref: '#/components/parameters/OidcState' - $ref: '#/components/parameters/SsoProviderError' responses: '302': description: 'Session started; redirect to `return_to`. A failed sign-in also answers 302, to `/login?error=&message=` (codes in `SsoFailureCode`; the message is short and carries no secret); a client that sends `Accept: application/json` without `text/html` gets the JSON error instead.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/oauth/{provider}/login: get: operationId: oauthLogin summary: Start a GitHub sign-in tags: - Sessions parameters: - $ref: '#/components/parameters/OauthProvider' - $ref: '#/components/parameters/ReturnTo' responses: '302': description: 'Redirect to GitHub. A failed sign-in also answers 302, to `/login?error=&message=` (codes in `SsoFailureCode`; the message is short and carries no secret); a client that sends `Accept: application/json` without `text/html` gets the JSON error instead.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/oidc/{provider}/callback: get: operationId: oidcCallback summary: Finish OIDC login tags: - Sessions parameters: - $ref: '#/components/parameters/OidcProvider' - $ref: '#/components/parameters/OidcCode' - $ref: '#/components/parameters/OidcState' - $ref: '#/components/parameters/SsoProviderError' responses: '200': description: The callback of a test sign-in reports what a sign-in would do; no session starts and nobody is provisioned. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SsoTestResult' '302': description: 'Session started; redirect to `return_to`. A failed sign-in also answers 302, to `/login?error=&message=`, or, for a test sign-in, to its `return_to` (else `/settings?section=sign-in`) with the same parameters (codes in `SsoFailureCode`; the message is short and carries no secret); a client that sends `Accept: application/json` without `text/html` gets the JSON error instead.' headers: Location: $ref: '#/components/headers/Location' Set-Cookie: $ref: '#/components/headers/SetCookie' x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/oidc/{provider}/login: get: operationId: oidcLogin summary: Start OIDC login tags: - Sessions description: 'With `test=true` the call needs a credential holding `security:write`: it starts a test sign-in whose callback reports the mapping instead of starting a session.' parameters: - $ref: '#/components/parameters/OidcProvider' - $ref: '#/components/parameters/ReturnTo' - name: test in: query required: false description: A test sign-in. schema: type: boolean - name: trust_device in: query required: false description: Trust this device. Honoured only while trusted devices are enabled and the ID token's `amr` asserts a second factor; ignored with `test`. schema: type: boolean responses: '302': description: 'Redirect to the IdP (authorization code + PKCE S256, single-use `state`, `nonce`). A failed sign-in also answers 302, to `/login?error=&message=`, or, for a test sign-in, to its `return_to` (else `/settings?section=sign-in`) with the same parameters (codes in `SsoFailureCode`; the message is short and carries no secret); a client that sends `Accept: application/json` without `text/html` gets the JSON error instead.' headers: Location: $ref: '#/components/headers/Location' x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: - {} - adminToken: [] - operatorSession: [] x-antirion-permission: public /auth/saml/{provider}: get: operationId: getSamlProvider summary: A SAML provider's status description: What an identity provider needs of the service provider (entity id, ACS URL, metadata URL, NameID format) and what the gateway knows of the identity provider. tags: - Sessions parameters: - $ref: '#/components/parameters/SamlProvider' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SamlProviderStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:read /auth/saml/{provider}:resync: post: operationId: resyncSamlProvider summary: Fetch a SAML identity provider's metadata now description: Fetches `idp.metadata_url` and stores the copy every node uses; audited as `auth.saml.resync`. A provider configured inline has nothing to fetch (409). tags: - Sessions parameters: - $ref: '#/components/parameters/SamlProvider' responses: '200': description: The metadata was fetched; the provider's status. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SamlProviderStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '502': description: '`idp_unavailable`: the identity provider''s metadata could not be fetched and the stored copy is kept.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /auth/saml/{provider}/acs: post: operationId: samlAcs summary: SAML assertion consumer service description: The identity provider's HTTP-POST response. A valid signed assertion for a request this gateway started (or an unsolicited one, with `allow_idp_initiated`) starts a session and redirects to `return_to` (or the relay state); the answer to a test sign-in reports the mapping instead. tags: - Sessions parameters: - $ref: '#/components/parameters/SamlProvider' requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object properties: SAMLResponse: type: string description: The base64 of the `samlp:Response`. RelayState: type: string description: Used as `return_to` by an unsolicited response; ignored otherwise. required: - SAMLResponse responses: '200': description: The answer to a test sign-in; no session starts and nobody is provisioned. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SsoTestResult' '302': description: 'Session started; redirect to `return_to`. A failed sign-in also answers 302, to `/login?error=&message=`, or, for a test sign-in, to its `return_to` (else `/settings?section=sign-in`) with the same parameters (codes in `SsoFailureCode`; the message is short and carries no secret); a client that sends `Accept: application/json` without `text/html` gets the JSON error instead.' headers: Location: $ref: '#/components/headers/Location' Set-Cookie: $ref: '#/components/headers/SetCookie' x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '502': description: '`idp_unavailable`: the identity provider''s metadata could not be fetched and no stored copy exists.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' security: [] x-antirion-permission: public /auth/saml/{provider}/login: get: operationId: samlLogin summary: Start a SAML sign-in description: 'Redirects (302) to the identity provider''s single sign-on service with an HTTP-Redirect `AuthnRequest` whose id is single use for 10 minutes. With `test=true` the call needs a credential holding `security:write`: the assertion consumer service then reports the mapping instead of starting a session.' tags: - Sessions parameters: - $ref: '#/components/parameters/SamlProvider' - $ref: '#/components/parameters/ReturnTo' - name: test in: query required: false description: A test sign-in. schema: type: boolean responses: '302': description: 'Redirect to the identity provider. A failed sign-in also answers 302, to `/login?error=&message=`, or, for a test sign-in, to its `return_to` (else `/settings?section=sign-in`) with the same parameters (codes in `SsoFailureCode`; the message is short and carries no secret); a client that sends `Accept: application/json` without `text/html` gets the JSON error instead.' headers: Location: $ref: '#/components/headers/Location' x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '502': description: '`idp_unavailable`: the identity provider''s metadata could not be fetched and no stored copy exists.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' security: - {} - adminToken: [] - operatorSession: [] x-antirion-permission: public /auth/saml/{provider}/metadata: get: operationId: getSamlSpMetadata summary: The service provider's SAML metadata description: The `EntityDescriptor` an identity provider imports; public. tags: - Sessions parameters: - $ref: '#/components/parameters/SamlProvider' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/samlmetadata+xml: schema: type: string '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/scim/status: get: operationId: getScimStatus summary: SCIM status tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ScimStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: users:read /auth/session: post: operationId: createSession summary: Start a session with an admin token tags: - Sessions requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SessionCreate' responses: '200': description: Session started. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Set-Cookie: $ref: '#/components/headers/SetCookie' content: application/json: schema: $ref: '#/components/schemas/Me' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' security: [] x-antirion-permission: public /auth/sessions: get: operationId: listSessions summary: List the caller's sessions tags: - Sessions parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SessionList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /auth/sessions/{session_id}: delete: operationId: deleteSession summary: End one of the caller's sessions tags: - Sessions parameters: - $ref: '#/components/parameters/SessionId' responses: '204': description: Ended. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /auth/sessions:revoke_others: post: operationId: revokeOtherSessions summary: End every other session of the caller tags: - Sessions responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RevokedCount' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /budgets/overage_requests: get: operationId: listOverageRequests summary: Overage requests tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: state in: query required: false description: Request state. schema: enum: - open - approved - denied - expired responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/OverageRequestList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /budgets/overage_requests/{request_id}:approve: post: operationId: approveOverageRequest summary: Approve an overage request tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/OverageRequestId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OverageApproval' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/OverageRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /budgets/overage_requests/{request_id}:deny: post: operationId: denyOverageRequest summary: Deny an overage request tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/OverageRequestId' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/OverageRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /cache/entries: get: operationId: listCacheEntries summary: List cache entries tags: - Cache parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: model in: query required: false description: Filter by model. schema: type: string - name: route in: query required: false description: Filter by route. schema: type: string - name: deployment in: query required: false description: Filter by deployment. schema: type: string - name: organization in: query required: false description: Filter by organization. schema: type: string - name: team in: query required: false description: Filter by team. schema: type: string - name: project in: query required: false description: Filter by project. schema: type: string - name: key in: query required: false description: Filter by key. schema: type: string - name: mode in: query required: false description: Cache mode. schema: enum: - exact - semantic - name: q in: query required: false description: Cache key prefix. schema: type: string - name: sort in: query required: false description: Sort key. schema: enum: - last_hit_at - created_at - expires_at - hits - size - name: order in: query required: false description: Order. schema: enum: - asc - desc - name: include_total in: query required: false description: Add totals. schema: type: boolean responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/CacheEntryList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cache:admin /cache/entries/{key}: get: operationId: getCacheEntry summary: Read a cache entry tags: - Cache parameters: - $ref: '#/components/parameters/CacheKey' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-fields-redacted: $ref: '#/components/headers/XFieldsRedacted' content: application/json: schema: $ref: '#/components/schemas/CacheEntry' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cache:admin delete: operationId: deleteCacheEntry summary: Delete one cache entry tags: - Cache parameters: - $ref: '#/components/parameters/CacheKey' responses: '204': description: Removed (with its semantic twin, if any). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin /cache/entries/{key}:report_false_positive: post: operationId: reportCacheFalsePositive summary: Report a wrong semantic hit tags: - Cache parameters: - $ref: '#/components/parameters/CacheKey' responses: '204': description: Recorded and the entry dropped. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin /cache/invalidation_rules: get: operationId: listInvalidationRules summary: List Invalidation rules tags: - Cache parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Invalidation rules, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cache:admin post: operationId: createInvalidationRule summary: Create a invalidation rule tags: - Cache parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleCreate' responses: '201': description: invalidation rule created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin /cache/invalidation_rules/{rule}: get: operationId: getInvalidationRule summary: Read a invalidation rule tags: - Cache parameters: - $ref: '#/components/parameters/InvalidationRuleName' responses: '200': description: The invalidation rule. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cache:admin put: operationId: replaceInvalidationRule summary: Create or replace a invalidation rule tags: - Cache parameters: - $ref: '#/components/parameters/InvalidationRuleName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleReplace' responses: '200': description: invalidation rule replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleResource' '201': description: invalidation rule created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin patch: operationId: patchInvalidationRule summary: Merge-patch a invalidation rule tags: - Cache parameters: - $ref: '#/components/parameters/InvalidationRuleName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: invalidation rule patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin delete: operationId: deleteInvalidationRule summary: Delete a invalidation rule tags: - Cache parameters: - $ref: '#/components/parameters/InvalidationRuleName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: invalidation rule deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin /cache/invalidation_rules/{rule}:run: post: operationId: runInvalidationRule summary: Run an invalidation rule now tags: - Cache parameters: - $ref: '#/components/parameters/InvalidationRuleName' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvalidationRun' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin /cache:invalidate: post: operationId: invalidateCache summary: Invalidate the cache of a level tags: - Cache description: Singleton custom action. Unknown `level` → 400 `validation_failed`; unknown resource → 404. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CacheInvalidate' responses: '200': description: The level's new epoch; old entries miss on every node within 2 s. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/CacheInvalidated' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: cache:admin /catalog: get: operationId: getCatalog summary: The effective model catalog and where it comes from description: The bundled catalog's versions, the runtime `catalog` block's mode, version and last change, and every effective entry by pattern. tags: - Models responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/CatalogStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read /change_requests: get: operationId: listChangeRequests summary: List change requests tags: - Governance parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: state in: query required: false description: State. schema: type: array items: enum: - open - approved - rejected - applied - cancelled - expired - conflicted explode: true - name: author in: query required: false description: Author. schema: type: string responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequestList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read post: operationId: createChangeRequest summary: Open a change request description: The author needs read access to every resource the changes touch. tags: - Governance requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ChangeRequestCreate' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /change_requests/{change_request_id}: get: operationId: getChangeRequest summary: Read a change request tags: - Governance parameters: - $ref: '#/components/parameters/ChangeRequestId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /change_requests/{change_request_id}:apply: post: operationId: applyChangeRequest summary: Apply an approved change request tags: - Governance parameters: - $ref: '#/components/parameters/ChangeRequestId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /change_requests/{change_request_id}:approve: post: operationId: approveChangeRequest summary: Approve a change request description: Needs every write permission the changes need; the author cannot approve or reject. tags: - Governance parameters: - $ref: '#/components/parameters/ChangeRequestId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /change_requests/{change_request_id}:cancel: post: operationId: cancelChangeRequest summary: Cancel a change request tags: - Governance parameters: - $ref: '#/components/parameters/ChangeRequestId' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /change_requests/{change_request_id}:reject: post: operationId: rejectChangeRequest summary: Reject a change request description: Needs every write permission the changes need; the author cannot approve or reject. tags: - Governance parameters: - $ref: '#/components/parameters/ChangeRequestId' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /cluster: get: operationId: getCluster summary: Cluster view tags: - Cluster responses: '200': description: Nodes with applied versions and degraded state, and background job leases. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Cluster' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cluster:read /cluster/converged: get: operationId: waitConverged summary: Wait for config convergence tags: - Cluster parameters: - $ref: '#/components/parameters/ConfigVersion' - $ref: '#/components/parameters/ConvergeTimeout' responses: '200': description: '`{converged: true}`, or `{converged: false, lagging: [...]}` at the timeout.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: type: object properties: converged: type: boolean lagging: type: array items: type: string required: - converged '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cluster:read /config: get: operationId: exportConfig summary: Export the dynamic configuration tags: - Config document description: Content negotiation by `Accept` (`application/yaml` or `application/json`). Static keys are not included. Literal secrets are exported as `"[REDACTED]"`. responses: '200': description: 'The document; `ETag: ""`.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ConfigDocument' application/yaml: schema: $ref: '#/components/schemas/ConfigDocument' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /config/generations: get: operationId: listGenerations summary: List recent generations tags: - Config document parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: The last `admin.config.history_limit` generations, newest first. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/GenerationList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /config/generations/{generation}: get: operationId: getGeneration summary: A generation's document tags: - Config document parameters: - $ref: '#/components/parameters/Generation' responses: '200': description: The document of that generation (secrets redacted). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ConfigDocument' application/yaml: schema: $ref: '#/components/schemas/ConfigDocument' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /config/schema: get: operationId: getConfigSchema summary: The config document's JSON Schema tags: - Config document responses: '200': description: JSON Schema draft 2020-12 (the same as `antirion schema`). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/schema+json: schema: type: object application/json: schema: type: object '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /config:apply: post: operationId: applyConfig summary: Apply a document as one generation tags: - Config document parameters: - $ref: '#/components/parameters/ApplySource' - $ref: '#/components/parameters/Prune' - $ref: '#/components/parameters/DryRun' - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ConfigDocument' application/yaml: schema: $ref: '#/components/schemas/ConfigDocument' responses: '200': description: Committed (or, with `dry_run=true`, the would-be result with the current generation). An apply that changes nothing creates no generation. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ApplyResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /config:diff: post: operationId: diffConfig summary: Show what an apply would change tags: - Config document parameters: - $ref: '#/components/parameters/ApplySource' - $ref: '#/components/parameters/Prune' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ConfigDocument' application/yaml: schema: $ref: '#/components/schemas/ConfigDocument' responses: '200': description: The change set apply would commit. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DiffResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /config:rollback: post: operationId: rollbackConfig summary: Roll back to an earlier generation tags: - Config document parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RollbackRequest' responses: '200': description: A new generation equal to the requested one, subject to current validation. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ApplyResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /config:validate: post: operationId: validateConfig summary: Validate a document without applying it tags: - Config document requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ConfigDocument' application/yaml: schema: $ref: '#/components/schemas/ConfigDocument' responses: '200': description: 'Always 200; malformed input gives `valid: false` with a `malformed_document` entry.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ValidateResult' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /deployments: get: operationId: listDeployments summary: List deployments tags: - Providers and deployments parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Deployments, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: deployments:read post: operationId: createDeployment summary: Create a deployment tags: - Providers and deployments parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeploymentCreate' responses: '201': description: Deployment created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/DeploymentResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: deployments:write /deployments/{name}: get: operationId: getDeployment summary: Read a deployment tags: - Providers and deployments parameters: - $ref: '#/components/parameters/DeploymentName' responses: '200': description: The deployment. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/DeploymentResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: deployments:read put: operationId: replaceDeployment summary: Create or replace a deployment tags: - Providers and deployments parameters: - $ref: '#/components/parameters/DeploymentName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DeploymentReplace' responses: '200': description: Deployment replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/DeploymentResource' '201': description: Deployment created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/DeploymentResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: deployments:write patch: operationId: patchDeployment summary: Merge-patch a deployment tags: - Providers and deployments parameters: - $ref: '#/components/parameters/DeploymentName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Deployment patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/DeploymentResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: deployments:write delete: operationId: deleteDeployment summary: Delete a deployment tags: - Providers and deployments parameters: - $ref: '#/components/parameters/DeploymentName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Deployment deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: deployments:write /deployments/{name}/capabilities: get: operationId: getDeploymentCapabilities summary: Resolved capabilities of a deployment tags: - Providers and deployments parameters: - $ref: '#/components/parameters/DeploymentName' responses: '200': description: Every flag with value and source. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentCapabilities' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: deployments:read /guardrails: get: operationId: listGuardrails summary: List guardrails tags: - Guardrails description: The collection is `guardrails.definitions`; the other `guardrails` fields are `/settings/guardrails`. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Guardrails, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/GuardrailList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read post: operationId: createGuardrail summary: Create a guardrail tags: - Guardrails parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GuardrailCreate' responses: '201': description: Guardrail created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GuardrailResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /guardrails/events: get: operationId: listSafetyEvents summary: List safety events tags: - Guardrails parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - name: category in: query required: false description: Filter by category. schema: type: array items: type: string explode: true - name: severity in: query required: false description: Filter by severity. schema: type: array items: type: string explode: true - name: action in: query required: false description: Filter by action. schema: type: array items: type: string explode: true - name: guardrail in: query required: false description: Filter by guardrail. schema: type: array items: type: string explode: true - name: review_state in: query required: false description: Filter by review_state. schema: type: array items: type: string explode: true - name: fingerprint in: query required: false description: Filter by fingerprint. schema: type: array items: type: string explode: true - name: organization in: query required: false description: Filter by organization. schema: type: array items: type: string explode: true - name: team in: query required: false description: Filter by team. schema: type: array items: type: string explode: true - name: project in: query required: false description: Filter by project. schema: type: array items: type: string explode: true - name: key in: query required: false description: Filter by key. schema: type: array items: type: string explode: true - name: model in: query required: false description: Filter by model. schema: type: array items: type: string explode: true - name: provider in: query required: false description: Filter by provider. schema: type: array items: type: string explode: true - name: q in: query required: false description: Event or request id. schema: type: string - name: include_total in: query required: false description: Add `total`. schema: type: boolean responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-fields-redacted: $ref: '#/components/headers/XFieldsRedacted' content: application/json: schema: $ref: '#/components/schemas/SafetyEventList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /guardrails/events/{event_id}: get: operationId: getSafetyEvent summary: Read a safety event tags: - Guardrails parameters: - $ref: '#/components/parameters/SafetyEventId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-fields-redacted: $ref: '#/components/headers/XFieldsRedacted' content: application/json: schema: $ref: '#/components/schemas/SafetyEvent' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /guardrails/events/{event_id}:review: post: operationId: reviewSafetyEvent summary: Label a safety event tags: - Guardrails parameters: - $ref: '#/components/parameters/SafetyEventId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SafetyReview' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SafetyEvent' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: safety:review /guardrails/{name}: get: operationId: getGuardrail summary: Read a guardrail tags: - Guardrails parameters: - $ref: '#/components/parameters/GuardrailName' responses: '200': description: The guardrail. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/GuardrailResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replaceGuardrail summary: Create or replace a guardrail tags: - Guardrails parameters: - $ref: '#/components/parameters/GuardrailName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GuardrailReplace' responses: '200': description: Guardrail replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GuardrailResource' '201': description: Guardrail created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GuardrailResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchGuardrail summary: Merge-patch a guardrail tags: - Guardrails parameters: - $ref: '#/components/parameters/GuardrailName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Guardrail patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GuardrailResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write delete: operationId: deleteGuardrail summary: Delete a guardrail tags: - Guardrails parameters: - $ref: '#/components/parameters/GuardrailName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Guardrail deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /guardrails:test: post: operationId: testUnsavedGuardrail summary: Try a guardrail before saving it description: >- Compiles `spec` as a save of it under `name` would (the same validation errors, at the same `guardrails.definitions.` paths) and runs it on `input` as `POST /guardrails/{name}:test` does, including its own external calls; it stores nothing. `name` is the name the rule would be saved under, the existing rule's when it is being edited; without it a name no saved rule has is used. `enabled: false` is ignored. `input.stage` defaults to `input`. Secrets may be literal values or references; a `[REDACTED]` value stands for the saved rule's secret and is accepted only when the spec keeps the saved rule's type and destinations (`url`, `base_url`, `endpoint`, `region`, `provider`). When change control governs guardrails, only literal secrets are accepted. Every call is audited with the rule's name, type and verdict. tags: - Guardrails requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GuardrailTestUnsavedRequest' responses: '200': description: The verdict. No model call (other than the guardrail's own) and no ledger line. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/GuardrailTestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:write /guardrails/{name}:test: post: operationId: testGuardrail summary: Run a guardrail on sample input tags: - Guardrails parameters: - $ref: '#/components/parameters/GuardrailName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GuardrailTestRequest' responses: '200': description: The verdict. No model call (other than the guardrail's own) and no ledger line. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/GuardrailTestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /health: get: operationId: getHealth summary: Detailed health of this node tags: - Cluster responses: '200': description: Health. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Health' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: health:read /invitations: get: operationId: listInvitations summary: List invitations not yet accepted or cancelled, expired ones included tags: - Tenancy parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvitationList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: users:read post: operationId: createInvitation summary: Invite a user tags: - Tenancy requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvitationCreate' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvitationCreated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:create /invitations/{invitation_id}: delete: operationId: cancelInvitation summary: Cancel an invitation tags: - Tenancy parameters: - $ref: '#/components/parameters/InvitationId' responses: '204': description: Cancelled; the invited user is deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:delete /invitations/{invitation_id}:resend: post: operationId: resendInvitation summary: Resend an invitation tags: - Tenancy parameters: - $ref: '#/components/parameters/InvitationId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvitationCreated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:create /jobs/{job_id}: get: operationId: getJob summary: Read a job description: Only the job's creator may read it. tags: - Governance parameters: - $ref: '#/components/parameters/JobId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Job' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /jobs/{job_id}/download: get: operationId: downloadJob summary: Download a finished job's file description: 'Only the job''s creator may download it, until the job''s `expires_at`; afterwards, and before the job succeeded, it is 404. Each download is a `kind: read` audit entry.' tags: - Governance parameters: - $ref: '#/components/parameters/JobId' responses: '200': description: The file. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Content-Disposition: description: '`attachment` with the file name (`-export-.zip`).' schema: type: string content: application/zip: schema: type: string contentMediaType: application/zip '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: authenticated /keys: get: operationId: listKeys summary: List virtual keys description: Filters, facets and counts; each item's read-only facts and tags: - Keys parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: last_used_before in: query required: false description: Keys last used before this time, or never used. schema: $ref: '#/components/schemas/Timestamp' - name: owner in: query required: false description: Keys owned by one of these users. schema: type: array items: type: string explode: true - name: team in: query required: false description: Keys of a project of one of these teams. schema: type: array items: type: string explode: true - name: project in: query required: false description: Keys of one of these projects. schema: type: array items: type: string explode: true - name: type in: query required: false description: Keys of one of these types (`metadata.type`); a key without an owner is `service`. schema: type: array items: enum: - user - service - ephemeral explode: true - name: status in: query required: false description: Keys in one of these states (`metadata.status`). schema: type: array items: enum: - active - disabled - rotating - expiring - expired explode: true - name: q in: query required: false description: Case-insensitive substring of the name, description, owner, kid or hint. schema: type: string responses: '200': description: Virtual keys, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/KeyList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: keys:read post: operationId: createKey summary: Create a virtual key tags: - Keys parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/KeyCreateRequest' responses: '201': description: Key created. The plaintext `secret` appears in this response only. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/KeyCreated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:create /keys/{name}: get: operationId: getKey summary: Read a virtual key tags: - Keys parameters: - $ref: '#/components/parameters/KeyName' responses: '200': description: The virtual key. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/KeyResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: keys:read put: operationId: replaceKey summary: Create or replace a virtual key tags: - Keys parameters: - $ref: '#/components/parameters/KeyName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/KeyReplace' responses: '200': description: Virtual key replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/KeyResource' '201': description: Key created. The plaintext `secret` appears in this response only. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/KeyCreated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:create (create) / keys:update (replace) patch: operationId: patchKey summary: Merge-patch a virtual key tags: - Keys parameters: - $ref: '#/components/parameters/KeyName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Virtual key patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/KeyResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:update delete: operationId: deleteKey summary: Delete a virtual key tags: - Keys parameters: - $ref: '#/components/parameters/KeyName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Virtual key deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:delete /keys/{name}:rotate: post: operationId: rotateKey summary: Rotate a virtual key's secret tags: - Keys description: 'Custom action. There is no `:revoke`: revocation is `DELETE` (permanent) or `enabled: false` (reversible).' parameters: - $ref: '#/components/parameters/KeyName' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/KeyRotate' responses: '200': description: New secret (once). The key keeps its name, project, access, permissions, policies and spend. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/KeyRotated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:rotate /logs: get: operationId: listLogs summary: List request-log records tags: - Observability description: Also filterable by `metadata.=` for any metadata key (a family of query parameters that OpenAPI cannot name individually). Records outside the caller's scope are neither listed nor fetchable. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Log_request_id' - $ref: '#/components/parameters/Log_organization' - $ref: '#/components/parameters/Log_team' - $ref: '#/components/parameters/Log_project' - $ref: '#/components/parameters/Log_key' - $ref: '#/components/parameters/Log_model' - $ref: '#/components/parameters/Log_provider' - $ref: '#/components/parameters/Log_deployment' - $ref: '#/components/parameters/Log_status_code' - $ref: '#/components/parameters/Log_code' - $ref: '#/components/parameters/Log_response_path' - $ref: '#/components/parameters/Log_end_user' - $ref: '#/components/parameters/Log_session_id' - $ref: '#/components/parameters/Log_tag' - name: status_class in: query required: false description: Status class. schema: type: array items: enum: - 1xx - 2xx - 3xx - 4xx - 5xx explode: true - name: latency_ms_min in: query required: false description: Minimum latency. schema: type: number - name: latency_ms_max in: query required: false description: Maximum latency. schema: type: number - name: cost_usd_min in: query required: false description: Minimum cost. schema: $ref: '#/components/schemas/Money' - name: cost_usd_max in: query required: false description: Maximum cost. schema: $ref: '#/components/schemas/Money' - name: cache in: query required: false description: Cache outcome. schema: type: array items: enum: - hit - miss - semantic_hit - bypass explode: true - name: stream in: query required: false description: Streamed. schema: type: boolean - name: guardrail in: query required: false description: Guardrail name. schema: type: array items: type: string explode: true - name: guardrail_verdict in: query required: false description: Guardrail verdict. schema: type: array items: type: string explode: true - name: guardrail_category in: query required: false description: Guardrail category. schema: type: array items: type: string explode: true - name: flagged in: query required: false description: Any non-pass guardrail verdict. schema: type: boolean - name: requested_model in: query required: false description: Name as sent (aliases). schema: type: array items: type: string explode: true - name: user in: query required: false description: Key owner. schema: type: array items: type: string explode: true - name: environment in: query required: false description: Environment tag value. schema: type: array items: type: string explode: true - name: q in: query required: false description: Substring search. schema: type: string - name: sort in: query required: false description: Sort key. schema: enum: - started_at - latency_ms - ttft_ms - cost_usd - input_tokens - output_tokens - status_code - name: order in: query required: false description: Sort order. schema: enum: - asc - desc - name: include_total in: query required: false description: Add `total` and `total_exact`. schema: type: boolean responses: '200': description: Records newest first (by `started_at`, ties by `id`). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-fields-redacted: $ref: '#/components/headers/XFieldsRedacted' content: application/json: schema: $ref: '#/components/schemas/LogList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read delete: operationId: deleteEndUserLogs summary: Erase an end user's records tags: - Observability parameters: - $ref: '#/components/parameters/EndUserRequired' responses: '200': description: Records deleted in the caller's scope. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeletedCount' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: logs:delete /logs/schema: get: operationId: getLogSchema summary: JSON Schema of the log record tags: - Observability responses: '200': description: Schema version 1. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/schema+json: schema: type: object application/json: schema: type: object '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /logs/views: get: operationId: listLogViews summary: List saved log views tags: - Observability parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LogViewList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read post: operationId: createLogView summary: Save a log view tags: - Observability requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LogViewCreate' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LogView' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: logs:read /logs/views/{view_id}: get: operationId: getLogView summary: Read a saved log view tags: - Observability parameters: - $ref: '#/components/parameters/ViewId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LogView' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read patch: operationId: updateLogView summary: Change a saved log view description: Only the view's creator or an org_admin of its organization may change it; a body whose only member is `starred` sets the caller's own mark and is allowed to every principal that can see the view. The members sent replace theirs and the others are kept. tags: - Observability parameters: - $ref: '#/components/parameters/ViewId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LogViewUpdate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LogView' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: logs:read delete: operationId: deleteLogView summary: Delete a saved log view tags: - Observability parameters: - $ref: '#/components/parameters/ViewId' responses: '204': description: Deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: logs:read /logs/{id}: get: operationId: getLog summary: One request-log record tags: - Observability parameters: - $ref: '#/components/parameters/LogId' responses: '200': description: The record. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-fields-redacted: $ref: '#/components/headers/XFieldsRedacted' content: application/json: schema: $ref: '#/components/schemas/LogRecord' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /logs/{id}:replay: post: operationId: replayLog summary: Replay a logged request through the playground description: Also needs `logs:read_content`. tags: - Observability parameters: - $ref: '#/components/parameters/LogId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ReplayRequest' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PlaygroundResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: playground:send /logs:export: get: operationId: exportLogs summary: Export request logs tags: - Observability parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Log_request_id' - $ref: '#/components/parameters/Log_organization' - $ref: '#/components/parameters/Log_team' - $ref: '#/components/parameters/Log_project' - $ref: '#/components/parameters/Log_key' - $ref: '#/components/parameters/Log_model' - $ref: '#/components/parameters/Log_provider' - $ref: '#/components/parameters/Log_deployment' - $ref: '#/components/parameters/Log_status_code' - $ref: '#/components/parameters/Log_code' - $ref: '#/components/parameters/Log_response_path' - $ref: '#/components/parameters/Log_end_user' - $ref: '#/components/parameters/Log_session_id' - $ref: '#/components/parameters/Log_tag' - name: status_class in: query required: false description: Status class. schema: type: array items: enum: - 1xx - 2xx - 3xx - 4xx - 5xx explode: true - name: latency_ms_min in: query required: false description: Minimum latency. schema: type: number - name: latency_ms_max in: query required: false description: Maximum latency. schema: type: number - name: cost_usd_min in: query required: false description: Minimum cost. schema: $ref: '#/components/schemas/Money' - name: cost_usd_max in: query required: false description: Maximum cost. schema: $ref: '#/components/schemas/Money' - name: cache in: query required: false description: Cache outcome. schema: type: array items: enum: - hit - miss - semantic_hit - bypass explode: true - name: stream in: query required: false description: Streamed. schema: type: boolean - name: guardrail in: query required: false description: Guardrail name. schema: type: array items: type: string explode: true - name: guardrail_verdict in: query required: false description: Guardrail verdict. schema: type: array items: type: string explode: true - name: guardrail_category in: query required: false description: Guardrail category. schema: type: array items: type: string explode: true - name: flagged in: query required: false description: Any non-pass guardrail verdict. schema: type: boolean - name: requested_model in: query required: false description: Name as sent (aliases). schema: type: array items: type: string explode: true - name: user in: query required: false description: Key owner. schema: type: array items: type: string explode: true - name: environment in: query required: false description: Environment tag value. schema: type: array items: type: string explode: true - name: q in: query required: false description: Substring search. schema: type: string - name: sort in: query required: false description: Sort key. schema: enum: - started_at - latency_ms - ttft_ms - cost_usd - input_tokens - output_tokens - status_code - name: order in: query required: false description: Sort order. schema: enum: - asc - desc - name: format in: query required: true description: Export format. schema: enum: - csv - ndjson responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: text/csv: schema: $ref: '#/components/schemas/LogExport' application/x-ndjson: schema: $ref: '#/components/schemas/LogExport' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /logs:tail: get: operationId: tailLogs summary: Live tail of request-log records tags: - Observability description: Also filterable by `metadata.=` for any metadata key (a family of query parameters that OpenAPI cannot name individually). Records outside the caller's scope are neither listed nor fetchable. parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Log_request_id' - $ref: '#/components/parameters/Log_organization' - $ref: '#/components/parameters/Log_team' - $ref: '#/components/parameters/Log_project' - $ref: '#/components/parameters/Log_key' - $ref: '#/components/parameters/Log_model' - $ref: '#/components/parameters/Log_provider' - $ref: '#/components/parameters/Log_deployment' - $ref: '#/components/parameters/Log_status_code' - $ref: '#/components/parameters/Log_code' - $ref: '#/components/parameters/Log_response_path' - $ref: '#/components/parameters/Log_end_user' - $ref: '#/components/parameters/Log_session_id' - $ref: '#/components/parameters/Log_tag' responses: '200': description: '`event: log` per record as written; `: keepalive` every 15 s. At most 10 tails per node (the 11th gets 429).' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: text/event-stream: schema: type: string '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /mcp: servers: - url: '{scheme}://{admin_listener}/admin' description: The admin listener, outside `/admin/v1`. variables: scheme: default: https enum: - http - https admin_listener: default: localhost:8081 post: operationId: adminMcp summary: The read-only admin MCP server description: One JSON-RPC message of the MCP Streamable HTTP transport, stateless, while `mcp.admin_server.enabled`; 404 otherwise. Its tools call the Admin API's reads with the caller's principal. tags: - MCP requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/JsonRpcMessage' responses: '200': description: The JSON-RPC answer. content: application/json: schema: $ref: '#/components/schemas/JsonRpcMessage' '202': description: A notification, accepted. '400': description: A message that is not one JSON-RPC request or notification. content: application/json: schema: $ref: '#/components/schemas/JsonRpcMessage' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '405': $ref: '#/components/responses/MethodNotAllowed' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated (each tool needs logs:read or analytics:read) /mcp/gateways: get: operationId: listMcpGateways summary: List MCP gateways tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: MCP gateways, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/McpGatewayList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read post: operationId: createMcpGateway summary: Create a MCP gateway tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/McpGatewayCreate' responses: '201': description: MCP gateway created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpGatewayResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /mcp/gateways/{name}: get: operationId: getMcpGateway summary: Read a MCP gateway tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpGatewayName' responses: '200': description: The MCP gateway. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/McpGatewayResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read put: operationId: replaceMcpGateway summary: Create or replace a MCP gateway tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpGatewayName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/McpGatewayReplace' responses: '200': description: MCP gateway replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpGatewayResource' '201': description: MCP gateway created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpGatewayResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write patch: operationId: patchMcpGateway summary: Merge-patch a MCP gateway tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpGatewayName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: MCP gateway patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpGatewayResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write delete: operationId: deleteMcpGateway summary: Delete a MCP gateway tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpGatewayName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: MCP gateway deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /mcp/servers: get: operationId: listMcpServers summary: List MCP servers tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: MCP servers, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/McpServerList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read post: operationId: createMcpServer summary: Create a MCP server tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/McpServerCreate' responses: '201': description: MCP server created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpServerResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /mcp/servers/{name}: get: operationId: getMcpServer summary: Read a MCP server tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpServerName' responses: '200': description: The MCP server. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/McpServerResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read put: operationId: replaceMcpServer summary: Create or replace a MCP server tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpServerName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/McpServerReplace' responses: '200': description: MCP server replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpServerResource' '201': description: MCP server created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpServerResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write patch: operationId: patchMcpServer summary: Merge-patch a MCP server tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpServerName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: MCP server patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpServerResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write delete: operationId: deleteMcpServer summary: Delete a MCP server tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpServerName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: MCP server deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /mcp/servers/{name}/status: get: operationId: getMcpServerStatus summary: Discovery status of an MCP server tags: - MCP and A2A parameters: - $ref: '#/components/parameters/McpServerName' responses: '200': description: Status. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/McpServerStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read /mcp/servers/{name}:approve_tools: post: operationId: approveMcpServerTools summary: Approve an MCP server's current tool definitions tags: - MCP and A2A description: Records the SHA-256 (JCS) fingerprint of every tool the server lists now, so that with `pin_tool_definitions` a tool whose definition later changes is hidden until approved again. Custom action. parameters: - $ref: '#/components/parameters/McpServerName' responses: '200': description: The fingerprints now approved. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/McpToolApproval' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /me: get: operationId: getMeAlias summary: The calling principal (alias of /auth/me) tags: - Sessions description: lists `/me`.3 defines `GET /auth/me`. Both are served with the same body. responses: '200': description: Same body as `GET /auth/me`. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Me' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /models: get: operationId: listModels summary: List models description: Filters and counts; each item's `metadata.lifecycle` tags: - Models and routes parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: tier in: query required: false description: Models of one of these tiers. schema: type: array items: type: string explode: true - name: label in: query required: false description: Models carrying every one of these labels. schema: type: array items: type: string explode: true - name: state in: query required: false description: Models in one of these lifecycle states, `retired` once `eol_at` has passed. schema: type: array items: enum: - preview - ga - restricted - deprecated - retired explode: true responses: '200': description: Models, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ModelList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read post: operationId: createModel summary: Create a model tags: - Models and routes parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelCreate' responses: '201': description: Model created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ModelResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /models/{name}: get: operationId: getModel summary: Read a model tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' responses: '200': description: The model. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ModelResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read put: operationId: replaceModel summary: Create or replace a model tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelReplace' responses: '200': description: Model replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ModelResource' '201': description: Model created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ModelResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write patch: operationId: patchModel summary: Merge-patch a model tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Model patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ModelResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write delete: operationId: deleteModel summary: Delete a model tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Model deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /models/{name}/access_requests: get: operationId: listAccessRequests summary: Access requests for a Model tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AccessRequestList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read post: operationId: createAccessRequest summary: Request access to a Model description: Needs `keys:update` or `teams:update` in the requested scope. tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AccessRequestCreate' responses: '201': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AccessRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: keys:update /models/{name}/access_requests/{request_id}:approve: post: operationId: approveAccessRequest summary: Approve an access request tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' - $ref: '#/components/parameters/AccessRequestId' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AccessRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /models/{name}/access_requests/{request_id}:deny: post: operationId: denyAccessRequest summary: Deny an access request tags: - Models and routes parameters: - $ref: '#/components/parameters/ModelName' - $ref: '#/components/parameters/AccessRequestId' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AccessRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /notifications:send: post: operationId: sendNotification summary: Email an operator notification tags: - Observability requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/NotificationSend' responses: '202': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/NotificationSent' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: notifications:send /openapi.json: get: operationId: getOpenApi summary: This OpenAPI document tags: - Discovery responses: '200': description: OpenAPI 3.1 describing every admin endpoint. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /organizations: get: operationId: listOrganizations summary: List organizations tags: - Tenancy parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Organizations, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/OrganizationList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: organizations:read post: operationId: createOrganization summary: Create a organization tags: - Tenancy parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OrganizationCreate' responses: '201': description: Organization created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OrganizationResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:create /organizations/{name}: get: operationId: getOrganization summary: Read a organization tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' responses: '200': description: The organization. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/OrganizationResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: organizations:read put: operationId: replaceOrganization summary: Create or replace a organization tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OrganizationReplace' responses: '200': description: Organization replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OrganizationResource' '201': description: Organization created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OrganizationResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:create (create) / organizations:update (replace) patch: operationId: patchOrganization summary: Merge-patch a organization tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Organization patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OrganizationResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:update delete: operationId: deleteOrganization summary: Delete a organization tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/Cascade' responses: '204': description: Organization deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:delete /organizations/{name}:cancel_deletion: post: operationId: cancelOrganizationDeletion summary: Cancel an organization's scheduled deletion tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OrganizationDeletion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:delete /organizations/{name}:export: post: operationId: exportOrganization summary: Export an organization description: Also needs `config:read` and `logs:read`. tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' responses: '202': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Job' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:read /organizations/{name}:schedule_deletion: post: operationId: scheduleOrganizationDeletion summary: Schedule an organization's deletion tags: - Tenancy parameters: - $ref: '#/components/parameters/OrganizationName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ScheduleDeletion' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OrganizationDeletion' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: organizations:delete /playground:send: post: operationId: playgroundSend summary: Send a request through the playground tags: - Governance requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PlaygroundSend' responses: '200': description: OK. A streamed send whose request accepts `text/event-stream` gets the data plane's event stream relayed as it arrives, after a first `playground` event; any other answer is the JSON object. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PlaygroundResult' text/event-stream: schema: type: string description: '`event: playground` with data `{status, headers, log_id, key}`, then the data plane''s events unchanged.' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: playground:send /plugins: get: operationId: listPlugins summary: List extensions tags: - Extensions parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Extensions, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PluginList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: plugins:read post: operationId: createPlugin summary: Create a extension tags: - Extensions parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PluginCreate' responses: '201': description: Extension created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PluginResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: plugins:write /plugins/{name}: get: operationId: getPlugin summary: Read a extension tags: - Extensions parameters: - $ref: '#/components/parameters/PluginName' responses: '200': description: The extension. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/PluginResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: plugins:read put: operationId: replacePlugin summary: Create or replace a extension tags: - Extensions parameters: - $ref: '#/components/parameters/PluginName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PluginReplace' responses: '200': description: Extension replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PluginResource' '201': description: Extension created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PluginResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: plugins:write patch: operationId: patchPlugin summary: Merge-patch a extension tags: - Extensions parameters: - $ref: '#/components/parameters/PluginName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Extension patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PluginResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: plugins:write delete: operationId: deletePlugin summary: Delete a extension tags: - Extensions parameters: - $ref: '#/components/parameters/PluginName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Extension deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: plugins:write /pricing/deployments: get: operationId: listEffectivePrices summary: Every deployment's effective price description: Each item equals the single read; `format=csv` returns every selected deployment unpaginated. tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: provider in: query required: false description: Provider name. schema: type: string - name: model in: query required: false description: Model name. schema: type: string - name: format in: query required: false description: Response format. schema: enum: - json - csv responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/EffectivePriceList' text/csv: schema: type: string '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: pricing:read /pricing/deployments/{name}: get: operationId: getDeploymentPrice summary: Effective price of a deployment tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/DeploymentName' responses: '200': description: Merged price and `price_version`. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/EffectivePrice' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: pricing:read /projects: get: operationId: listProjects summary: List projects tags: - Tenancy parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Projects, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProjectList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: projects:read post: operationId: createProject summary: Create a project tags: - Tenancy parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectCreate' responses: '201': description: Project created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProjectResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: projects:create /projects/{name}: get: operationId: getProject summary: Read a project tags: - Tenancy parameters: - $ref: '#/components/parameters/ProjectName' responses: '200': description: The project. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ProjectResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: projects:read put: operationId: replaceProject summary: Create or replace a project tags: - Tenancy parameters: - $ref: '#/components/parameters/ProjectName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectReplace' responses: '200': description: Project replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProjectResource' '201': description: Project created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProjectResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: projects:create (create) / projects:update (replace) patch: operationId: patchProject summary: Merge-patch a project tags: - Tenancy parameters: - $ref: '#/components/parameters/ProjectName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Project patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProjectResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: projects:update delete: operationId: deleteProject summary: Delete a project tags: - Tenancy parameters: - $ref: '#/components/parameters/ProjectName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/Cascade' responses: '204': description: Project deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: projects:delete /provider-types: get: operationId: listProviderTypes summary: Supported provider types tags: - Providers and deployments parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Types with default base URLs (templated URLs verbatim), dialects and auth methods. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderTypeList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:read /providers: get: operationId: listProviders summary: List providers tags: - Providers and deployments parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Providers, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:read post: operationId: createProvider summary: Create a provider tags: - Providers and deployments parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProviderCreate' responses: '201': description: Provider created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProviderResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: providers:write /providers/{name}: get: operationId: getProvider summary: Read a provider tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' responses: '200': description: The provider. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ProviderResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:read put: operationId: replaceProvider summary: Create or replace a provider tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProviderReplace' responses: '200': description: Provider replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProviderResource' '201': description: Provider created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProviderResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: providers:write patch: operationId: patchProvider summary: Merge-patch a provider tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Provider patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProviderResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: providers:write delete: operationId: deleteProvider summary: Delete a provider tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Provider deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: providers:write /providers/{name}:rotate_credential: post: operationId: rotateProviderCredential summary: Rotate a provider credential with an overlap tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CredentialRotate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ProviderResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: providers:write /providers/{name}:test: post: operationId: testProvider summary: Test a provider credential description: >- Without `deployment`, the credential is proven by listing the provider's models (`method: list_models`, with `models` filled), or, for a type without a listing call, by the cheapest call that proves it (`minimal_call`); neither needs a deployment. With `deployment`, that deployment's own call is made. The outcome is recorded per key on the node that ran the test and shown by `GET /runtime/providers`. tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/ProviderTest' responses: '200': description: >- OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderTestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: providers:write /providers:test: post: operationId: testUnsavedProvider summary: Test a provider before saving it description: >- Compiles `spec` as a create would (the same validation errors), runs the test of `POST /providers/{name}:test` without a deployment and stores nothing. Secrets may be literal values or references. A `[REDACTED]` value stands for the saved provider's secret and is accepted only when the spec keeps the saved provider's type and base URL. When change control governs providers, only literal secrets are accepted. The audit entry records the provider's name, type and outcome, never a secret. tags: - Providers and deployments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProviderCreate' responses: '200': description: >- OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderTestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:write /providers/{name}/models: get: operationId: listProviderModels summary: List a provider's models description: >- The provider's own model list (`source: provider`, `listed_by_provider: true`), filled in with the catalog's name, limits, modalities and price where the catalog knows a model. When the type has no listing call or the listing fails, the catalog's models of the provider's type (`source: catalog`, `listed_by_provider: false`), with `error` set when a listing call failed. A node keeps a provider's list for 5 minutes. tags: - Providers and deployments parameters: - $ref: '#/components/parameters/ProviderName' - name: refresh in: query required: false schema: type: boolean default: false description: >- Fetch the list again instead of the one kept. - name: q in: query required: false schema: type: string description: >- Case-insensitive substring of the model's id or name. - name: id in: query required: false schema: type: string description: >- One model by its exact id, when the provider lists it or the catalog knows it; else no item. responses: '200': description: >- OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderModelList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:read /reports/alerts/{alert_id}/signal: get: operationId: getAlertSignal summary: The rule metric around an instance tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/UsageAnalytics' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read /reports/alerts/{alert_id}/similar: get: operationId: listSimilarAlerts summary: Past instances with the same fingerprint tags: - Alerts parameters: - $ref: '#/components/parameters/AlertId' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AlertList' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read /reports/availability: get: operationId: getAvailability summary: Availability report tags: - Observability parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Interval' - name: group_by in: query required: false description: Grouping. schema: enum: - gateway - provider - deployment - model - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AvailabilityList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /reports/guardrails/summary: get: operationId: getSafetySummary summary: Safety event counts tags: - Guardrails parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - name: category in: query required: false description: Filter by category. schema: type: array items: type: string explode: true - name: severity in: query required: false description: Filter by severity. schema: type: array items: type: string explode: true - name: action in: query required: false description: Filter by action. schema: type: array items: type: string explode: true - name: guardrail in: query required: false description: Filter by guardrail. schema: type: array items: type: string explode: true - name: review_state in: query required: false description: Filter by review_state. schema: type: array items: type: string explode: true - name: fingerprint in: query required: false description: Filter by fingerprint. schema: type: array items: type: string explode: true - name: organization in: query required: false description: Filter by organization. schema: type: array items: type: string explode: true - name: team in: query required: false description: Filter by team. schema: type: array items: type: string explode: true - name: project in: query required: false description: Filter by project. schema: type: array items: type: string explode: true - name: key in: query required: false description: Filter by key. schema: type: array items: type: string explode: true - name: model in: query required: false description: Filter by model. schema: type: array items: type: string explode: true - name: provider in: query required: false description: Filter by provider. schema: type: array items: type: string explode: true - name: q in: query required: false description: Event or request id. schema: type: string - name: group_by in: query required: false description: Up to 2 of category, severity, action, guardrail, entity, review_state. schema: type: array items: enum: - category - severity - action - guardrail - entity - review_state explode: true - $ref: '#/components/parameters/Interval' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/GuardrailSummary' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: logs:read /reports/provider_pressure: get: operationId: getProviderPressure summary: Provider rate-limit pressure over time description: Each provider's peak use of its upstream request and token quotas per bucket, from every node's rate-limit readings, and the number of providers at or above `threshold` in each bucket. tags: - Observability parameters: - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Interval' - name: provider in: query required: false description: Only these providers. schema: type: array items: type: string explode: true responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderPressure' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /reports/spend/ledger: get: operationId: listLedgerLines summary: Ledger lines tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Ledger_organization' - $ref: '#/components/parameters/Ledger_team' - $ref: '#/components/parameters/Ledger_project' - $ref: '#/components/parameters/Ledger_key' - $ref: '#/components/parameters/Ledger_user' - $ref: '#/components/parameters/Ledger_end_user' - $ref: '#/components/parameters/Ledger_model' - $ref: '#/components/parameters/Ledger_deployment' - $ref: '#/components/parameters/Ledger_tag' - $ref: '#/components/parameters/Ledger_status' responses: '200': description: Lines. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LedgerLineList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /reports/spend/requests/{request_id}: get: operationId: getRequestLedgerLines summary: Ledger lines of one request tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/RequestId' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Lines. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LedgerLineList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /reports/spend/summary: get: operationId: getSpendSummary summary: Aggregated spend description: The lines summed are the ones `GET /reports/spend/ledger` lists with the same filters, so a total matches the filtered ledger whatever was loaded of it. tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/GroupBy' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - $ref: '#/components/parameters/Ledger_organization' - $ref: '#/components/parameters/Ledger_team' - $ref: '#/components/parameters/Ledger_project' - $ref: '#/components/parameters/Ledger_key' - $ref: '#/components/parameters/Ledger_user' - $ref: '#/components/parameters/Ledger_end_user' - $ref: '#/components/parameters/Ledger_model' - $ref: '#/components/parameters/Ledger_deployment' - $ref: '#/components/parameters/Ledger_tag' - $ref: '#/components/parameters/Ledger_status' responses: '200': description: One row per group. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SpendSummaryList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /reports/spend:recost: post: operationId: recostSpend summary: Re-cost ledger lines with current prices description: Prices every line admitted in `[from, to)` again with the current prices and appends one `adjustment` line per line whose cost changed, with the difference, under the original's request id and admission time; `budgets:adjust` at the gateway level is required, since prices are gateway-wide. A second call with unchanged prices appends nothing. `from` must be before `to` (400 `validation_failed` at `to`). tags: - Limits, budgets and spend requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RecostRequest' responses: '200': description: Appended `adjustment` lines; originals are never rewritten. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RecostResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /role_bindings: get: operationId: listRoleBindings summary: List role bindings in the caller's scope tags: - Access control parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/RoleBinding_principal_type' - $ref: '#/components/parameters/RoleBinding_principal_id' - $ref: '#/components/parameters/RoleBinding_role' - $ref: '#/components/parameters/RoleBinding_scope' responses: '200': description: Bindings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RoleBindingList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role_bindings:read post: operationId: createRoleBinding summary: Create a role binding tags: - Access control parameters: - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RoleBindingCreate' responses: '201': description: Binding created with a server-assigned id. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' content: application/json: schema: $ref: '#/components/schemas/RoleBinding' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: role_bindings:create /role_bindings/{id}: get: operationId: getRoleBinding summary: Read a role binding tags: - Access control parameters: - $ref: '#/components/parameters/BindingId' responses: '200': description: The binding. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RoleBinding' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role_bindings:read delete: operationId: deleteRoleBinding summary: Delete a role binding tags: - Access control description: A principal cannot delete its own bindings (403). parameters: - $ref: '#/components/parameters/BindingId' responses: '204': description: Deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: role_bindings:delete /roles: get: operationId: listRoles summary: List built-in and custom roles tags: - Access control parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Roles with their permissions. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RoleList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role_bindings:read /routes: get: operationId: listRoutes summary: List routes tags: - Models and routes parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Routes, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RouteList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read post: operationId: createRoute summary: Create a route tags: - Models and routes parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RouteCreate' responses: '201': description: Route created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/RouteResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /routes/{name}: get: operationId: getRoute summary: Read a route tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' responses: '200': description: The route. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/RouteResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read put: operationId: replaceRoute summary: Create or replace a route tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RouteReplace' responses: '200': description: Route replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/RouteResource' '201': description: Route created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/RouteResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write patch: operationId: patchRoute summary: Merge-patch a route tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Route patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/RouteResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write delete: operationId: deleteRoute summary: Delete a route tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: Route deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /routes/{name}/affinity: delete: operationId: deleteRouteAffinity summary: Delete every affinity binding of a route tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' responses: '200': description: Bindings deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeletedCount' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /routes/{name}/state: get: operationId: getRouteState summary: Routing state of a route on the answering replica tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: One entry per tree node. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RouteStateList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read /routes/{name}:simulate: post: operationId: simulateRoute summary: Evaluate a route against logged traffic tags: - Models and routes parameters: - $ref: '#/components/parameters/RouteName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RouteSimulate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RouteSimulation' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read /routing/tiers: get: operationId: listTiers summary: Built-in and custom tiers tags: - Models and routes parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TierList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read /runtime/alerts/channels: get: operationId: listChannelStatus summary: Channel delivery status tags: - Alerts parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeliveryTargetStatusList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read /runtime/alerts/webhooks: get: operationId: listWebhookStatus summary: Webhook delivery status tags: - Alerts parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeliveryTargetStatusList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: alerts:read /runtime/audit/sinks: get: operationId: listAuditSinkStatus summary: Audit sink delivery status tags: - Audit parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AuditSinkStatusList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: audit:read /runtime/audit/sinks/{sink}:test: post: operationId: testAuditSink summary: Send a test audit entry tags: - Audit parameters: - $ref: '#/components/parameters/SinkName' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /runtime/budgets: get: operationId: listBudgetCounters summary: Budget counter state tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/Counter_level' - $ref: '#/components/parameters/Counter_owner' - $ref: '#/components/parameters/Counter_name' - $ref: '#/components/parameters/Partition' - name: state in: query required: false description: Only budgets in this pacing state. schema: enum: - on_pace - at_risk - over - blocked - name: sort in: query required: false description: Largest first by projected spend, spent, or spent over amount; declaration order without it. schema: enum: - projected_spend - spent - ratio responses: '200': description: Counters. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/BudgetCounterList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /runtime/budgets/events: get: operationId: listBudgetEvents summary: Budget events tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/From' - $ref: '#/components/parameters/To' - name: level in: query required: false description: Budget level. schema: type: string - name: owner in: query required: false description: Budget owner (the resource). schema: type: string - name: name in: query required: false description: Budget name. schema: type: string - name: kind in: query required: false description: Event kind. schema: type: array items: type: string explode: true responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/BudgetEventList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /runtime/budgets/{level}/{owner}/{name}: get: operationId: getBudgetCounter summary: One budget counter tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/BudgetLevel' - $ref: '#/components/parameters/BudgetOwner' - $ref: '#/components/parameters/BudgetName' - $ref: '#/components/parameters/Partition' responses: '200': description: Counter state. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/BudgetCounter' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /runtime/budgets/{level}/{owner}/{name}/grants/{grant_id}: delete: operationId: revokeBudgetGrant summary: Revoke an overage grant tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/BudgetLevel' - $ref: '#/components/parameters/BudgetOwner' - $ref: '#/components/parameters/BudgetName' - $ref: '#/components/parameters/GrantId' - $ref: '#/components/parameters/Partition' responses: '204': description: Revoked. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /runtime/budgets/{level}/{owner}/{name}:adjust: post: operationId: adjustBudgetCounter summary: Charge or credit a budget tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/BudgetLevel' - $ref: '#/components/parameters/BudgetOwner' - $ref: '#/components/parameters/BudgetName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BudgetAdjust' responses: '200': description: Counter state after the adjustment. Making `spent` negative → 400 `validation_failed`. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/BudgetCounter' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /runtime/budgets/{level}/{owner}/{name}:grant_overage: post: operationId: grantBudgetOverage summary: Grant a time-boxed overage tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/BudgetLevel' - $ref: '#/components/parameters/BudgetOwner' - $ref: '#/components/parameters/BudgetName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OverageGrant' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/BudgetCounter' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /runtime/budgets/{level}/{owner}/{name}:reset: post: operationId: resetBudgetCounter summary: Reset the current period tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/BudgetLevel' - $ref: '#/components/parameters/BudgetOwner' - $ref: '#/components/parameters/BudgetName' - $ref: '#/components/parameters/Partition' responses: '200': description: Counter state after the reset (an `adjustment` ledger line is written). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/BudgetCounter' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: budgets:adjust /runtime/cache: get: operationId: getCacheStatus summary: Cache backend status tags: - Cache responses: '200': description: Backend answers. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/CacheStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': description: Backend does not answer. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/CacheStatusUnhealthy' x-antirion-permission: cache:admin /runtime/cache/invalidation_rules: get: operationId: listInvalidationRuleStatus summary: Invalidation rule firings tags: - Cache parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/InvalidationRuleStatusList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cache:admin /runtime/deployments: get: operationId: listDeploymentHealth summary: Health of every deployment tags: - Health parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Health objects, including keys. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentHealthList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: health:read /runtime/deployments/{name}: get: operationId: getDeploymentHealth summary: Health of one deployment tags: - Health parameters: - $ref: '#/components/parameters/DeploymentName' responses: '200': description: Breaker, cooldown, disable and key state. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentHealth' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: health:read /runtime/deployments/{name}:disable: post: operationId: disableDeployment summary: Disable a deployment manually tags: - Health description: Custom action. A manual disable persists across reloads and restarts. parameters: - $ref: '#/components/parameters/DeploymentName' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/DeploymentDisable' responses: '200': description: The deployment's health after the action. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentHealth' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: health:write /runtime/deployments/{name}:enable: post: operationId: enableDeployment summary: Clear a manual disable tags: - Health parameters: - $ref: '#/components/parameters/DeploymentName' responses: '200': description: The deployment's health after the action. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentHealth' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: health:write /runtime/deployments/{name}:reset: post: operationId: resetDeployment summary: Close the breaker, clear cooldowns, revive pairs tags: - Health parameters: - $ref: '#/components/parameters/DeploymentName' responses: '200': description: The deployment's health after the action. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/DeploymentHealth' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: health:write /runtime/encryption: get: operationId: getEncryption summary: Encryption in transit and at rest description: The serving node's listener TLS with its certificates, and the encryption of stored secrets with its key list and external secret stores; never key material. tags: - Settings responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/EncryptionReport' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:read /runtime/guardrails: get: operationId: listGuardrailRuntime summary: Guardrail statistics tags: - Guardrails parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/GuardrailRuntimeList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /runtime/ingress: get: operationId: getIngress summary: Active ingress pauses tags: - Governance responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/IngressState' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: health:read /runtime/ingress:pause: post: operationId: pauseIngress summary: Pause data-plane ingress description: '`organizations:update` suffices for one organization.' tags: - Governance requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/IngressPause' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/IngressState' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /runtime/ingress:resume: post: operationId: resumeIngress summary: Resume data-plane ingress tags: - Governance requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/IngressResume' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/IngressState' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /runtime/limits: get: operationId: listLimitCounters summary: Limit counter state tags: - Limits, budgets and spend parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - $ref: '#/components/parameters/Counter_level' - $ref: '#/components/parameters/Counter_owner' - $ref: '#/components/parameters/Counter_name' - $ref: '#/components/parameters/Partition' responses: '200': description: Counters. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LimitCounterList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /runtime/limits:simulate: post: operationId: simulateLimits summary: Simulate limits and budgets for a request tags: - Limits, budgets and spend requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LimitSimulation' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/LimitSimulationResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read /runtime/mcp/sessions: get: operationId: listMcpSessions summary: MCP session state per gateway tags: - MCP and A2A parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: One entry per MCP gateway. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/McpSessionStatsList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read /runtime/nodes: get: operationId: listNodes summary: Nodes tags: - Cluster parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: One entry in standalone mode. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/NodeList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cluster:read /runtime/nodes/{id}: get: operationId: getNode summary: One node tags: - Cluster parameters: - $ref: '#/components/parameters/NodeId' responses: '200': description: The node. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Node' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: cluster:read /runtime/nodes/{id}:drain: post: operationId: drainNode summary: Drain a node tags: - Cluster description: Custom action. Readiness turns 503 and new data-plane requests get 503 `draining`; listeners stay open and the process stays alive until stopped. parameters: - $ref: '#/components/parameters/NodeId' - $ref: '#/components/parameters/DrainWait' responses: '200': description: 'With `wait=true`: drained, or the deadline passed.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: type: object properties: status: type: string enum: - drained - deadline in_flight: type: integer minimum: 0 required: - status '202': description: Draining started (or already draining). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: type: object properties: status: const: draining in_flight: type: integer minimum: 0 required: - status - in_flight '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: node:drain /runtime/plugins: get: operationId: listPluginRuntime summary: Extension health and counters tags: - Extensions parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: One entry per extension. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PluginRuntimeList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: plugins:read /runtime/plugins/{name}: get: operationId: getPluginRuntime summary: One extension's health and counters tags: - Extensions parameters: - $ref: '#/components/parameters/PluginName' responses: '200': description: Counters of the answering node. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/PluginRuntime' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: plugins:read /runtime/providers: get: operationId: listProviderStatus summary: Credential and TLS state of every provider tags: - Health parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Provider status objects. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderStatusList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:read /runtime/providers/{name}: get: operationId: getProviderStatus summary: Credential and TLS state of a provider tags: - Health parameters: - $ref: '#/components/parameters/ProviderName' responses: '200': description: Status (adds `tls_verify`). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ProviderStatus' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: providers:read /runtime/providers/{provider}/keys/{key}:reset: post: operationId: resetProviderKey summary: Revive a provider key and all its pairs tags: - Health parameters: - name: provider in: path required: true schema: $ref: ../schema/antirion-config.schema.json#/$defs/ProviderName description: Provider. - $ref: '#/components/parameters/ProviderKeyName' responses: '204': description: Revived. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: health:write /runtime/slos: get: operationId: listSloStatus summary: SLO attainment and error budgets tags: - Observability parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SloStatusList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: analytics:read /settings/a2a: get: operationId: getA2aSettings summary: Read `a2a` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/A2aSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read put: operationId: replaceA2aSettings summary: Replace `a2a` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/A2aSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/A2aSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write patch: operationId: patchA2aSettings summary: Merge-patch `a2a` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/A2aSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /settings/admin: get: operationId: getAdminSettings summary: Read `admin` settings tags: - Settings description: Values of the serving node (secrets redacted). Writes are 405. responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/AdminSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /settings/api: get: operationId: getApiSettings summary: Read `api` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ApiSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read put: operationId: replaceApiSettings summary: Replace `api` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ApiSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ApiSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply patch: operationId: patchApiSettings summary: Merge-patch `api` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ApiSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /settings/auth: get: operationId: getAuthSettings summary: Read `auth` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/AuthSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:read put: operationId: replaceAuthSettings summary: Replace `auth` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AuthSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AuthSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write patch: operationId: patchAuthSettings summary: Merge-patch `auth` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/AuthSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /settings/auth:rotate_scim_token: post: operationId: rotateScimToken summary: Generate or rotate the SCIM token tags: - Settings requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SecretRotate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SecretRotated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /settings/budgets: get: operationId: getBudgetsSettings summary: Read `budgets` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/BudgetsSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replaceBudgetsSettings summary: Replace `budgets` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BudgetsSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/BudgetsSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchBudgetsSettings summary: Merge-patch `budgets` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/BudgetsSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /settings/cache: get: operationId: getCacheSettings summary: Read `cache` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/CacheSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replaceCacheSettings summary: Replace `cache` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CacheSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/CacheSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchCacheSettings summary: Merge-patch `cache` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/CacheSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /settings/catalog: get: operationId: getCatalogSettings summary: Read `catalog` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/CatalogSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read put: operationId: replaceCatalogSettings summary: Replace `catalog` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CatalogSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/CatalogSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write patch: operationId: patchCatalogSettings summary: Merge-patch `catalog` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/CatalogSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /settings/cluster: get: operationId: getClusterSettings summary: Read `cluster` settings tags: - Settings description: Values of the serving node (secrets redacted). Writes are 405. responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ClusterSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /settings/governance: get: operationId: getGovernanceSettings summary: Read `governance` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/GovernanceSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:read put: operationId: replaceGovernanceSettings summary: Replace `governance` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GovernanceSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GovernanceSettings' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write patch: operationId: patchGovernanceSettings summary: Merge-patch `governance` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GovernanceSettings' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /settings/guardrails: get: operationId: getGuardrailsSettings summary: Read `guardrails` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/GuardrailsSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replaceGuardrailsSettings summary: Replace `guardrails` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GuardrailsSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GuardrailsSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchGuardrailsSettings summary: Merge-patch `guardrails` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/GuardrailsSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /settings/limits: get: operationId: getLimitsSettings summary: Read `limits` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/LimitsSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replaceLimitsSettings summary: Replace `limits` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LimitsSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/LimitsSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchLimitsSettings summary: Merge-patch `limits` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/LimitsSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /settings/mcp: get: operationId: getMcpSettings summary: Read `mcp` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/McpSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: mcp:read put: operationId: replaceMcpSettings summary: Replace `mcp` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/McpSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write patch: operationId: patchMcpSettings summary: Merge-patch `mcp` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/McpSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: mcp:write /settings/observability: get: operationId: getObservabilitySettings summary: Read `observability` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ObservabilitySettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read put: operationId: replaceObservabilitySettings summary: Replace `observability` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ObservabilitySettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ObservabilitySettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply patch: operationId: patchObservabilitySettings summary: Merge-patch `observability` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ObservabilitySettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /settings/policies: get: operationId: getPoliciesSettings summary: Read `policies` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/PoliciesSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replacePoliciesSettings summary: Replace `policies` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PoliciesSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PoliciesSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchPoliciesSettings summary: Merge-patch `policies` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PoliciesSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /settings/pricing: get: operationId: getPricingSettings summary: Read `pricing` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/PricingSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: pricing:read put: operationId: replacePricingSettings summary: Replace `pricing` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PricingSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PricingSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: pricing:write patch: operationId: patchPricingSettings summary: Merge-patch `pricing` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/PricingSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: pricing:write /settings/resilience: get: operationId: getResilienceSettings summary: Read `resilience` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ResilienceSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: policies:read put: operationId: replaceResilienceSettings summary: Replace `resilience` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ResilienceSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ResilienceSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write patch: operationId: patchResilienceSettings summary: Merge-patch `resilience` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ResilienceSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: policies:write /settings/routing: get: operationId: getRoutingSettings summary: Read `routing` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/RoutingSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: models:read put: operationId: replaceRoutingSettings summary: Replace `routing` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RoutingSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/RoutingSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write patch: operationId: patchRoutingSettings summary: Merge-patch `routing` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/RoutingSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: models:write /settings/security: get: operationId: getSecuritySettings summary: Read `security` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/SecuritySettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:read put: operationId: replaceSecuritySettings summary: Replace `security` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SecuritySettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/SecuritySettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write patch: operationId: patchSecuritySettings summary: Merge-patch `security` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/SecuritySettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /settings/security:rotate_secrets: post: operationId: rotateGatewaySecrets summary: Rotate gateway-generated secrets tags: - Settings requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SecretsRotate' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SecretsRotated' '202': $ref: '#/components/responses/HeldForApproval' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /settings/server: get: operationId: getServerSettings summary: Read `server` settings tags: - Settings description: Values of the serving node (secrets redacted). Only `PATCH` of `admission` is allowed; PUT is 405. responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ServerSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read patch: operationId: patchServerSettings summary: Change `server.admission` tags: - Settings description: 'The only write on a static key: the patch''s `spec` may set only `admission`; any other member is 405. PUT is 405 (a full replacement of a static object).' parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/ServerSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '405': $ref: '#/components/responses/MethodNotAllowed' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /settings/smtp: get: operationId: getSmtpSettings summary: Read `smtp` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/SmtpSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:read put: operationId: replaceSmtpSettings summary: Replace `smtp` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SmtpSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/SmtpSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write patch: operationId: patchSmtpSettings summary: Merge-patch `smtp` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/SmtpSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: security:write /settings/smtp:test: post: operationId: testSmtp summary: Send a test email tags: - Settings requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SmtpTest' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TestResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: security:write /settings/store: get: operationId: getStoreSettings summary: Read `store` settings tags: - Settings description: Values of the serving node (secrets redacted). Writes are 405. responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/StoreSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read /settings/streaming: get: operationId: getStreamingSettings summary: Read `streaming` settings tags: - Settings responses: '200': description: The settings. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/StreamingSettings' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: config:read put: operationId: replaceStreamingSettings summary: Replace `streaming` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/StreamingSettingsReplace' responses: '200': description: Replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/StreamingSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply patch: operationId: patchStreamingSettings summary: Merge-patch `streaming` settings tags: - Settings parameters: - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/StreamingSettings' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: config:apply /status: get: operationId: getStatus summary: Version, mode, generation and features tags: - Discovery responses: '200': description: Status. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/Status' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: authenticated /teams: get: operationId: listTeams summary: List teams tags: - Tenancy parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Teams, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TeamList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: teams:read post: operationId: createTeam summary: Create a team tags: - Tenancy parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TeamCreate' responses: '201': description: Team created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/TeamResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: teams:create /teams/{name}: get: operationId: getTeam summary: Read a team tags: - Tenancy parameters: - $ref: '#/components/parameters/TeamName' responses: '200': description: The team. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/TeamResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: teams:read put: operationId: replaceTeam summary: Create or replace a team tags: - Tenancy parameters: - $ref: '#/components/parameters/TeamName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TeamReplace' responses: '200': description: Team replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/TeamResource' '201': description: Team created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/TeamResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: teams:create (create) / teams:update (replace) patch: operationId: patchTeam summary: Merge-patch a team tags: - Tenancy parameters: - $ref: '#/components/parameters/TeamName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: Team patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/TeamResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: teams:update delete: operationId: deleteTeam summary: Delete a team tags: - Tenancy parameters: - $ref: '#/components/parameters/TeamName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/Cascade' responses: '204': description: Team deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: teams:delete /test/clock: get: operationId: getTestClock summary: Read the test clock tags: - Test mode description: Test mode only (`antirion serve --test-mode`); otherwise 404 `not_found`. Every call is audited. responses: '200': description: Current test-clock time. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TestClock' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role:gateway_admin post: operationId: moveTestClock summary: Move the test clock forward tags: - Test mode description: Test mode only (`antirion serve --test-mode`); otherwise 404 `not_found`. Every call is audited. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TestClockMove' responses: '200': description: The new time. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/TestClock' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role:gateway_admin /test/reset: post: operationId: resetTestState summary: Clear runtime state tags: - Test mode description: Test mode only (`antirion serve --test-mode`); otherwise 404 `not_found`. Every call is audited. requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/TestReset' responses: '204': description: Cleared; config is untouched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role:gateway_admin /test/seed: put: operationId: seedTestRandomness summary: Seed every random choice tags: - Test mode description: Test mode only (`antirion serve --test-mode`); otherwise 404 `not_found`. Every call is audited. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TestSeed' responses: '204': description: Seeded. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: role:gateway_admin /users: get: operationId: listUsers summary: List users description: Filters, facets and counts; each item's read-only facts tags: - Tenancy parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' - name: last_active_before in: query required: false description: Users last active before this time, or never. schema: $ref: '#/components/schemas/Timestamp' - name: state in: query required: false description: Users in one of these states (`metadata.state`). schema: type: array items: enum: - active - invited - disabled explode: true - name: role in: query required: false description: Users holding a binding of one of these roles. schema: type: array items: type: string explode: true - name: team in: query required: false description: Users whose primary team is, or who hold a binding on, one of these teams or one of its projects. schema: type: array items: type: string explode: true - name: q in: query required: false description: Case-insensitive substring of the name, display name or email. schema: type: string responses: '200': description: Users, ordered by name. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/UserList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: users:read post: operationId: createUser summary: Create a user tags: - Tenancy parameters: - $ref: '#/components/parameters/Wait' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserCreate' responses: '201': description: User created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/UserResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:create /users/{name}: get: operationId: getUser summary: Read a user tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' responses: '200': description: The user. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/UserResource' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: users:read put: operationId: replaceUser summary: Create or replace a user tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/IfNoneMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserReplace' responses: '200': description: User replaced. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/UserResource' '201': description: User created. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/UserResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:create (create) / users:update (replace) patch: operationId: patchUser summary: Merge-patch a user tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/MergePatch' responses: '200': description: User patched. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' ETag: $ref: '#/components/headers/ETag' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/UserResource' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:update delete: operationId: deleteUser summary: Delete a user tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/IfMatch' - $ref: '#/components/parameters/Wait' responses: '204': description: User deleted. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '412': $ref: '#/components/responses/PreconditionFailed' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:delete /users/{name}/sessions: get: operationId: listUserSessions summary: List a user's sessions tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/SessionList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: users:update delete: operationId: revokeUserSessions summary: End all of a user's sessions tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/RevokedCount' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:update /users/{name}/tokens: get: operationId: listAdminTokens summary: List a user's admin tokens tags: - Access control parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Cursor' responses: '200': description: Tokens (no secrets). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminTokenList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' x-antirion-permission: users:read post: operationId: createAdminToken summary: Issue an admin token tags: - Access control parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/IdempotencyKey' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/AdminTokenCreate' responses: '201': description: The token, shown once. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Location: $ref: '#/components/headers/Location' content: application/json: schema: $ref: '#/components/schemas/AdminTokenCreated' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '413': $ref: '#/components/responses/PayloadTooLarge' '415': $ref: '#/components/responses/UnsupportedMediaType' '422': $ref: '#/components/responses/IdempotencyKeyReused' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:update /users/{name}/tokens/{kid}: delete: operationId: deleteAdminToken summary: Revoke an admin token tags: - Access control parameters: - $ref: '#/components/parameters/UserName' - $ref: '#/components/parameters/TokenKid' responses: '204': description: Revoked. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:update /users/{name}:offboard: post: operationId: offboardUser summary: Offboard a user tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OffboardRequest' responses: '200': description: OK. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' x-antirion-config-generation: $ref: '#/components/headers/XConfigGeneration' x-antirion-config-propagated: $ref: '#/components/headers/XConfigPropagated' content: application/json: schema: $ref: '#/components/schemas/OffboardResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:update /users/{name}:reset_mfa: post: operationId: resetUserMfa summary: Reset a user's second factors tags: - Tenancy parameters: - $ref: '#/components/parameters/UserName' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string maxLength: 500 responses: '204': description: Factors removed; sessions ended. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthenticated' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/Internal' '503': $ref: '#/components/responses/StoreUnavailable' x-antirion-permission: users:update components: securitySchemes: adminToken: type: http scheme: bearer bearerFormat: ak-antirion admin token description: Service-account or user admin token, or the bootstrap credential. operatorSession: type: apiKey in: cookie name: antirion_session description: Operator session. The cookie is `HttpOnly; Secure; SameSite=Lax`, so cookie-authenticated `POST`/`PUT`/`PATCH`/`DELETE` must also send an `Origin` equal to `auth.admin.public_origin` (403 otherwise). schemas: A2aAgentCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/A2a/properties/agents/additionalProperties required: - name - spec A2aAgentList: type: object properties: items: type: array items: $ref: '#/components/schemas/A2aAgentResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor A2aAgentReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/A2a/properties/agents/additionalProperties required: - spec A2aAgentResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/A2a/properties/agents/additionalProperties metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata A2aSettings: type: object description: '`a2a` singleton (owner). `a2a` without `agents` (served as `/a2a/agents`).' properties: spec: allOf: - $ref: ../schema/antirion-config.schema.json#/$defs/A2a properties: agents: false description: Without `agents` (served as nested collections). metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata A2aSettingsReplace: type: object properties: spec: allOf: - $ref: ../schema/antirion-config.schema.json#/$defs/A2a properties: agents: false description: Without `agents` (served as nested collections). required: - spec AccessRequest: type: object properties: id: type: string model: type: string scope: type: string reason: type: string requested_by: type: string requested_at: $ref: '#/components/schemas/Timestamp' state: enum: - open - approved - denied decided_by: type: - string - 'null' decided_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - id - model - scope - requested_by - requested_at - state AccessRequestCreate: type: object properties: scope: type: string pattern: ^(organization|team|project|key)/[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ reason: type: string maxLength: 500 required: - scope AccessRequestList: type: object properties: items: type: array items: $ref: '#/components/schemas/AccessRequest' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AdminError: type: object description: Admin error envelope. The data plane uses instead. properties: error: type: object properties: code: $ref: '#/components/schemas/ErrorCode' message: type: string request_id: type: string details: type: array items: $ref: '#/components/schemas/ValidationDetail' description: Every problem found (validation_failed), or the referrers (resource_in_use). required: - code - message - request_id required: - error AdminSettings: type: object description: '`admin` singleton (owner). Static.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Admin metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata AdminToken: type: object properties: kid: type: string hint: type: string description: type: - string - 'null' expires_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' created_at: $ref: '#/components/schemas/Timestamp' last_used_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - kid - hint - created_at AdminTokenCreate: type: object properties: expires_at: $ref: '#/components/schemas/Timestamp' description: type: string maxLength: 500 AdminTokenCreated: allOf: - $ref: '#/components/schemas/AdminToken' - type: object properties: token: type: string description: Plaintext `ak-antirion-` token, returned once. required: - token AdminTokenList: type: object properties: items: type: array items: $ref: '#/components/schemas/AdminToken' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor Alert: type: object description: Alert instance. properties: id: type: string rule: type: string fingerprint: type: string category: type: string severity: enum: - critical - warning - info status: enum: - firing - acknowledged - resolved snoozed_until: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' fired_at: $ref: '#/components/schemas/Timestamp' acknowledged_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' acknowledged_by: type: - string - 'null' resolved_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' resolved_by: type: - string - 'null' summary: type: string scope: type: object additionalProperties: type: string value: type: - number - 'null' threshold: type: - number - 'null' owner_team: type: - string - 'null' runbook_url: type: - string - 'null' impact: type: object properties: requests: type: integer minimum: 0 errors: type: integer minimum: 0 throttled: type: integer minimum: 0 timeline: type: array items: $ref: '#/components/schemas/AlertTimelineEntry' required: - id - rule - fingerprint - category - severity - status - fired_at - summary AlertChannelCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability/properties/alerts/properties/channels/additionalProperties required: - name - spec AlertChannelList: type: object properties: items: type: array items: $ref: '#/components/schemas/AlertChannelResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AlertChannelReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability/properties/alerts/properties/channels/additionalProperties required: - spec AlertChannelResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability/properties/alerts/properties/channels/additionalProperties metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata AlertDelivery: type: object properties: event_id: type: string webhook: type: string description: The webhook, or the alert channel, the attempt went to. target_kind: enum: - webhook - channel event_type: type: string attempt: type: integer minimum: 1 time: $ref: '#/components/schemas/Timestamp' status_code: type: - integer - 'null' result: type: string examples: - delivered - failed - timeout required: - event_id - webhook - attempt - time - status_code - result AlertDeliveryList: type: object properties: items: type: array items: $ref: '#/components/schemas/AlertDelivery' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AlertList: type: object properties: items: type: array items: $ref: '#/components/schemas/Alert' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AlertNote: type: object properties: text: type: string minLength: 1 maxLength: 2000 required: - text AlertRuleCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability/properties/alerts/properties/rules/additionalProperties required: - name - spec AlertRuleList: type: object properties: items: type: array items: $ref: '#/components/schemas/AlertRuleResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AlertRuleReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability/properties/alerts/properties/rules/additionalProperties required: - spec AlertRuleResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability/properties/alerts/properties/rules/additionalProperties metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata AlertSnooze: type: object properties: duration: $ref: '#/components/schemas/Duration' required: - duration AlertTimelineEntry: type: object properties: time: $ref: '#/components/schemas/Timestamp' kind: enum: - fired - notified - notification_failed - acknowledged - note - escalated - snoozed - resolved - refired actor: type: - string - 'null' detail: type: object required: - time - kind Anomaly: type: object properties: id: type: string key: type: string owner: type: - string - 'null' kind: enum: - spike - network - user_agent - country - exposed severity: enum: - critical - warning - info first_seen: $ref: '#/components/schemas/Timestamp' last_seen: $ref: '#/components/schemas/Timestamp' count: type: integer minimum: 0 detail: type: object state: enum: - open - dismissed required: - id - key - kind - severity - first_seen - last_seen - count - state AnomalyList: type: object properties: items: type: array items: $ref: '#/components/schemas/Anomaly' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor ApiSettings: type: object description: '`api` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Api metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata ApiSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Api required: - spec ApplyResult: type: object properties: generation: type: integer minimum: 0 changes: type: array items: $ref: '#/components/schemas/Change' static_ignored: type: array items: type: string propagated: type: boolean warnings: type: array items: $ref: '#/components/schemas/Warning' required: - generation - changes - static_ignored - propagated AuditEntry: type: object properties: id: type: string time: $ref: '#/components/schemas/Timestamp' actor: type: object properties: type: type: string enum: - operator - token - system id: type: string required: - type - id action: type: string resource: type: - string - 'null' outcome: type: string enum: - success - denied - failed status_code: type: integer generation_before: type: - integer - 'null' generation_after: type: - integer - 'null' request_id: type: string source_ip: type: string changes: type: - array - 'null' items: $ref: '#/components/schemas/Change' description: Redacted change set when `admin.audit.include_diffs` is true. An action that commits no generation states its facts as one `update` of its resource, the facts in `after`. kind: type: string enum: - write - read description: '`read` for the audited reads of, `write` otherwise.' reason: type: - string - 'null' maxLength: 500 description: The `x-antirion-change-reason` the mutation was sent with. required: - id - time - actor - action - resource - outcome - status_code - generation_before - generation_after - request_id - source_ip - changes AuditList: type: object properties: items: type: array items: $ref: '#/components/schemas/AuditEntry' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AuditSinkStatus: type: object properties: name: type: string last_write_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' entries_24h: type: integer minimum: 0 failures_24h: type: integer minimum: 0 queued: type: integer minimum: 0 oldest_queued_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' state: enum: - ok - retrying - dropping required: - name - entries_24h - failures_24h - queued - state AuditSinkStatusList: type: object properties: items: type: array items: $ref: '#/components/schemas/AuditSinkStatus' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AuthSettings: type: object description: '`auth` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Auth metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata AuthSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Auth required: - spec AvailabilityList: type: object properties: items: type: array items: $ref: '#/components/schemas/AvailabilityRow' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor AvailabilityRow: type: object properties: group: type: object additionalProperties: type: - string - 'null' start: $ref: '#/components/schemas/Timestamp' requests: type: integer minimum: 0 gateway_failures: type: integer minimum: 0 upstream_failures: type: integer minimum: 0 availability: type: - number - 'null' uptime_ratio: type: - number - 'null' required: - group - requests - availability BudgetAdjust: type: object properties: amount: $ref: '#/components/schemas/SignedMoney' reason: type: string minLength: 1 partition: type: string required: - amount - reason BudgetCounter: type: object description: A budget counter's state in its current period, with what the console reads of it (… 051,). properties: level: type: string enum: - gateway - organization - team - project - key - model - route - node owner: type: string name: type: string partition: type: - string - 'null' unit: type: string enum: - usd - tokens mode: type: string enum: - hard - soft - approval amount: type: string description: The declared amount (the partition's override, if any). Decimal string (usd) or integer string (tokens). effective_amount: type: string description: The amount admission refuses at, `amount` plus the running grants. spent: type: string reserved: type: string remaining: type: string description: max(0, effective_amount − spent − reserved). period_start: $ref: '#/components/schemas/Timestamp' resets_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' budget_owner: type: - string - 'null' description: The user the declaration's `owner` names; `owner` is the owning resource. state: enum: - on_pace - at_risk - over - blocked forecast: $ref: '#/components/schemas/BudgetForecast' description: 'Absent for a rolling budget (`algorithm: sliding_window`), whose window has no end to project to.' grants: type: array description: The running overage grants. items: $ref: '#/components/schemas/BudgetGrant' refused_requests: type: integer minimum: 0 description: Requests this budget refused in the current period, every node's. downgraded_requests: type: integer minimum: 0 description: Requests this budget downgraded in the current period, every node's. children_allocated: type: - string - 'null' description: The sum of the amounts of the budgets directly below this one, null when none. downgrade: oneOf: - type: object properties: at: type: number to_model: type: string to_tier: type: string required: - at - type: 'null' description: The declaration's downgrade. required: - level - owner - name - partition - unit - mode - amount - spent - reserved - remaining - period_start - resets_at BudgetForecast: type: object description: ',: the rate over the trailing min(elapsed, 7d) of the period, projected to its end. Amounts in the budget''s unit.' properties: rate_per_day: type: string projected_spend: type: string projected_ratio: type: - number - 'null' description: projected_spend / amount, to four decimals; null for a zero amount. runs_out_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: When spent reaches effective_amount at the rate, if no later than the period's end; null when the rate is zero or it is reached already. basis_from: $ref: '#/components/schemas/Timestamp' basis_to: $ref: '#/components/schemas/Timestamp' required: - rate_per_day - projected_spend - projected_ratio - runs_out_at - basis_from - basis_to BudgetGrant: type: object description: A running overage grant. properties: id: type: string amount: type: string expires_at: $ref: '#/components/schemas/Timestamp' reason: type: string granted_by: type: string created_at: $ref: '#/components/schemas/Timestamp' required: - id - amount - expires_at - reason - granted_by BudgetCounterList: type: object properties: items: type: array items: $ref: '#/components/schemas/BudgetCounter' next_cursor: $ref: '#/components/schemas/NextCursor' counts: type: object description: Counters per state among those every filter but `state` selects, before pagination. additionalProperties: type: integer minimum: 0 total: type: integer minimum: 0 description: How many counters every filter but `state` selects. required: - items - next_cursor BudgetEvent: type: object description: '`detail` by kind is listed. `exhausted` is the first refusal of a period once nothing remained (`detail.refused_requests` counts the period''s refusals); `request_over_remaining` is the first refusal of a period of a request that reserved more than what remained while something did (`detail.requested`, `detail.remaining`), which does not exhaust the budget' properties: id: type: string time: $ref: '#/components/schemas/Timestamp' kind: enum: - threshold_crossed - exhausted - request_over_remaining - forecast_exceeded - overage_granted - overage_requested - reset - adjusted - config_changed level: type: string owner: type: string name: type: string actor: type: - string - 'null' detail: type: object required: - time - kind - level - owner - name BudgetEventList: type: object properties: items: type: array items: $ref: '#/components/schemas/BudgetEvent' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor BudgetsSettings: type: object description: '`budgets` singleton (owner). Settings only; budget declarations live in `policies.budgets` blocks.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/BudgetsSettings metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata BudgetsSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/BudgetsSettings required: - spec CacheEntry: type: object properties: key: type: string mode: enum: - exact - semantic model: type: string route: type: - string - 'null' deployment: type: string scope: type: string size_bytes: type: integer minimum: 0 input_tokens: type: integer minimum: 0 output_tokens: type: integer minimum: 0 hits: type: integer minimum: 0 created_at: $ref: '#/components/schemas/Timestamp' expires_at: $ref: '#/components/schemas/Timestamp' last_hit_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' similarity_threshold: type: - number - 'null' saved_usd: $ref: '#/components/schemas/Money' description: What the entry's hits would have been billed. response: description: Detail reads only, and only with `logs:read_content`; null otherwise and named in `x-antirion-fields-redacted`. required: - key - mode - model - size_bytes - hits - created_at - expires_at CacheEntryList: type: object properties: items: type: array items: $ref: '#/components/schemas/CacheEntry' next_cursor: $ref: '#/components/schemas/NextCursor' enumerable: type: boolean description: False when the entry index could not be read. total: type: integer minimum: 0 total_size_bytes: type: integer minimum: 0 total_hits: type: integer minimum: 0 required: - items - next_cursor - enumerable CacheInvalidate: type: object description: The levels in the key bump their epoch; `model`, `key`, `end_user`, `tag` and `metadata` (`name` is `=`) and `older_than` (with `duration`) set a cutoff every node applies. properties: level: type: string enum: - gateway - organization - team - project - route - model - key - end_user - tag - metadata - older_than name: type: string description: Omitted for `gateway` and `older_than`. duration: type: string description: '`older_than` only: entries written longer ago than this are dropped (a duration above 0s).' required: - level CacheInvalidated: type: object properties: level: type: string name: type: - string - 'null' epoch: type: integer minimum: 0 required: - level - name - epoch CacheSettings: type: object description: '`cache` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Cache metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata CacheSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Cache required: - spec CacheStatus: type: object properties: backend: type: string healthy: type: boolean entries: type: - integer - 'null' bytes: type: - integer - 'null' hits: type: integer minimum: 0 misses: type: integer minimum: 0 semantic: type: array description: One item per configuration level that turns the semantic layer on, over the trailing 30 days. items: $ref: '#/components/schemas/CacheSemanticStats' required: - backend - healthy - entries - bytes - hits - misses - semantic CacheSemanticStats: type: object properties: scope: type: string description: '`gateway`, or `/` of the level whose `policies.cache.semantic.enabled` is true (`model/m`).' embedding_model: type: - string - 'null' threshold: type: number entries: type: integer minimum: 0 hits: type: integer minimum: 0 mean_similarity_of_hits: type: - number - 'null' false_positive_reports: type: integer minimum: 0 false_positive_rate: type: - number - 'null' required: - scope - embedding_model - threshold - entries - hits - mean_similarity_of_hits - false_positive_reports - false_positive_rate CacheStatusUnhealthy: type: object description: Exactly these two members; never error text, hostnames, paths or stack traces. properties: backend: type: string healthy: const: false required: - backend - healthy additionalProperties: false CapabilityValue: type: object properties: value: {} source: type: string enum: - deployment - provider - catalog - type_default required: - value - source CatalogSettings: type: object description: '`catalog` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Catalog metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata CatalogSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Catalog required: - spec CatalogStatus: type: object description: The effective model catalog. properties: bundled: type: object properties: version: type: string description: The version of the bundled capability values. price_version: type: string description: The version of the bundled prices. entries: type: integer required: - version - price_version - entries runtime: description: The `catalog` block, null while it is not set. oneOf: - type: object properties: mode: type: string enum: - extend - replace version: type: - string - 'null' entries: type: integer updated_at: type: - string - 'null' format: date-time description: When the generation that last changed the block was committed. generation: type: - integer - 'null' required: - mode - version - entries - updated_at - generation - type: 'null' items: type: array items: type: object properties: pattern: type: string source: type: string enum: - bundled - runtime capabilities: type: object ttft: type: - string - 'null' price: type: - object - 'null' required: - pattern - source - capabilities - ttft - price required: - bundled - runtime - items Change: type: object description: Secrets redacted. properties: op: type: string enum: - create - update - delete path: type: string examples: - routes.fast before: type: - object - 'null' after: type: - object - 'null' required: - op - path - before - after ChangePassword: type: object properties: current_password: type: string new_password: type: string totp: type: string webauthn: type: object recovery_code: type: string required: - current_password - new_password ChangeRequest: type: object description: Change request. properties: id: type: string kind: enum: - config - action title: type: string description: type: string author: type: string description: The person who opened the request, the user or service account behind the credential (the credential's id for a principal without one, the bootstrap token); every credential of one user is the same author. created_at: $ref: '#/components/schemas/Timestamp' base_generation: type: integer minimum: 0 changes: type: array items: $ref: '#/components/schemas/ChangeRequestChange' diff: type: array items: $ref: '#/components/schemas/Change' state: enum: - open - approved - rejected - applied - cancelled - expired - conflicted approvals: type: array items: type: object properties: by: type: string description: The person who approved, counted once however many credentials they use. credential: type: string description: The id of the credential the approval was made with. at: $ref: '#/components/schemas/Timestamp' required: - by - at approvals_required: type: integer minimum: 1 expires_at: $ref: '#/components/schemas/Timestamp' applied_generation: type: - integer - 'null' required: - id - kind - title - author - created_at - changes - state - approvals - approvals_required ChangeRequestChange: type: object properties: method: enum: - POST - PUT - PATCH - DELETE path: type: string pattern: ^/ body: {} required: - method - path ChangeRequestCreate: type: object properties: title: type: string minLength: 1 maxLength: 200 description: type: string maxLength: 5000 changes: type: array items: $ref: '#/components/schemas/ChangeRequestChange' minItems: 1 required: - title - changes ChangeRequestList: type: object properties: items: type: array items: $ref: '#/components/schemas/ChangeRequest' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor Cluster: type: object properties: mode: type: string enum: - standalone - cluster nodes: type: array items: $ref: '#/components/schemas/Node' jobs: type: array items: $ref: '#/components/schemas/JobLease' required: - mode - nodes - jobs ClusterSettings: type: object description: '`cluster` singleton (owner). Static.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Cluster metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata ConfigDocument: $ref: ../schema/antirion-config.schema.json description: A (partial or whole) config document, as YAML 1.2 or JSON. CredentialRotate: type: object properties: credential: $ref: ../schema/antirion-config.schema.json#/$defs/Secret retire_after: $ref: '#/components/schemas/Duration' key: type: string required: - credential - retire_after DeletedCount: type: object properties: deleted: type: integer minimum: 0 required: - deleted DeliveryTargetStatus: type: object properties: name: type: string enabled: type: boolean last_delivery_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_status: type: - integer - 'null' deliveries_24h: type: integer minimum: 0 failures_24h: type: integer minimum: 0 queued: type: integer minimum: 0 required: - name - deliveries_24h - failures_24h - queued DeliveryTargetStatusList: type: object properties: items: type: array items: $ref: '#/components/schemas/DeliveryTargetStatus' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor DeploymentCapabilities: type: object properties: deployment: type: string provider: type: string type: type: string base_model: type: string capabilities: type: object description: Every flag of, including the translation flags. additionalProperties: $ref: '#/components/schemas/CapabilityValue' hints: type: object properties: ttft: type: object properties: value: $ref: '#/components/schemas/Duration' source: type: string enum: - catalog required: - deployment - provider - type - capabilities DeploymentCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Deployment required: - name - spec DeploymentDisable: type: object properties: until: $ref: '#/components/schemas/Timestamp' DeploymentHealth: type: object description: In cluster mode the merged cluster state. properties: name: type: string trip_error_rate: type: - number - 'null' description: The failure rate of the breaker's window when it last tripped. state: type: string enum: - closed - open - half_open - disabled open_until: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' trips: type: integer minimum: 0 consecutive: type: integer minimum: 0 window: type: object properties: requests: type: integer minimum: 0 failures: type: integer minimum: 0 required: - requests - failures cooldown_until: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' disabled_until: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' keys: type: array items: $ref: '#/components/schemas/KeyHealth' required: - name - state - open_until - trips - consecutive - window - cooldown_until - disabled_until - keys DeploymentHealthList: type: object properties: items: type: array items: $ref: '#/components/schemas/DeploymentHealth' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor DeploymentList: type: object properties: items: type: array items: $ref: '#/components/schemas/DeploymentResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor DeploymentReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Deployment required: - spec DeploymentResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Deployment metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata DeviceAuthorization: type: object description: RFC 8628 §3.2. properties: device_code: type: string user_code: type: string pattern: ^[BCDFGHJKLMNPQRSTVWXZ]{4}-[BCDFGHJKLMNPQRSTVWXZ]{4}$ verification_uri: type: string verification_uri_complete: type: string expires_in: type: integer interval: type: integer required: - device_code - user_code - verification_uri - verification_uri_complete - expires_in - interval DeviceAuthorizationRequest: type: object properties: client_id: type: string maxLength: 100 organization: type: string description: The organization the console starts in. sso: type: boolean description: Ask the console to sign in with single sign-on. DeviceAuthorizationState: type: object properties: user_code: type: string status: type: string enum: - pending - approved - denied requested_at: type: string format: date-time expires_at: type: string format: date-time client_id: type: - string - 'null' client_ip: type: - string - 'null' organization: type: - string - 'null' sso: type: boolean required: - user_code - status - requested_at - expires_at - client_id - client_ip - organization - sso DeviceToken: type: object description: RFC 6749 §5.1; a personal admin token of the approving user. properties: access_token: type: string token_type: type: string const: Bearer expires_in: type: integer kid: type: string user: type: string required: - access_token - token_type - expires_in - kid - user DeviceTokenError: type: object description: RFC 6749 §5.2. properties: error: type: string enum: - authorization_pending - slow_down - access_denied - expired_token - invalid_grant - invalid_request - unsupported_grant_type error_description: type: string required: - error DeviceTokenRequest: type: object properties: grant_type: type: string const: urn:ietf:params:oauth:grant-type:device_code device_code: type: string required: - device_code DeviceUserCode: type: object properties: user_code: type: string description: As typed; dashes, spaces and case do not matter. required: - user_code DiffResult: type: object properties: base_generation: type: integer minimum: 0 changes: type: array items: $ref: '#/components/schemas/Change' static_ignored: type: array items: type: string warnings: type: array items: $ref: '#/components/schemas/Warning' required: - base_generation - changes - static_ignored Duration: type: string pattern: ^[0-9]+(\.[0-9]+)?(ms|s|m|h|d)$ examples: - 250ms - 30s - 5m - 1d description: Duration. EffectivePrice: type: object description: One deployment's effective price; `price` and `price_version` are null when it has none. properties: deployment: type: string provider: type: string provider_type: type: string upstream_model: type: string price: type: - object - 'null' description: 'The merged price, field by field: money fields as decimal strings, plus `tiers` when present, and the `service_tiers` and `batch_multiplier` when set.' additionalProperties: true price_version: type: - string - 'null' description: Content hash of the effective price. required: - deployment - price - price_version EffectivePriceList: type: object properties: items: type: array items: $ref: '#/components/schemas/EffectivePrice' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor ErrorCode: type: string enum: - malformed_document - validation_failed - invalid_parameter - unauthenticated - forbidden - not_found - method_not_allowed - already_exists - resource_in_use - change_request_required - limit_reached - managed_by_apply - precondition_failed - payload_too_large - unsupported_media_type - idempotency_key_reused - rate_limited - internal - store_unavailable description: Admin error codes. Closed set within /admin/v1. GenerationList: type: object properties: items: type: array items: $ref: '#/components/schemas/GenerationSummary' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor GenerationSummary: type: object properties: generation: type: integer minimum: 1 created_at: $ref: '#/components/schemas/Timestamp' actor: type: object properties: type: type: string enum: - operator - token - system id: type: string source: type: string description: '`api`, `apply:` or `rollback`.' summary: type: string required: - generation - created_at - actor - source - summary GovernanceSettings: type: object description: '`governance` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Governance metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata GovernanceSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Governance required: - spec GuardrailCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Guardrail required: - name - spec GuardrailList: type: object properties: items: type: array items: $ref: '#/components/schemas/GuardrailResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor GuardrailReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Guardrail required: - spec GuardrailResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Guardrail metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata GuardrailRuntime: type: object description: A guardrail's statistics. `action` and `severity` are null for transforms. properties: name: type: string type: type: string action: type: - string - 'null' severity: type: - string - 'null' enabled: type: boolean evaluations_24h: type: integer minimum: 0 hits_24h: type: integer minimum: 0 hits_by_hour: type: array items: type: integer minimum: 0 maxItems: 24 blocks_24h: type: integer minimum: 0 redactions_24h: type: integer minimum: 0 flags_24h: type: integer minimum: 0 errors_24h: type: integer minimum: 0 p95_latency_ms: type: - number - 'null' false_positive_rate: type: - number - 'null' required: - name - type - enabled - evaluations_24h - hits_24h GuardrailRuntimeList: type: object properties: items: type: array items: $ref: '#/components/schemas/GuardrailRuntime' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor GuardrailSummary: type: object properties: items: type: array items: $ref: '#/components/schemas/GuardrailSummaryRow' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor GuardrailSummaryRow: type: object properties: group: type: object additionalProperties: type: - string - 'null' start: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' events: type: integer minimum: 0 related: type: integer minimum: 0 description: Events of the group whose fingerprint another event of the selection shares. matches: type: integer minimum: 0 description: The entity matches of the group's events; with `group_by=entity`, those of the group's entity. required: - group - events GuardrailTestRequest: oneOf: - type: object properties: stage: type: string enum: - input - output text: type: string required: - stage - text additionalProperties: false - type: object properties: stage: type: string enum: - input - output body: type: object description: A request (input) or response (output) body in a supported dialect. required: - stage - body additionalProperties: false GuardrailTestUnsavedRequest: type: object properties: name: type: string description: The name the rule would be saved under; the edited rule's name when editing one. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Guardrail input: oneOf: - type: object properties: stage: type: string enum: - input - output default: input text: type: string description: A user message (input) or an assistant answer (output). required: - text additionalProperties: false - type: object properties: stage: type: string enum: - input - output default: input body: type: object description: A request (input) or response (output) body in a supported dialect. required: - body additionalProperties: false required: - spec - input additionalProperties: false GuardrailTestResult: type: object properties: verdict: type: string examples: - block - redact - flag - pass category: type: - string - 'null' redacted: type: - string - object - 'null' description: The text or body after the guardrail. restored: type: - string - object - 'null' description: >- For a reversible guardrail at the input stage, `redacted` with its tokens put back: what the response gives back where the model repeats them. Null when the guardrail handed out no token. spans: type: array items: type: object properties: start: type: integer minimum: 0 description: Code-point offset in the segment. end: type: integer minimum: 0 entity: type: string description: The entity or label matched, in lower case (`phone`, `cpf`, `redacted`). replacement: type: - string - 'null' description: >- What replaces the match: its numbered token for a reversible guardrail at the input stage (`[PHONE_1]`), else the label, mask or hash of the redaction. Null when the guardrail does not replace matches (block, flag). required: - start - end - entity required: - verdict - spans GuardrailsSettings: type: object description: '`guardrails` singleton (owner). `guardrails` without `definitions` (served as the `/guardrails` collection).' properties: spec: allOf: - $ref: ../schema/antirion-config.schema.json#/$defs/Guardrails properties: definitions: false description: Without `definitions` (served as nested collections). metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata GuardrailsSettingsReplace: type: object properties: spec: allOf: - $ref: ../schema/antirion-config.schema.json#/$defs/Guardrails properties: definitions: false description: Without `definitions` (served as nested collections). required: - spec Health: type: object description: Exactly these keys. properties: status: type: string enum: - ok - degraded - draining draining: type: boolean dependencies: type: object description: Keyed by degraded-component name (`store`, `counters`, `session_store`, …). additionalProperties: type: object properties: status: type: string enum: - up - down since: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_error: type: - string - 'null' latency_ms: type: - number - 'null' required: - status - since - last_error - latency_ms admission: type: object properties: in_flight: type: integer minimum: 0 queued: type: integer minimum: 0 max_in_flight: type: integer minimum: 0 max_queue: type: integer minimum: 0 required: - in_flight - queued - max_in_flight - max_queue additionalProperties: false spool: type: object properties: bytes: type: integer minimum: 0 max_bytes: type: integer minimum: 0 records: type: integer minimum: 0 required: - bytes - max_bytes - records additionalProperties: false config: type: object properties: generation: type: integer minimum: 0 hash: type: string required: - generation - hash additionalProperties: false clock_skew_ms: type: - integer - 'null' required: - status - draining - dependencies - admission - spool - config - clock_skew_ms additionalProperties: false EncryptionReport: type: object description: Encryption in transit and at rest on the serving node. properties: inbound_tls: type: object properties: data: $ref: '#/components/schemas/ListenerTlsReport' admin: $ref: '#/components/schemas/ListenerTlsReport' reload_interval: $ref: '#/components/schemas/Duration' required: - data - admin - reload_interval at_rest: type: object properties: algorithm: const: AES-256-GCM keys: type: array description: The first key encrypts; every key decrypts. items: type: object properties: id: type: string description: The first 16 hex digits of the SHA-256 of the key, never the key. primary: type: boolean source: enum: - configured - data_dir description: '`security.secrets.encryption_keys` of the startup file, or the key generated into the data directory.' required: - id - primary - source external_stores: type: array description: The configured external secret stores and what reading them last did on the serving node; never a value. items: type: object properties: name: enum: - vault - aws_sm - gcp_sm - azure_kv references: type: integer minimum: 0 description: Distinct references of the serving configuration that name the store. state: enum: - ok - failing - unused description: '`failing` while a reference''s last read failed (its last value stays in use); `unused` without references.' last_refresh_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: The last successful read on the serving node. last_error: type: - string - 'null' description: Why the last read failed while the store is failing; never a value. required: - name - references - state - last_refresh_at - last_error required: - algorithm - keys - external_stores required: - inbound_tls - at_rest InvitationCheck: type: object description: What an invitation token is, without using it. properties: state: enum: - valid - expired - used - unknown description: '`unknown` also for a token a resend replaced or whose invitation was cancelled.' email: type: - string - 'null' description: The invited address; null unless `valid`. organization: oneOf: - type: object properties: name: type: string display_name: type: string required: - name - display_name - type: 'null' description: The organization of the invitation's first binding scoped to one; null unless `valid` or when no binding is. expires_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - state - email - organization - expires_at ListenerTlsReport: type: object properties: enabled: type: boolean versions: type: array description: The TLS versions the listener accepts. items: enum: - '1.2' - '1.3' client_auth: enum: - none - optional - required certificate: description: The leaf certificate in `cert_file` as last read; null without TLS or when it cannot be read. oneOf: - $ref: '#/components/schemas/CertificateReport' - type: 'null' required: - enabled - versions - client_auth - certificate CertificateReport: type: object properties: subject: type: - string - 'null' description: The subject's common name. issuer: type: - string - 'null' description: The issuer's common name. dns_names: type: array items: type: string not_before: $ref: '#/components/schemas/Timestamp' not_after: $ref: '#/components/schemas/Timestamp' sha256: type: string description: Hex SHA-256 of the certificate's DER. chain_length: type: integer minimum: 1 required: - subject - issuer - dns_names - not_before - not_after - sha256 - chain_length IngressPause: type: object description: '`duration` from 1s to 24h; a pause of a scope that is already paused replaces it.' properties: duration: $ref: '#/components/schemas/Duration' reason: type: string minLength: 1 maxLength: 500 organization: type: string required: - duration - reason IngressResume: type: object properties: organization: type: string IngressPauseState: type: object description: One pause that holds; `organization` null for the gateway-wide pause. properties: organization: type: - string - 'null' reason: type: string paused_by: type: string paused_at: $ref: '#/components/schemas/Timestamp' resumes_at: $ref: '#/components/schemas/Timestamp' required: - organization - reason - paused_by - paused_at - resumes_at IngressState: type: object properties: pauses: type: array items: $ref: '#/components/schemas/IngressPauseState' required: - pauses InvalidationRuleCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Cache/properties/invalidation_rules/additionalProperties required: - name - spec InvalidationRuleList: type: object properties: items: type: array items: $ref: '#/components/schemas/InvalidationRuleResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor InvalidationRuleReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Cache/properties/invalidation_rules/additionalProperties required: - spec InvalidationRuleResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Cache/properties/invalidation_rules/additionalProperties metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata InvalidationRuleStatus: type: object properties: name: type: string fires_24h: type: integer minimum: 0 last_fired_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_dropped: type: integer minimum: 0 required: - name - fires_24h InvalidationRuleStatusList: type: object properties: items: type: array items: $ref: '#/components/schemas/InvalidationRuleStatus' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor InvalidationRun: type: object properties: dropped: type: integer minimum: 0 required: - dropped Invitation: type: object properties: id: type: string user: type: string email: type: string invited_by: type: string created_at: $ref: '#/components/schemas/Timestamp' expires_at: $ref: '#/components/schemas/Timestamp' expired: type: boolean description: The link no longer works; the invitation stays listed until it is resent or cancelled. role_bindings: type: array items: $ref: '#/components/schemas/RoleBindingCreate' required: - id - user - email - invited_by - created_at - expires_at - expired InvitationAccept: type: object properties: token: type: string password: type: string required: - token InvitationCreate: type: object properties: email: type: string display_name: type: string role_bindings: type: array items: $ref: '#/components/schemas/RoleBindingCreate' required: - email InvitationCreated: allOf: - $ref: '#/components/schemas/Invitation' - type: object properties: link: type: - string - 'null' required: - link description: '`link` is set only when SMTP is disabled, and only in this response.' InvitationList: type: object properties: items: type: array items: $ref: '#/components/schemas/Invitation' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor Job: type: object properties: id: type: string kind: type: string state: enum: - queued - running - succeeded - failed progress: type: number minimum: 0 maximum: 1 created_at: $ref: '#/components/schemas/Timestamp' download_url: type: - string - 'null' expires_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' error: type: - string - 'null' required: - id - kind - state - created_at JobLease: type: object properties: name: type: string holder: type: string description: '`node_id` holding the lease.' expires_at: $ref: '#/components/schemas/Timestamp' required: - name - holder - expires_at JsonRpcMessage: type: object description: One JSON-RPC 2.0 message. properties: jsonrpc: type: string const: '2.0' id: type: - string - integer - 'null' method: type: string params: type: object result: {} error: type: object required: - jsonrpc KeyCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Key required: - name - spec KeyCreateRequest: allOf: - $ref: '#/components/schemas/KeyCreate' - type: object properties: import: $ref: '#/components/schemas/KeyImport' description: '`spec.project` defaults to `default`. Granting `spec.permissions` needs `keys:grant_permissions`.' KeyCreated: allOf: - $ref: '#/components/schemas/KeyResource' - type: object properties: secret: type: string description: Plaintext key, returned once (74 characters, `sk-antirion-` prefix). Absent for a key created with `import`, which has no generated secret. KeyHealth: type: object description: Never includes key secrets. properties: key: type: string scope_state: type: string enum: - alive - dead dead_reason: type: - string - 'null' recheck_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' pair_state: type: string enum: - alive - cooling - dead cooldown_until: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_success_at: description: When the key last answered an attempt with success on the answering node; null when it never has, so `alive` only means nothing has failed. oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - key - scope_state - pair_state KeyImport: type: object description: Legacy key import instead of a generated secret. properties: algorithm: type: string enum: - sha256 digest: type: string pattern: ^[0-9a-f]{64}$ required: - algorithm - digest KeyList: type: object properties: items: type: array items: $ref: '#/components/schemas/KeyResource' next_cursor: $ref: '#/components/schemas/NextCursor' counts: type: object description: Over the visible keys every filter but `type` and `status` selects, before pagination. properties: type: type: object additionalProperties: type: integer minimum: 0 status: type: object additionalProperties: type: integer minimum: 0 required: - items - next_cursor - counts KeyMetadata: allOf: - $ref: '#/components/schemas/ResourceMetadata' - type: object properties: type: enum: - user - service - ephemeral description: '`service` when its owner is a service account; else `ephemeral` when created by the playground or with a lifetime of at most 7 days; else `service` when it has no owner; else `user`.' status: enum: - active - disabled - rotating - expiring - expired description: The first that holds of disabled, expired, rotating (a grace is running), expiring (within 7 days), else active. organization: type: string team: type: string open_anomalies: type: integer minimum: 0 description: Open anomaly flags of the key. kid: type: string description: Key id. hint: type: string description: '`sk-antirion--…`.' examples: - sk-antirion-01J9Z8-…k3Qz created_by: type: string description: Principal that created the key. last_used_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' disabled_reason: type: - string - 'null' examples: - owner_deleted last_rotated_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' rotation_due: type: boolean rotation_due_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: When the key is due for rotation under its policy's `rotation_max_age`. rotation: oneOf: - type: object properties: previous_kid: type: string valid_until: $ref: '#/components/schemas/Timestamp' required: - previous_kid - valid_until - type: 'null' readOnly: true KeyReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Key required: - spec KeyResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Key metadata: $ref: '#/components/schemas/KeyMetadata' required: - name - spec - metadata KeyRotate: type: object properties: grace_period: allOf: - $ref: '#/components/schemas/Duration' default: 0s description: How long the previous secret stays valid; ≤ `7d`. KeyRotated: type: object properties: name: type: string kid: type: string hint: type: string secret: type: string description: The new plaintext secret, returned once. previous: type: - object - 'null' properties: kid: type: string valid_until: $ref: '#/components/schemas/Timestamp' required: - kid - valid_until required: - name - kid - hint - secret LatencyHistogram: type: object properties: bounds: type: array items: type: number counts: type: array items: type: integer minimum: 0 p50: type: number p95: type: number p99: type: number required: - bounds - counts LedgerLine: type: object description: Partition values are never included. properties: request_id: type: string line: type: integer minimum: 0 purpose: type: string shadow: type: boolean status: type: string enum: - success - failed - failed_with_usage - cancelled - expired - cache_hit - adjustment admitted_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' settled_at: $ref: '#/components/schemas/Timestamp' organization: type: string team: type: string project: type: string key: type: string user: type: - string - 'null' end_user: type: - string - 'null' tags: type: array items: type: string model: type: - string - 'null' route: type: - string - 'null' provider: type: - string - 'null' deployment: type: - string - 'null' upstream_model: type: - string - 'null' mcp_server: type: - string - 'null' description: The MCP server of a priced tool call. mcp_tool: type: - string - 'null' description: The tool of a priced MCP tool call. a2a_agent: type: - string - 'null' description: The agent of a priced A2A call. endpoint: type: - string - 'null' stream: type: - boolean - 'null' usage: type: object additionalProperties: true usage_raw: type: - object - 'null' usage_source: type: string enum: - upstream - estimated - cache cost_usd: $ref: '#/components/schemas/SignedMoney' description: Negative only on an `adjustment` line (a credit, or a re-costing that lowered the cost). billed_usd: $ref: '#/components/schemas/SignedMoney' service_tier: type: string description: The service tier the call was priced under, when the response or the request named one; absent otherwise. avoided_cost_usd: oneOf: - $ref: '#/components/schemas/Money' - type: 'null' description: What a `cache_hit` line saved, never charged; null on other lines. cost_status: type: string price_version: type: - string - 'null' reserved: type: object properties: in: type: integer out: type: integer usd: $ref: '#/components/schemas/Money' out_source: type: string enum: - request - catalog - default budgets: type: array items: type: object additionalProperties: true description: Budget counters charged. required: - request_id - line - purpose - status - settled_at - billed_usd additionalProperties: true LedgerLineList: type: object properties: items: type: array items: $ref: '#/components/schemas/LedgerLine' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor LimitCounter: type: object description: One limit counter. defines no body for this endpoint; see README "Choices made". properties: level: type: string enum: - gateway - organization - team - project - key - model - route - node - deployment owner: type: string name: type: string partition: type: - string - 'null' unit: type: string enum: - requests - tokens - concurrency algorithm: type: string enum: - gcra - sliding_window limit: type: integer minimum: 0 per: oneOf: - $ref: '#/components/schemas/Duration' - type: 'null' used: type: number minimum: 0 reserved: type: number minimum: 0 remaining: type: number minimum: 0 resets_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - level - owner - name - partition - unit - limit - remaining LimitCounterList: type: object properties: items: type: array items: $ref: '#/components/schemas/LimitCounter' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor LimitSimulation: type: object properties: key: type: string model: type: string input_tokens: type: integer minimum: 0 output_tokens: type: integer minimum: 0 count: type: integer minimum: 1 required: - key - model LimitSimulationResult: type: object description: Every limit and budget admission would reserve for such a request (gateway, organization, team, project, key, route and Model levels), read without changing any counter. properties: admitted: type: boolean description: Whether `count` such requests sent now would all be admitted by every enforced counter. count: type: integer minimum: 1 limits: type: array items: type: object properties: level: type: string owner: type: string name: type: string unit: enum: - requests - tokens - concurrency limit: type: integer minimum: 0 per_s: type: - integer - 'null' used: type: integer minimum: 0 remaining: type: integer minimum: 0 reset_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' enforced: type: boolean requested: type: integer minimum: 0 description: What `count` such requests would take of it. admitted: type: boolean required: - level - owner - name - unit - limit - remaining - requested - admitted budgets: type: array items: type: object properties: level: type: string owner: type: string name: type: string unit: enum: - usd - tokens mode: enum: - hard - soft amount: type: string spent: type: string reserved: type: string remaining: type: string period_start: $ref: '#/components/schemas/Timestamp' resets_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' requested: type: string admitted: type: boolean required: - level - owner - name - unit - amount - remaining - requested - admitted required: - admitted - count - limits - budgets LimitsSettings: type: object description: '`limits` singleton (owner). Settings only; limit declarations live in `policies.limits` blocks.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/LimitsSettings metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata LimitsSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/LimitsSettings required: - spec LocalLogin: type: object properties: email: type: string minLength: 3 password: type: string minLength: 1 organization: type: string required: - email - password LocalLoginStep: type: object description: Second step of a local sign-in. properties: next: enum: - mfa - enroll_mfa challenge: type: string required: - next - challenge LogExport: type: string description: CSV (RFC 4180) or NDJSON of the matching records. LoginOptions: type: object description: Public sign-in options. properties: methods: type: array items: type: object properties: type: enum: - oidc - oauth - saml - local - token id: type: string display_name: type: string required: - type - id password_reset: type: boolean organization: type: - string - 'null' version: type: - string - 'null' ticker: oneOf: - type: object properties: requests_24h: type: integer minimum: 0 error_rate: type: number p95_ms: type: number active_keys: type: integer minimum: 0 as_of: $ref: '#/components/schemas/Timestamp' - type: 'null' trusted_device: type: object description: Whether a sign-in may trust its device, and for how many whole days. properties: enabled: type: boolean max_age_days: type: - integer - 'null' minimum: 1 description: '`trusted_device.max_age` in whole days, at least 1; null when not enabled.' required: - enabled - max_age_days password: oneOf: - type: object properties: min_length: type: integer minimum: 8 max_length: type: integer minimum: 8 reset_ttl_seconds: type: - integer - 'null' minimum: 1 description: How long a reset link works; null when `password_reset` is false. required: - min_length - max_length - reset_ttl_seconds - type: 'null' description: The local password policy's lengths and the reset link's lifetime; null when local accounts are disabled. setup_required: type: boolean description: No enabled user exists yet, so only the bootstrap credential can authenticate. device_authorization: type: boolean description: The command line may sign in through the device authorization grant. required: - methods - password_reset - organization - version - ticker - trusted_device - password - setup_required - device_authorization LogList: type: object properties: items: type: array items: $ref: '#/components/schemas/LogRecord' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor LogRecord: type: object description: A request-log record, schema version 1. Every field is always present; nullable fields are `null` when not applicable. Within schema version 1 fields are only added, so clients ignore unknown fields. `GET /logs/schema` serves the same schema. properties: schema_version: type: integer description: '`1`' const: 1 id: type: string description: Log id (UUIDv7); equals `x-antirion-log-id` request_id: type: string description: Request id trace_id: type: string description: W3C trace id pattern: ^[0-9a-f]{32}$ span_id: type: string description: Root span id pattern: ^[0-9a-f]{16}$ node_id: type: string description: Node that served the request gateway_version: type: string description: Build version config_generation: type: integer description: Config generation the request ran on started_at: type: string description: '`t_start`' format: date-time ended_at: type: string description: '`t_end`' format: date-time method: type: string description: HTTP method endpoint: type: string description: Route template of the endpoint, e.g. `/v1/chat/completions`, `/v1beta/models/{model}:generateContent`; `_unknown` for unmatched paths. Never the raw path or query string operation: type: string description: '`operation`' dialect: type: string description: '`dialect`' stream: type: - object - 'null' description: 'Null when the client did not request streaming. Else `{end_reason, committed, relay_mode}`: `end_reason` is ''s stream end reason verbatim (`completed`, `client_disconnected`, `client_write_timeout`, …' client_ip: type: - string - 'null' description: Per `client_ip` setting, after trusted-proxy resolution user_agent: type: - string - 'null' description: ≤ 256 bytes client_retry_count: type: - integer - 'null' description: The client SDK's own retry count, from the request header `x-stainless-retry-count` (sent by the OpenAI and Anthropic SDKs) when it is a decimal integer 0–1000; null when absent or invalid. Never changes the request's handling organization: type: - string - 'null' description: Tenant names (null only for unauthenticated records) team: type: - string - 'null' description: Tenant names (null only for unauthenticated records) project: type: - string - 'null' description: Tenant names (null only for unauthenticated records) key: type: - string - 'null' description: Virtual key **id**. Never the secret, never its hash end_user: type: - string - 'null' tags: type: array items: type: string description: 'Effective tags: tenant, key and request tags' metadata: type: object additionalProperties: type: string metadata_dropped: type: integer session_id: type: - string - 'null' requested_model: type: - string - 'null' description: '`model` as sent by the client, truncated to 256 bytes' model: type: - string - 'null' description: Resolved public Model route: type: - string - 'null' description: Route name provider: type: - string - 'null' description: Of the final attempt deployment: type: - string - 'null' description: Of the final attempt upstream_model: type: - string - 'null' description: Of the final attempt response_model: type: - string - 'null' description: '`model` field the upstream reported in its response (may differ from `upstream_model`)' upstream_request_id: type: - string - 'null' description: Provider request id of the final attempt response_path: type: string status_code: type: integer description: Status sent to the client; `499` if the client disconnected before headers were sent code: type: - string - 'null' description: '`antirion.code` (null on success)' reason: type: - string - 'null' description: '`antirion.reason` when the error carried one; null otherwise' stage: type: - string - 'null' description: Lifecycle stage that produced the error (null on success) error_message: type: - string - 'null' description: Client-visible error message, scrubbed, ≤ 2048 bytes finish_reasons: type: array items: type: string description: Normalised finish reason per choice/candidate; empty if none stop_category: type: - string - 'null' description: Anthropic `stop_details.category` of the final response (for example the category of a `refusal` stop), when the upstream reported one; null otherwise client_disconnected: type: boolean description: Client closed before the response completed attempt_count: type: integer description: '`len(attempts)`' attempts: type: array items: $ref: '#/components/schemas/LogAttempt' description: In start order (below) skipped_candidates: type: array items: type: object description: '`{deployment, credential, reason}` per candidate skipped without an attempt, in the order skipped; `credential` is null unless a single key was skipped; `reason` is ''s skip reason (`ineligible`, `unauthorized`, …' translation_warnings: type: array items: type: string description: Every translation warning entry of the request 's `entry` grammar, request-side then response-side, including response-side entries found after a stream's headers were sent and entries beyond the header's 32-entry bound … params_applied: type: object description: '`{overrides: array, removed: array}`: the JSON Pointers of ''s `params.overrides` and `params.remove` entries applied to this request''s upstream body (final attempt), in application order. Empty lists …' cache: type: object description: '`{status, layer: exact|semantic|null, similarity: number|null, key: string|null, write: string|null, prefix: string|null}`: `status` is the value (`hit`, `miss`, `refresh`, `bypass`, `uncacheable`, `disabled`, `error`), or null when the request ended before …' admission: type: - object - 'null' description: 'Null when admitted. Else `{decision, limit}`: `decision` is the refusal''s `antirion.code` (`rate_limited`, `request_exceeds_limit`, `budget_exceeded`, `dependency_unavailable`, `overloaded`), `limit` the `antirion.limit` object of …' degraded: type: array items: type: object description: '`{component, cause}` per component that answered in a degraded or fail-open mode for this request. `component` is a name from the owners'' registries, exactly as listed in the single `x-antirion-degraded` header; …' guardrails: type: array items: type: object description: '`{name, stage: input|output, verdict, duration_ms, failed_open: bool, severity, confidence, score, spans}` per attached guardrail, `verdict` (including `skipped`); `score` and `spans` only with `logs:read_content`' extensions: type: array items: type: object description: '`{name, hook, action, duration_ms, failed_open: bool}` per extension hook run' usage: description: 'The usage record of under its field names, summed over the request''s attempts: `{input, input_cache_read, input_cache_write, input_cache_write_1h, input_audio, input_image, input_video, output, output_reasoning, …' $ref: '#/components/schemas/LogUsage' cost: type: object description: '`{currency: "USD", total, input, cache_read, cache_write, output, reasoning, audio, image, video, unit, status}`, `saved` on a cache hit, and `auxiliary` when the gateway made calls on the request''s behalf (semantic cache embeddings, routing classifiers and scorers): `total` is the request''s billed cost including `auxiliary` (equal to the sum of its charged ledger lines, shadow copies excepted, and to `x-antirion-cost` plus `auxiliary`), …' timing: type: object description: '`{total_ms, overhead_ms, upstream_ms, wait_ms, external_ms, ttft_ms, upstream_ttft_ms, tpot_ms, ttfb_overhead_ms, relay_ms, stage_ms}`; streaming-only fields null otherwise; `stage_ms` is an object stage→ms …' request_headers: type: object additionalProperties: type: string description: Allow-listed request headers; credential headers `"[REDACTED]"` response_headers: type: object additionalProperties: type: string description: Allow-listed response headers content: type: - object - 'null' description: 'Null unless content logging applied. Else `{request: Body, response: Body|null}`. An embeddings response is logged without its vectors: `data` becomes `{vectors, dimensions, encoding_format, omitted: true}`' mcp: type: - object - 'null' description: '`{server, method, tool, session_id, jsonrpc_error_code}`' a2a: type: - object - 'null' description: '`{agent, method, task_id}`' feedback: type: array items: type: object properties: id: type: string description: UUIDv7 returned by `POST /v1/feedback`. metric: type: string value: description: The submitted value (boolean, number or string, per the metric's type). created_at: type: string format: date-time required: - id - metric - value - created_at additionalProperties: false description: Feedback attached through `POST /v1/feedback`, oldest first; returned by `GET /logs/{id}`, not part of the stored record. tool_call_count: type: - integer - 'null' minimum: 0 query: type: - object - 'null' additionalProperties: type: string client_geo: oneOf: - type: object properties: country: type: - string - 'null' region: type: - string - 'null' city: type: - string - 'null' - type: 'null' replay_of: type: - string - 'null' route_path: type: - string - 'null' description: The route path of the served position, or of the block node that answered. route_rules: type: array description: The conditional rules the served position was reached through, outermost first. items: type: object properties: node: type: string index: type: integer minimum: 0 name: type: - string - 'null' required: - node - index - name budget_downgrade: oneOf: - type: object properties: budget: type: string from: type: string to: type: string - type: 'null' required: - schema_version - id - request_id - trace_id - span_id - node_id - gateway_version - config_generation - started_at - ended_at - method - endpoint - operation - dialect - stream - client_ip - user_agent - client_retry_count - organization - team - project - key - end_user - tags - metadata - metadata_dropped - session_id - requested_model - model - route - provider - deployment - upstream_model - response_model - upstream_request_id - response_path - status_code - code - reason - stage - error_message - finish_reasons - stop_category - client_disconnected - attempt_count - attempts - skipped_candidates - translation_warnings - params_applied - cache - admission - degraded - guardrails - extensions - usage - cost - timing - request_headers - response_headers - content - mcp - a2a additionalProperties: true examples: - schema_version: 1 id: 01926f5e-7c1a-7b3e-9d2a-3f4b5c6d7e8f request_id: req-42 trace_id: 4bf92f3577b34da6a3ce929d0e0e4736 span_id: 00f067aa0ba902b7 node_id: gw-1 gateway_version: 0.1.0 config_generation: 17 started_at: '2026-09-30T12:00:00.000100Z' ended_at: '2026-09-30T12:00:00.412300Z' method: POST endpoint: /v1/chat/completions operation: chat_completions dialect: openai stream: client_ip: 10.0.0.7 user_agent: openai-python/1.99.0 client_retry_count: 0 organization: acme team: search project: ranker key: key_01J9Z8 end_user: tags: - prod metadata: environment: prod metadata_dropped: 0 session_id: requested_model: fast model: fast route: fast provider: openai_main deployment: openai_main_gpt4o_mini upstream_model: gpt-4o-mini response_model: gpt-4o-mini-2024-07-18 upstream_request_id: req_abc123 response_path: upstream status_code: 200 code: reason: stage: error_message: finish_reasons: - stop stop_category: client_disconnected: false attempt_count: 2 skipped_candidates: [] translation_warnings: [] params_applied: overrides: [] removed: [] attempts: - index: 0 reason: primary provider: openai_main deployment: openai_main_gpt4o_mini upstream_model: gpt-4o-mini credential: k1 started_at: '2026-09-30T12:00:00.000400Z' duration_ms: 101.2 ttft_ms: status_code: 500 outcome: upstream_5xx failure_class: server_error retry_after_ms: upstream_request_id: req_abc122 error_message: The server had an error processing your request. error_body: usage: key_rotated: false - index: 1 reason: retry provider: openai_main deployment: openai_main_gpt4o_mini upstream_model: gpt-4o-mini credential: k1 started_at: '2026-09-30T12:00:00.301800Z' duration_ms: 110.0 ttft_ms: status_code: 200 outcome: success failure_class: retry_after_ms: upstream_request_id: req_abc123 error_message: error_body: usage: input: 25 input_cache_read: 0 input_cache_write: 0 input_cache_write_1h: 0 input_audio: 0 input_image: 0 input_video: 0 output: 12 output_reasoning: 0 output_audio: 0 output_image: 0 total: 37 units: key_rotated: false cache: status: miss layer: similarity: key: 9f2c1e0b7d4a6f38c5e2b1a0d9f8e7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0 admission: degraded: [] guardrails: [] extensions: [] usage: input: 25 input_cache_read: 0 input_cache_write: 0 input_cache_write_1h: 0 input_audio: 0 input_image: 0 input_video: 0 output: 12 output_reasoning: 0 output_audio: 0 output_image: 0 total: 37 units: source: upstream cost: currency: USD total: '0.00001095' input: '0.00000375' cache_read: '0' cache_write: '0' output: '0.0000072' reasoning: '0' audio: '0' image: '0' video: '0' unit: '0' status: exact timing: total_ms: 412.2 overhead_ms: 1.0 upstream_ms: 211.2 wait_ms: 200.0 external_ms: 0.0 ttft_ms: upstream_ttft_ms: tpot_ms: ttfb_overhead_ms: relay_ms: stage_ms: request_headers: {} response_headers: {} content: mcp: a2a: LogAttempt: type: object description: One upstream attempt of a request-log record. properties: index: type: integer description: 0-based, in start order reason: type: string description: '`primary`, `retry`, `fallback`, `hedge`' provider: type: string description: Target of this attempt deployment: type: string description: Target of this attempt upstream_model: type: string description: Target of this attempt credential: type: - string - 'null' description: Name of the provider credential entry used (05 multi-key); never the secret started_at: type: string description: '`a.start`' format: date-time duration_ms: type: number description: '`a.end − a.start`' ttft_ms: type: - number - 'null' description: 'Streaming: `a.start` → first content chunk' status_code: type: - integer - 'null' description: Upstream status; null if no response head was received outcome: type: string description: '`outcome`' failure_class: type: - string - 'null' description: classifier value; null on success retry_after_ms: type: - integer - 'null' description: Upstream `Retry-After` (or provider reset header) converted to ms upstream_request_id: type: - string - 'null' description: Provider request id header of this attempt error_message: type: - string - 'null' description: Scrubbed upstream or transport error message, ≤ 2048 bytes error_body: type: - string - 'null' description: Only with `log_upstream_error_bodies`; ≤ `upstream_error_body_max`; scrubbed usage: anyOf: - $ref: '#/components/schemas/LogUsage' - type: 'null' description: Same shape as top-level `usage` without `source`, for this attempt, when it reported usage key_rotated: type: boolean description: This attempt's failure caused a credential rotation required: - index - reason - provider - deployment - upstream_model - credential - started_at - duration_ms - ttft_ms - status_code - outcome - failure_class - retry_after_ms - upstream_request_id - error_message - error_body - usage - key_rotated additionalProperties: true LogUsage: type: object description: The usage record of Token fields are integers, `0` for a subset the provider did not report, null when `source` is `none`; attempts carry no `source`. properties: input: type: - integer - 'null' minimum: 0 input_cache_read: type: - integer - 'null' minimum: 0 input_cache_write: type: - integer - 'null' minimum: 0 input_cache_write_1h: type: - integer - 'null' minimum: 0 input_audio: type: - integer - 'null' minimum: 0 input_image: type: - integer - 'null' minimum: 0 input_video: type: - integer - 'null' minimum: 0 output: type: - integer - 'null' minimum: 0 output_reasoning: type: - integer - 'null' minimum: 0 output_audio: type: - integer - 'null' minimum: 0 output_image: type: - integer - 'null' minimum: 0 total: type: - integer - 'null' minimum: 0 units: type: - object - 'null' properties: images: type: - number - 'null' audio_seconds_in: type: - number - 'null' characters_in: type: - number - 'null' pages: type: - number - 'null' web_searches: type: - number - 'null' source: enum: - upstream - estimated - cache - none required: - input - input_cache_read - input_cache_write - input_cache_write_1h - input_audio - input_image - input_video - output - output_reasoning - output_audio - output_image - total - units additionalProperties: true LogView: type: object properties: id: type: string name: type: string filters: type: object sort: type: string columns: type: array items: type: string starred: type: boolean description: The caller's own mark; each principal that can see the view has its own. shared: type: boolean organization: type: - string - 'null' created_by: type: string updated_at: $ref: '#/components/schemas/Timestamp' required: - id - name - filters - starred - shared - created_by LogViewCreate: type: object properties: name: type: string minLength: 1 maxLength: 100 filters: type: object sort: type: string columns: type: array items: type: string starred: type: boolean shared: type: boolean required: - name - filters LogViewUpdate: type: object description: The members of a saved view to change; any subset of the members of `LogViewCreate`. additionalProperties: false properties: name: type: string minLength: 1 maxLength: 100 filters: type: object sort: type: string columns: type: array items: type: string starred: type: boolean shared: type: boolean LogViewList: type: object properties: items: type: array items: $ref: '#/components/schemas/LogView' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor ManagedBy: type: string pattern: ^(api|apply:[A-Za-z0-9][A-Za-z0-9._-]{0,127})$ description: '`api` or `apply:`.' McpGatewayCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Mcp/properties/gateways/additionalProperties required: - name - spec McpGatewayList: type: object properties: items: type: array items: $ref: '#/components/schemas/McpGatewayResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor McpGatewayReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Mcp/properties/gateways/additionalProperties required: - spec McpGatewayResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Mcp/properties/gateways/additionalProperties metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata McpServerCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/McpServer required: - name - spec McpServerList: type: object properties: items: type: array items: $ref: '#/components/schemas/McpServerResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor McpServerReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/McpServer required: - spec McpServerResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/McpServer metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata McpServerStatus: type: object properties: era_capability: type: string last_discovery_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_error: type: - string - 'null' cached_tools: type: integer minimum: 0 processes: description: A `stdio` server's process pool on the serving node; null for other transports. oneOf: - type: object properties: size: type: integer minimum: 1 running: type: integer minimum: 0 started: type: integer minimum: 0 description: Processes started since the pool was created, restarts included. required: - size - running - started - type: 'null' tools: description: The tools the gateway saw in the server's last list on the serving node, by name, with their SHA-256 (JCS) fingerprint and approval state; empty until a list was read. type: array items: type: object properties: name: type: string fingerprint: type: string pattern: ^[0-9a-f]{64}$ approved: type: - boolean - 'null' description: Whether the fingerprint is the one last approved; null while no approval was ever recorded for the server. hidden: type: boolean description: Hidden from lists and calls now (`pin_tool_definitions` on and not approved). required: - name - fingerprint - approved - hidden approved_at: description: When the server's tools were last approved (`:approve_tools`); null if never. oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_contact_at: description: When the serving node last tried to initialize the server or read its tools; null if it never did. oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_contact_error: description: Why that attempt failed, in words; null when it succeeded or there was none. Unlike `last_error` (the modern era's `server/discover`), it tells whether the server can be reached. type: - string - 'null' required: - era_capability - last_discovery_at - last_error - cached_tools - tools - approved_at - last_contact_at - last_contact_error McpToolApproval: type: object description: Tool fingerprints approved for one MCP server. properties: server: type: string approved_at: $ref: '#/components/schemas/Timestamp' tools: type: array items: type: object properties: name: type: string fingerprint: type: string pattern: ^[0-9a-f]{64}$ required: - name - fingerprint required: - server - approved_at - tools McpSessionStats: type: object description: Sessions are stateless encrypted tokens, so this reports per-gateway session state; see README "Choices made". properties: gateway: type: string session_mode: type: string enum: - stateful - stateless issued: type: integer minimum: 0 rejected: type: integer minimum: 0 revoked: type: integer minimum: 0 description: Current size of the revocation set. key_ids: type: array items: type: string description: Ids of the session keys that decrypt (first encrypts); never key material. required: - gateway - session_mode - issued - rejected - revoked - key_ids McpSessionStatsList: type: object properties: items: type: array items: $ref: '#/components/schemas/McpSessionStats' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor McpSettings: type: object description: '`mcp` singleton (owner). `mcp` without `servers` and `gateways` (served as `/mcp/servers` and `/mcp/gateways`).' properties: spec: allOf: - $ref: ../schema/antirion-config.schema.json#/$defs/Mcp properties: servers: false gateways: false description: Without `servers`, `gateways` (served as nested collections). metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata McpSettingsReplace: type: object properties: spec: allOf: - $ref: ../schema/antirion-config.schema.json#/$defs/Mcp properties: servers: false gateways: false description: Without `servers`, `gateways` (served as nested collections). required: - spec Me: type: object properties: principal: type: object properties: type: type: string enum: - user - token - bootstrap id: type: string kind: type: string enum: - human - service authenticated_by: type: string enum: - bearer - session required: - type - id bindings: type: array items: $ref: '#/components/schemas/RoleBinding' permissions: type: object description: Effective permissions per scope (`gateway`, `organization/`, …). additionalProperties: type: array items: type: string session: type: - object - 'null' properties: idle_expires_at: $ref: '#/components/schemas/Timestamp' expires_at: $ref: '#/components/schemas/Timestamp' user: oneOf: - type: object properties: name: type: string display_name: type: - string - 'null' email: type: - string - 'null' title: type: - string - 'null' primary_team: type: - string - 'null' mfa_methods: type: array items: type: string required: - name - type: 'null' description: The signed-in user. token_policy: type: object description: The lifetimes a personal admin token may have (`auth.admin.personal_tokens`), so a client offers only what `POST /auth/me/tokens` accepts. properties: max_lifetime: $ref: '#/components/schemas/Duration' description: The longest lifetime; `expires_at` must be within it of now. default_lifetime: description: The lifetime to offer by default; `null` when the gateway sets none and the client chooses one within `max_lifetime`. oneOf: - $ref: '#/components/schemas/Duration' - type: 'null' required: - max_lifetime - default_lifetime required: - principal - bindings - permissions MergePatch: type: object description: Body of every PATCH. `name` and `metadata` members are ignored. properties: spec: type: object description: 'RFC 7396 merge patch applied to the resource `spec`: an absent member is unchanged, `null` removes the field and restores its default or inheritance.' required: - spec MeUpdate: type: object properties: display_name: type: string maxLength: 200 title: type: string maxLength: 100 email: type: string description: A local user's new email takes effect only once the link mailed to it is followed; any other user's at once. email_token: type: string minLength: 1 description: The token of the link mailed to a new email; the change it confirms takes effect. An unknown, used or expired token, or one another user requested, answers 400 `invalid_parameter`. PasswordResetCheck: type: object description: What a password-reset token is, without using it; it names no account. properties: state: enum: - valid - expired - used - unknown expires_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: When the link stops working; null unless `valid`. required: - state - expires_at ProviderPressure: type: object description: Upstream rate-limit pressure per provider. A utilization is the summed peak use (`limit − remaining`) of the provider's credentials over their summed limits in the bucket; null when no reading with both a limit and a remaining count fell in it. properties: from: $ref: '#/components/schemas/Timestamp' to: $ref: '#/components/schemas/Timestamp' interval: type: - string - 'null' description: The interval asked for; null gives one bucket from `from` to `to`. threshold: type: number description: The share of a quota at which a provider counts as hot (0.8). items: type: array description: One entry per provider with a reading in the range, by name. items: type: object properties: provider: type: string buckets: type: array items: type: object properties: start: $ref: '#/components/schemas/Timestamp' rpm_utilization: type: - number - 'null' minimum: 0 tpm_utilization: type: - number - 'null' minimum: 0 requests_limit: type: - integer - 'null' minimum: 0 tokens_limit: type: - integer - 'null' minimum: 0 required: - start - rpm_utilization - tpm_utilization - requests_limit - tokens_limit required: - provider - buckets hot: type: array description: Per bucket, the providers whose request or token utilization reached `threshold`. items: type: object properties: start: $ref: '#/components/schemas/Timestamp' providers: type: integer minimum: 0 required: - start - providers required: - from - to - interval - threshold - items - hot SamlProviderStatus: type: object description: A SAML provider's status; never a key. properties: name: type: string display_name: type: string sp_entity_id: type: string acs_url: type: string sp_metadata_url: type: string login_url: type: string name_id_format: type: string description: The NameID format URN the requests ask for. allow_idp_initiated: type: boolean idp: type: object properties: source: enum: - metadata_url - metadata - fields metadata_url: type: - string - 'null' metadata_refresh: oneOf: - $ref: '#/components/schemas/Duration' - type: 'null' entity_id: type: - string - 'null' description: Null until metadata was fetched. sso_url: type: - string - 'null' certificates: type: array items: type: object properties: subject: type: - string - 'null' description: The subject's common name. not_after: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' sha256: type: string description: Lowercase hex SHA-256 of the DER certificate. required: - subject - not_after - sha256 last_sync_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: When the stored metadata was fetched. last_attempt_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_error: type: - string - 'null' description: Why the last fetch failed, while the stored copy stays in use. required: - source - metadata_url - metadata_refresh - entity_id - sso_url - certificates - last_sync_at - last_attempt_at - last_error required: - name - display_name - sp_entity_id - acs_url - sp_metadata_url - login_url - name_id_format - allow_idp_initiated - idp SsoFailureCode: type: string description: 'The `error` a failed sign-in redirects with. `sso_state_invalid`: the sign-in is unknown, used, expired or was started by another browser, or the assertion was used already. `sso_denied`: the identity provider or the gateway refused this user. `sso_response_invalid`: what the identity provider sent does not verify or cannot be read. `sso_provider_error`: the identity provider could not be reached or answered with an error. `sso_provider_unknown`: no such identity provider. `sso_rate_limited`: too many attempts. `sso_error`: the gateway failed.' enum: - sso_state_invalid - sso_denied - sso_response_invalid - sso_provider_error - sso_provider_unknown - sso_rate_limited - sso_error SsoTestResult: type: object description: What a test sign-in found; secrets and the raw tokens removed. properties: claims: type: object matched_role_mappings: type: array items: type: object resulting_bindings: type: array items: type: object allowed: type: boolean reason: type: - string - 'null' required: - claims - matched_role_mappings - resulting_bindings - allowed - reason MfaEnrollStart: type: object description: The sign-in challenge of a first enrolment, when the call carries no credential. properties: challenge: type: string MfaConfirm: type: object properties: factor_id: type: string totp: type: string webauthn: type: object name: type: string challenge: type: string required: - factor_id MfaEnrollment: type: object description: 'Shown once: TOTP secret and URI, or WebAuthn creation options.' properties: factor_id: type: string secret: type: string otpauth_uri: type: string webauthn_options: type: object required: - factor_id MfaFactor: type: object properties: id: type: string type: enum: - totp - webauthn name: type: string created_at: $ref: '#/components/schemas/Timestamp' last_used_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - id - type - created_at MfaFactorList: type: object properties: items: type: array items: $ref: '#/components/schemas/MfaFactor' recovery_codes_remaining: type: integer minimum: 0 required: - items - recovery_codes_remaining MfaVerify: type: object properties: challenge: type: string totp: type: string pattern: ^[0-9]{6}$ webauthn: type: object recovery_code: type: string trust_device: type: boolean required: - challenge oneOf: - required: - totp - required: - webauthn - required: - recovery_code ModelCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Model required: - name - spec ModelList: type: object properties: items: type: array items: $ref: '#/components/schemas/ModelResource' next_cursor: $ref: '#/components/schemas/NextCursor' counts: type: object description: Over every Model the filters select, before pagination. properties: lifecycle: type: object properties: preview: type: integer minimum: 0 ga: type: integer minimum: 0 restricted: type: integer minimum: 0 deprecated: type: integer minimum: 0 retired: type: integer minimum: 0 enabled: type: integer minimum: 0 disabled: type: integer minimum: 0 required: - items - next_cursor - counts ModelReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Model required: - spec ModelResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Model metadata: allOf: - $ref: '#/components/schemas/ResourceMetadata' - type: object properties: lifecycle: type: object description: The state a reader sees and when the Model entered its configured state. properties: state: enum: - preview - ga - restricted - deprecated - retired since: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - state - since required: - name - spec - metadata Money: type: string pattern: ^[0-9]+(\.[0-9]{1,12})?$ examples: - '12.50' - '0.000125' description: Non-negative decimal USD amount as a string. Name: type: string pattern: ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ description: Generic resource name. Some resources use another pattern. NextCursor: type: - string - 'null' description: Opaque cursor for the next page; `null` on the last page. Node: type: object properties: node_id: type: string version: type: string config_version: type: integer minimum: 0 ready: type: boolean draining: type: boolean degraded: type: array items: type: string last_seen: $ref: '#/components/schemas/Timestamp' required: - node_id - version - config_version - ready - draining - degraded - last_seen NodeList: type: object properties: items: type: array items: $ref: '#/components/schemas/Node' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor NotificationSend: type: object properties: to: type: object properties: users: type: array items: type: string team: type: string subject: type: string maxLength: 200 message: type: string maxLength: 5000 link: type: string required: - to - subject - message NotificationSent: type: object properties: recipients: type: integer minimum: 0 required: - recipients ObservabilitySettings: type: object description: '`observability` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata ObservabilitySettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Observability required: - spec OffboardRequest: type: object properties: keys: enum: - disable - delete - transfer transfer_to: type: string reason: type: string maxLength: 500 required: - keys OffboardResult: type: object properties: user: type: string keys: type: array items: type: object properties: name: type: string action: enum: - disabled - deleted - transferred required: - name - action sessions_revoked: type: integer minimum: 0 tokens_deleted: type: integer minimum: 0 required: - user - keys - sessions_revoked - tokens_deleted OrganizationCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Organization required: - name - spec OrganizationDeletion: type: object properties: organization: type: string delete_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' state: enum: - scheduled - cancelled required: - organization - delete_at - state OrganizationList: type: object properties: items: type: array items: $ref: '#/components/schemas/OrganizationResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor OrganizationReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Organization required: - spec OrganizationResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Organization metadata: allOf: - $ref: '#/components/schemas/ResourceMetadata' - type: object properties: deletion: type: object description: On a read of one organization, its deletion while one is scheduled or after it failed; absent otherwise. properties: state: enum: - scheduled - failed delete_at: $ref: '#/components/schemas/Timestamp' scheduled_by: type: string error: type: - string - 'null' required: - state - delete_at - scheduled_by - error required: - name - spec - metadata OverageGrant: type: object description: ': `amount` in the budget''s unit, more than zero; `expires_at` after now and no later than the end of the period.' properties: amount: type: string expires_at: $ref: '#/components/schemas/Timestamp' reason: type: string maxLength: 500 partition: type: string description: The partition of a partitioned budget, as `GET /runtime/budgets` names it. required: - amount - expires_at - reason OverageApproval: type: object description: An approval's grant; the reason is optional. properties: amount: type: string expires_at: $ref: '#/components/schemas/Timestamp' reason: type: string maxLength: 500 required: - amount - expires_at OverageRequest: type: object properties: id: type: string level: type: string owner: type: string name: type: string budget_owner: type: - string - 'null' opened_at: $ref: '#/components/schemas/Timestamp' spent: type: string amount: type: string state: enum: - open - approved - denied - expired period_start: $ref: '#/components/schemas/Timestamp' expires_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: The end of the period, when an open request expires. decided_by: type: - string - 'null' decided_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' reason: type: - string - 'null' grant_id: type: - string - 'null' required: - id - level - owner - name - opened_at - state OverageRequestList: type: object properties: items: type: array items: $ref: '#/components/schemas/OverageRequest' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor PasswordResetConfirm: type: object properties: token: type: string new_password: type: string required: - token - new_password PasswordResetRequest: type: object properties: email: type: string minLength: 3 required: - email PushOverview: type: object properties: public_key: type: string description: The VAPID public key, the uncompressed P-256 point, base64url without padding. subscriptions: type: array items: $ref: '#/components/schemas/PushSubscription' required: - public_key - subscriptions PushSubscriptionList: type: object properties: items: type: array items: $ref: '#/components/schemas/PushSubscription' required: - items PushSubscription: type: object description: A browser that receives the user's push notifications; its endpoint and keys are never shown. properties: id: type: string origin: type: string description: The push service's origin. device: type: - string - 'null' created_at: $ref: '#/components/schemas/Timestamp' last_success_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_error: type: - string - 'null' required: - id - origin - created_at PushSubscriptionCreate: type: object description: A browser's `PushSubscription.toJSON`, with an optional device name. properties: endpoint: type: string description: The push service URL, https. expirationTime: type: - number - 'null' keys: type: object properties: p256dh: type: string description: The browser's uncompressed P-256 public key, base64url. auth: type: string description: The 16-byte auth secret, base64url. required: - p256dh - auth device: type: string maxLength: 100 required: - endpoint - keys additionalProperties: false PushTestResult: type: object properties: results: type: array items: type: object properties: id: type: string origin: type: string ok: type: boolean status: type: - integer - 'null' error: type: - string - 'null' removed: type: boolean required: - id - origin - ok required: - results PersonalToken: type: object properties: kid: type: string description: type: string access: enum: - full - read_only created_at: $ref: '#/components/schemas/Timestamp' expires_at: $ref: '#/components/schemas/Timestamp' last_used_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - kid - access - created_at - expires_at PersonalTokenCreate: type: object properties: description: type: string maxLength: 500 expires_at: $ref: '#/components/schemas/Timestamp' access: enum: - full - read_only default: full required: - expires_at PersonalTokenCreated: allOf: - $ref: '#/components/schemas/PersonalToken' - type: object properties: token: type: string required: - token description: The token is returned once. PersonalTokenList: type: object properties: items: type: array items: $ref: '#/components/schemas/PersonalToken' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor PlaygroundResult: type: object description: The data-plane answer. properties: status: type: integer minimum: 0 headers: type: object additionalProperties: type: string body: {} events: type: array items: type: object log_id: type: - string - 'null' key: type: string required: - status - headers - log_id - key PlaygroundSend: type: object properties: project: type: string endpoint: enum: - chat_completions - responses - messages - embeddings body: type: object stream: type: boolean required: - project - endpoint - body PluginCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Plugin required: - name - spec PluginList: type: object properties: items: type: array items: $ref: '#/components/schemas/PluginResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor PluginReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Plugin required: - spec PluginResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Plugin metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata PluginRuntime: type: object description: Counters of the answering node. properties: name: type: string calls: type: integer minimum: 0 failures: type: integer minimum: 0 timeouts: type: integer minimum: 0 p50_ms: type: - number - 'null' p99_ms: type: - number - 'null' last_error: type: - string - 'null' required: - name - calls - failures - timeouts - p50_ms - p99_ms - last_error PluginRuntimeList: type: object properties: items: type: array items: $ref: '#/components/schemas/PluginRuntime' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor PoliciesSettings: type: object description: '`policies` singleton (owner). The gateway-level `policies` block; members are owned by their resources.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/PoliciesGateway metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata PoliciesSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/PoliciesGateway required: - spec Preferences: type: object description: Per-user preferences, at most 16 KiB. properties: theme: enum: - light - dark - system accent: type: string density: enum: - compact - comfortable sidebar_collapsed: type: boolean reduced_motion: type: boolean compact_numbers: type: boolean week_start: enum: - monday - sunday timezone: type: string locale: type: string default_organization: type: string time_range: type: string notifications: type: object ui: type: object additionalProperties: false PricingSettings: type: object description: '`pricing` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Pricing metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata PricingSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Pricing required: - spec Principal: type: object properties: type: type: string enum: - user - token id: type: string description: User name or admin token kid. required: - type - id ProjectCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Project required: - name - spec ProjectList: type: object properties: items: type: array items: $ref: '#/components/schemas/ProjectResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor ProjectReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Project required: - spec ProjectResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Project metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata ProviderCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Provider required: - name - spec ProviderList: type: object properties: items: type: array items: $ref: '#/components/schemas/ProviderResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor ProviderReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Provider required: - spec ProviderResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Provider metadata: allOf: - $ref: '#/components/schemas/ResourceMetadata' - type: object properties: credential_rotated_at: type: object description: When each credential was last set, by name (`default` for `auth.api_key`, a key's name, or the secret member of `auth`). additionalProperties: $ref: '#/components/schemas/Timestamp' rotation_due: type: boolean description: Some credential is older than `credential_rotation_max_age`. retires_at: type: object description: On a rotation's answer, when the standby key is removed, by its name. additionalProperties: $ref: '#/components/schemas/Timestamp' required: - name - spec - metadata ProviderModel: type: object description: A model of a provider. Prices are decimal strings in USD per million tokens. properties: id: type: string name: type: - string - 'null' listed_by_provider: type: boolean description: The provider's own model list has it; `false` for a model the catalog knows. context_window: type: - integer - 'null' max_output_tokens: type: - integer - 'null' modalities: oneOf: - type: object properties: input: type: array items: type: string output: type: array items: type: string required: - input - output - type: 'null' price: oneOf: - type: object properties: input: type: string output: type: string cache_read: type: - string - 'null' cache_write: type: - string - 'null' required: - input - output - cache_read - cache_write - type: 'null' price_source: oneOf: - enum: - catalog - type: 'null' release_date: type: - string - 'null' required: - id - name - listed_by_provider - context_window - max_output_tokens - modalities - price - price_source - release_date ProviderModelList: type: object properties: items: type: array items: $ref: '#/components/schemas/ProviderModel' source: enum: - provider - catalog fetched_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: When the provider's list was fetched; `null` for the catalog's. error: type: - string - 'null' description: Why the provider's list could not be read, when a listing call failed. required: - items - source - fetched_at - error ProviderTestResult: type: object description: A provider credential test. properties: ok: type: boolean method: enum: - list_models - minimal_call status_code: type: - integer - 'null' description: The provider's last status; `null` when it did not answer. latency_ms: type: number error: type: - string - 'null' description: Why the test failed, scrubbed of the provider's secrets. models: oneOf: - type: array items: $ref: '#/components/schemas/ProviderModel' - type: 'null' description: The provider's models, when listing them worked. tested_at: $ref: '#/components/schemas/Timestamp' upstream_request_id: type: - string - 'null' required: - ok - method - status_code - latency_ms - error - models - tested_at ProviderKeyTest: type: object description: The latest credential test of one key on this node. properties: key: type: - string - 'null' description: The key's name (`default` for `auth.api_key`); `null` for a method without named keys. ok: type: boolean method: enum: - list_models - minimal_call tested_at: $ref: '#/components/schemas/Timestamp' error: type: - string - 'null' required: - key - ok - method - tested_at - error ProviderStatus: type: object properties: name: type: string type: type: string credential: type: object properties: method: type: string examples: - api_key - aws - gcp - azure_ad source: type: string examples: - service_account_json - adc - metadata - static - env_chain state: type: string enum: - valid - refreshing - failed - dead - none expires_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' refresh_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_error: type: - string - 'null' description: Scrubbed; never the secret. The latest test's error when it failed. last_test: $ref: '#/components/schemas/ProviderKeyTest' description: The latest credential test on this node, of any key. A failed test sets `state` to `failed`; a test that worked sets it to `valid` unless the access token's own state says otherwise. required: - method - state tests: type: array description: The latest credential test of each key on this node. items: $ref: '#/components/schemas/ProviderKeyTest' credentials: type: array description: The last rate-limit reading of each credential that reported one; `rate_limits` is the most recent of them. items: type: object properties: name: type: string rate_limits: type: object required: - name - rate_limits tls_verify: type: boolean description: '`false` when `tls.verify: false`.' account_tier: type: - string - 'null' rate_limits: oneOf: - type: object properties: requests: type: object properties: limit: type: - integer - 'null' remaining: type: - integer - 'null' reset_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' tokens: type: object properties: limit: type: - integer - 'null' remaining: type: - integer - 'null' reset_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' input_tokens: type: object properties: limit: type: - integer - 'null' remaining: type: - integer - 'null' reset_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' output_tokens: type: object properties: limit: type: - integer - 'null' remaining: type: - integer - 'null' reset_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' observed_at: $ref: '#/components/schemas/Timestamp' stale: type: boolean - type: 'null' description: Latest upstream rate-limit headers. required: - name - type - credential - tls_verify ProviderStatusList: type: object properties: items: type: array items: $ref: '#/components/schemas/ProviderStatus' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor ProviderTest: type: object properties: deployment: type: string credential: type: string ProviderType: type: object properties: type: type: string core: type: boolean description: One of the core provider types, listed first. default_base_url: type: - string - 'null' dialects: type: array items: type: string auth_methods: type: array items: type: string description: Only methods this build supports. required: - type - core - default_base_url - dialects - auth_methods ProviderTypeList: type: object properties: items: type: array items: $ref: '#/components/schemas/ProviderType' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor RecostRequest: type: object properties: from: $ref: '#/components/schemas/Timestamp' to: $ref: '#/components/schemas/Timestamp' required: - from - to RecostResult: type: object properties: lines_appended: type: integer minimum: 0 required: - lines_appended RecoveryCodes: type: object description: Shown once. properties: recovery_codes: type: array items: type: string required: - recovery_codes ReplayRequest: type: object properties: body_patch: type: array items: type: object description: RFC 6902 patch applied to the logged body. ResilienceSettings: type: object description: '`resilience` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Resilience metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata ResilienceSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Resilience required: - spec ResourceMetadata: type: object readOnly: true description: Read-only; ignored on write. properties: etag: type: string description: Strong entity tag, quoted, equal to the `ETag` response header. examples: - '"a41f"' generation: type: integer minimum: 1 description: Config generation that last changed this resource. created_at: $ref: '#/components/schemas/Timestamp' updated_at: $ref: '#/components/schemas/Timestamp' managed_by: $ref: '#/components/schemas/ManagedBy' secret_hints: type: object additionalProperties: type: string pattern: ^….{4}$ description: Last-four hints of provider and webhook secrets, by field path. required: - etag - generation - created_at - updated_at - managed_by RevokedCount: type: object properties: revoked: type: integer minimum: 0 required: - revoked Role: type: object properties: name: type: string builtin: type: boolean description: type: - string - 'null' description: What the role is for; a custom role's `description`. bindable_at: type: array items: type: string enum: - gateway - organization - team - project permissions: type: array items: type: string examples: - keys:read required: - name - builtin - bindable_at - permissions RoleBinding: allOf: - $ref: '#/components/schemas/RoleBindingCreate' - type: object properties: id: type: string readOnly: true created_at: allOf: - $ref: '#/components/schemas/Timestamp' readOnly: true required: - id description: A binding of a `user` principal is also an entry of `users..role_bindings` (so it is visible in the user resource and in `GET /config`); creating or deleting it creates a generation. RoleBindingCreate: type: object properties: principal: $ref: '#/components/schemas/Principal' role: type: string scope: type: string pattern: ^(gateway|(organization|team|project)/.+)$ required: - principal - role - scope RoleBindingList: type: object properties: items: type: array items: $ref: '#/components/schemas/RoleBinding' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor RoleList: type: object properties: items: type: array items: $ref: '#/components/schemas/Role' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor RollbackRequest: type: object properties: generation: type: integer minimum: 1 required: - generation RouteCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Route required: - name - spec RouteList: type: object properties: items: type: array items: $ref: '#/components/schemas/RouteResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor RouteReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Route required: - spec RouteResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Route metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata RouteSimulate: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Route from: $ref: '#/components/schemas/Timestamp' to: $ref: '#/components/schemas/Timestamp' sample: type: integer minimum: 1 maximum: 100000 filters: type: object required: - from - to RouteSimulation: type: object properties: evaluated: type: integer minimum: 0 matched_by_rule: type: array items: type: object properties: path: type: string name: type: - string - 'null' count: type: integer minimum: 0 unknown: type: integer minimum: 0 required: - path - count by_leaf: type: array items: type: object properties: path: type: string deployment: type: - string - 'null' count: type: integer minimum: 0 required: - path - count blocked: type: integer minimum: 0 no_route: type: integer minimum: 0 required: - evaluated - matched_by_rule - by_leaf - blocked - no_route RouteStateChild: type: object properties: rule: description: For a child of a `conditional` node that is a rule's target, the rule. oneOf: - type: object properties: index: type: integer minimum: 0 name: type: - string - 'null' enabled: type: boolean required: - index - name - enabled - type: 'null' segment: type: string eligible: type: boolean reason: type: - string - 'null' weight: type: integer minimum: 0 swrr_current: type: - number - 'null' latency_ms: type: object properties: ttft: type: - number - 'null' per_token: type: - number - 'null' e2e: type: - number - 'null' success: type: - number - 'null' inflight: type: integer minimum: 0 price_estimate: oneOf: - $ref: '#/components/schemas/Money' - type: 'null' affinity_bindings: type: integer minimum: 0 required: - segment - eligible RouteStateEntry: type: object properties: path: type: string type: type: string children: type: array items: $ref: '#/components/schemas/RouteStateChild' replica: type: string affinity_bindings: type: integer minimum: 0 description: Active session bindings of the route on the answering replica, the same on every entry of the route; `DELETE /routes/{name}/affinity` ends them. canary: type: object description: A `weighted` node's canary. properties: child: type: string state: enum: - ramping - held - rolled_back - complete weight: type: integer minimum: 0 maximum: 100 error_rate: type: - number - 'null' required: - child - state - weight - error_rate mirror: type: object description: Shadow comparison over the replica's last 24 hours, on a node with a `mirror`. Leaves with a mirror are listed too. properties: comparisons: type: integer minimum: 0 divergence_rate: type: - number - 'null' latency_delta_p50_ms: type: - number - 'null' cost_delta_usd: type: string required: - comparisons - divergence_rate - latency_delta_p50_ms - cost_delta_usd picker: type: object description: A `pool` node's external endpoint picker on the answering replica, with its address, how its last ask ended and what it last chose. Absent for a pool the built-in scheduler picks for. properties: url: type: string description: '`picker_service.url`.' timeout: $ref: '#/components/schemas/Duration' on_error: enum: - reject - builtin description: '`picker_on_error`.' state: enum: - ok - failing - unknown description: '`ok` when the last ask was answered (an empty choice included), `failing` when it failed (unreachable, timed out or malformed), `unknown` before the replica asked it.' asks: type: integer minimum: 0 description: Asks since the replica started or the routing state was reset. failures: type: integer minimum: 0 last_asked_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_pick: type: - object - 'null' description: The picker's last answer. properties: at: $ref: '#/components/schemas/Timestamp' deployments: type: array items: type: string description: The pool's deployments its destination named, in its order; empty for "no endpoint". served: type: - string - 'null' description: The deployment that produced the terminal response after that pick; null while none has. required: - at - deployments - served last_failure: type: - object - 'null' properties: at: $ref: '#/components/schemas/Timestamp' reason: type: string description: Why the ask failed, in words. required: - at - reason required: - url - timeout - on_error - state - asks - failures - last_asked_at - last_pick - last_failure required: - path - type - children - replica RouteStateList: type: object properties: items: type: array items: $ref: '#/components/schemas/RouteStateEntry' next_cursor: $ref: '#/components/schemas/NextCursor' unmatched: description: >- What the route does with a request its root's rules do not match, `error` when a root without a default answers 400 `no_route_matched`, `default` for the root's default target, `none` when the root is not a rule list. enum: - error - default - none models: description: The Models whose `route` is this route; requests of every other Model never reach it. type: array items: type: string required: - items - next_cursor RoutingSettings: type: object description: '`routing` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Routing metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata RoutingSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Routing required: - spec SafetyEvent: type: object description: Safety event. `spans` and `score` are null for readers without `logs:read_content`. properties: id: type: string log_id: type: string request_id: type: string time: $ref: '#/components/schemas/Timestamp' guardrail: type: string guardrail_type: type: string stage: type: string action: enum: - block - redact - flag - divert - error category: type: string severity: enum: - critical - high - medium - low confidence: type: number minimum: 0 maximum: 1 entities: type: array items: type: object properties: type: type: string count: type: integer minimum: 0 required: - type - count spans: type: - array - 'null' items: type: object properties: start: type: integer minimum: 0 end: type: integer minimum: 0 entity: type: string score: type: - number - 'null' fingerprint: type: string organization: type: - string - 'null' team: type: - string - 'null' project: type: - string - 'null' key: type: - string - 'null' end_user: type: - string - 'null' model: type: - string - 'null' provider: type: - string - 'null' latency_ms: type: - number - 'null' review_state: enum: - open - reviewed - false_positive - escalated reviewed_by: type: - string - 'null' reviewed_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' note: type: - string - 'null' required: - id - log_id - time - guardrail - action - category - severity - confidence - fingerprint - review_state SafetyEventList: type: object properties: items: type: array items: $ref: '#/components/schemas/SafetyEvent' next_cursor: $ref: '#/components/schemas/NextCursor' total: type: integer minimum: 0 required: - items - next_cursor SafetyReview: type: object properties: state: enum: - open - reviewed - false_positive - escalated note: type: string maxLength: 2000 required: - state MaintenanceWindow: type: object properties: start: $ref: '#/components/schemas/Timestamp' end: $ref: '#/components/schemas/Timestamp' description: type: - string - 'null' active: type: boolean description: The window covers now. required: - start - end - description - active ScheduleDeletion: type: object description: Grace period, from 1s to 90d (default 30d). properties: grace: $ref: '#/components/schemas/Duration' ScimStatus: type: object properties: enabled: type: boolean users: type: integer minimum: 0 groups: type: integer minimum: 0 last_request_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_error: type: - string - 'null' required: - enabled - users - groups - last_request_at - last_error SecretRotate: type: object description: Overlap during which the previous secret still works (≤ 1h, default 0s). properties: overlap: $ref: '#/components/schemas/Duration' SecretRotated: type: object description: The new secret, returned once. properties: secret: type: string previous_valid_until: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: - secret - previous_valid_until SecretsRotate: type: object properties: scope: type: array items: enum: - sessions - scim_token - webhook_secrets minItems: 1 uniqueItems: true required: - scope SecretsRotated: type: object properties: secrets: type: object additionalProperties: type: string description: New generated secrets by path, returned once. not_rotated: type: array items: type: string sessions_revoked: type: integer minimum: 0 required: - secrets - not_rotated SecuritySettings: type: object description: '`security` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Security metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata SecuritySettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Security required: - spec ServerSettings: type: object description: '`server` singleton (owner). Static, except `admission`, which PATCH may change.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Server metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata Session: type: object properties: id: type: string created_at: $ref: '#/components/schemas/Timestamp' last_seen_at: $ref: '#/components/schemas/Timestamp' expires_at: $ref: '#/components/schemas/Timestamp' client_ip: type: string user_agent: type: string method: enum: - token - oidc - oauth - saml - local mfa: type: boolean trusted: type: boolean organization: type: - string - 'null' current: type: boolean location: oneOf: - type: object properties: country: type: - string - 'null' description: ISO 3166-1 alpha-2 code. region: type: - string - 'null' description: ISO 3166-2 subdivision code, without the country. city: type: - string - 'null' required: - country - region - city - type: 'null' description: Where the session's client address is, from the local GeoIP database (`observability.geoip`); null without one, or when the database does not know the address. required: - id - created_at - last_seen_at - expires_at - method - mfa - trusted - current - location SessionCreate: type: object properties: token: type: string description: An admin token or the bootstrap credential. required: - token SessionList: type: object properties: items: type: array items: $ref: '#/components/schemas/Session' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor SignedMoney: type: string pattern: ^-?[0-9]+(\.[0-9]{1,12})?$ examples: - '5.00' - '-1.25' description: Signed decimal USD amount; positive = charge, negative = credit. SloStatus: type: object properties: name: type: string kind: enum: - availability - latency objective: type: number attained: type: - number - 'null' error_budget_remaining: type: - number - 'null' burn_rate_1h: type: - number - 'null' burn_rate_6h: type: - number - 'null' window: type: string required: - name - kind - objective - attained - error_budget_remaining - window SloStatusList: type: object properties: items: type: array items: $ref: '#/components/schemas/SloStatus' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor SmtpSettings: type: object description: '`smtp` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Smtp metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata SmtpSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Smtp required: - spec SmtpTest: type: object properties: to: type: string minLength: 3 required: - to SpendSummaryList: type: object properties: items: type: array items: $ref: '#/components/schemas/SpendSummaryRow' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor SpendSummaryRow: type: object properties: group: type: object additionalProperties: type: - string - 'null' requests: type: integer minimum: 0 lines: type: integer minimum: 0 tokens: type: object description: Usage-record fields of as integers. additionalProperties: type: integer minimum: 0 cost: type: object properties: billed_usd: $ref: '#/components/schemas/SignedMoney' cost_usd: $ref: '#/components/schemas/SignedMoney' required: - billed_usd - cost_usd cache_saved_usd: $ref: '#/components/schemas/Money' description: The avoided cost of the group's cache hits. required: - group - requests - lines - tokens - cost Status: type: object properties: version: type: string commit: type: string mode: type: string enum: - standalone - cluster test_mode: type: boolean config_generation: type: integer minimum: 0 config_hash: type: string pattern: ^sha256:[0-9a-f]{64}$ nodes: type: array items: type: object properties: id: type: string generation: type: integer minimum: 0 last_seen: $ref: '#/components/schemas/Timestamp' required: - id - generation - last_seen features: type: array items: type: string description: The optional features this build supports, by id. data_plane_url: type: - string - 'null' trace_viewer_url: description: '`observability.traces.viewer_url`: a link template with `{trace_id}` (and optionally `{span_id}`) of an external trace viewer, or null.' type: - string - 'null' console: type: object properties: enabled: type: boolean path: type: string dry_run_all: type: boolean ingress_pauses: type: array description: The ingress pauses that hold now. items: $ref: '#/components/schemas/IngressPauseState' maintenance_window: description: The current maintenance window, else the next one. oneOf: - $ref: '#/components/schemas/MaintenanceWindow' - type: 'null' users: type: object properties: active: type: integer minimum: 0 cap: type: - integer - 'null' required: - version - commit - mode - test_mode - config_generation - config_hash - nodes - features StoreSettings: type: object description: '`store` singleton (owner). Static.' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Store metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata StreamingSettings: type: object description: '`streaming` singleton (owner).' properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Streaming metadata: $ref: '#/components/schemas/ResourceMetadata' required: - spec - metadata StreamingSettingsReplace: type: object properties: spec: $ref: ../schema/antirion-config.schema.json#/$defs/Streaming required: - spec TeamCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Team required: - name - spec TeamList: type: object properties: items: type: array items: $ref: '#/components/schemas/TeamResource' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor TeamReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/Team required: - spec TeamResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/Team metadata: $ref: '#/components/schemas/ResourceMetadata' required: - name - spec - metadata TestClock: type: object properties: now: $ref: '#/components/schemas/Timestamp' required: - now TestClockMove: oneOf: - type: object properties: advance: $ref: '#/components/schemas/Duration' required: - advance additionalProperties: false - type: object properties: set: $ref: '#/components/schemas/Timestamp' required: - set additionalProperties: false description: Only forward; a past `set` or negative duration → 400 `validation_failed`. TestReset: type: object properties: scopes: type: array items: type: string enum: - counters - budgets - health - affinity - cache - sessions - logs - audit description: 'Default: all.' TestResult: type: object properties: ok: type: boolean status_code: type: - integer - 'null' latency_ms: type: - number - 'null' error: type: - string - 'null' required: - ok - error TestSeed: type: object properties: seed: type: integer minimum: 0 maximum: 18446744073709551615 required: - seed Tier: type: object properties: name: type: string builtin: type: boolean description: type: string models: type: integer minimum: 0 required: - name - builtin - models TierList: type: object properties: items: type: array items: $ref: '#/components/schemas/Tier' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor Timestamp: type: string format: date-time description: RFC 3339 timestamp, UTC. TokenCheckRequest: type: object properties: token: type: string minLength: 1 required: - token UsageAnalytics: type: object properties: items: type: array items: $ref: '#/components/schemas/UsageBucket' next_cursor: $ref: '#/components/schemas/NextCursor' required: - items - next_cursor UsageBucket: type: object properties: start: $ref: '#/components/schemas/Timestamp' group: type: object additionalProperties: type: - string - 'null' requests: type: integer minimum: 0 errors: type: integer minimum: 0 input: type: integer minimum: 0 input_cache_read: type: integer minimum: 0 input_cache_write: type: integer minimum: 0 output: type: integer minimum: 0 output_reasoning: type: integer minimum: 0 cost_usd: $ref: '#/components/schemas/Money' latency_ms: type: object properties: p50: type: - number - 'null' p90: type: - number - 'null' p99: type: - number - 'null' p95: type: - number - 'null' ttft_ms: type: object properties: p50: type: - number - 'null' p90: type: - number - 'null' p99: type: - number - 'null' p95: type: - number - 'null' cancelled: type: integer minimum: 0 fallbacks: type: integer minimum: 0 retries: type: integer minimum: 0 cache_hits: type: integer minimum: 0 guardrail_blocks: type: integer minimum: 0 guardrail_redactions: type: integer minimum: 0 guardrail_flags: type: integer minimum: 0 unique_keys: type: integer minimum: 0 cache_saved_usd: $ref: '#/components/schemas/Money' output_tokens_per_second: type: - number - 'null' required: - start - group - requests - errors - cost_usd UserCreate: type: object description: '`metadata` is ignored if sent.' properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/User required: - name - spec UserList: type: object properties: items: type: array items: $ref: '#/components/schemas/UserResource' next_cursor: $ref: '#/components/schemas/NextCursor' counts: type: object description: Over the visible users every filter but `state` selects, before pagination. properties: state: type: object additionalProperties: type: integer minimum: 0 flagged: type: integer minimum: 0 required: - items - next_cursor - counts UserReplace: type: object description: Full replacement of `spec`; `metadata` is ignored if sent. properties: name: type: string description: Optional; must equal the path name when sent. spec: $ref: ../schema/antirion-config.schema.json#/$defs/User required: - spec UserMetadata: allOf: - $ref: '#/components/schemas/ResourceMetadata' - type: object description: Read-only sign-in and use facts. properties: last_login_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' last_login_method: oneOf: - enum: - token - oidc - oauth - saml - local - type: 'null' last_login_provider: type: - string - 'null' description: The identity provider of the last sign-in when it was a single sign-on (OIDC, GitHub or SAML), by its name under `auth.admin.sso`; null for other methods and sign-ins recorded before it was kept. mfa_methods: type: array items: enum: - totp - webauthn - idp last_active_at: oneOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' description: The latest of the last sign-in, any session's or admin token's use and any owned key's use. state: enum: - active - invited - disabled flagged: type: boolean description: A key the user owns has an open anomaly flag. readOnly: true UserResource: type: object properties: name: type: string spec: $ref: ../schema/antirion-config.schema.json#/$defs/User metadata: $ref: '#/components/schemas/UserMetadata' required: - name - spec - metadata ValidateResult: type: object properties: valid: type: boolean errors: type: array items: $ref: '#/components/schemas/ValidationDetail' warnings: type: array items: $ref: '#/components/schemas/Warning' required: - valid - errors - warnings ValidationDetail: type: object properties: path: type: string description: 'Config-document path: dotted keys, `[n]` for list indexes, `["…"]` for keys containing `.` or `[` (e.g. `routes.fast.targets[2].weight`).' code: type: string description: '`unknown_field`, `type_mismatch`, `required`, `out_of_range`, `invalid_format`, `invalid_enum`, `unresolved_reference`, `duplicate_key`, `conflict`, `secret_unresolved`, `secret_required`, `invalid_expression`, `unsupported_version`, `static_setting`, `locked_by_broader_level`, `malformed_document`, or an area-specific code registered by its owning spec (open set).' message: type: string required: - path - code - message Warning: type: object properties: path: type: string code: type: string examples: - deprecated_version message: type: string required: - code - message parameters: A2aAgentName: name: name in: path required: true description: A2A agent name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/McpName AccessRequestId: name: request_id in: path required: true description: Access request id. schema: type: string minLength: 1 Alert_event_type: name: event_type in: query required: false description: Filter by `event_type`. schema: type: string Alert_result: name: result in: query required: false description: Filter by `result`. schema: type: string Alert_webhook: name: webhook in: query required: false description: Filter by `webhook`. schema: type: string AlertId: name: alert_id in: path required: true description: Alert instance id. schema: type: string minLength: 1 AlertRuleName: name: rule in: path required: true description: Alert rule name (`observability.alerts.rules`). schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name AnalyticsGroupBy: name: group_by in: query required: false description: Up to 3 dimensions. schema: type: array items: type: string enum: - model - provider - deployment - organization - team - project - key - end_user - tag - status_class - route - route_node - requested_model - user - cache_status - guardrail - guardrail_category - guardrail_verdict - severity - client_ip - client_country - environment - cache_prefix maxItems: 3 explode: false style: form AnomalyId: name: anomaly_id in: path required: true description: Anomaly flag id. schema: type: string minLength: 1 ApplySource: name: source in: query required: false description: 'Apply source label (name pattern of); resources are recorded as `managed_by: apply:`.' schema: $ref: '#/components/schemas/Name' AuditId: name: id in: path required: true description: Audit entry id. schema: type: string Audit_action: name: action in: query required: false description: Filter by `action`; a value ending in `*` matches every action starting with what precedes it (`keys.*`). schema: type: string Audit_actor: name: actor in: query required: false description: Filter by `actor`. schema: type: string Audit_outcome: name: outcome in: query required: false description: Filter by `outcome`. schema: type: string enum: - success - denied - failed Audit_resource: name: resource in: query required: false description: Filter by `resource` (`/`, e.g. `keys/k1`); a value ending in `*` matches every resource starting with what precedes it (`keys/*`). schema: type: string Audit_kind: name: kind in: query required: false description: '`write` (changes and attempted changes) or `read` (audited reads,).' schema: type: string enum: - write - read BindingId: name: id in: path required: true description: Server-assigned role-binding id. schema: type: string BudgetLevel: name: level in: path required: true description: Budget level (`route` and `node`). schema: type: string enum: - gateway - organization - team - project - key - model - route - node BudgetName: name: name in: path required: true description: Budget declaration name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/LimitName BudgetOwner: name: owner in: path required: true description: Owning resource's name; `-` at the gateway level. At the `node` level, the node's route path (e.g. `chat_frontier/openai_main_gpt5`) percent-encoded as one segment. schema: type: string CacheKey: name: key in: path required: true description: 'Cache key from `x-antirion-cache-key`: 64 lowercase hex. Malformed → 400 `invalid_parameter`.' schema: type: string pattern: ^[0-9a-f]{64}$ Cascade: name: cascade in: query required: false description: Delete descendants too. Without it, deleting a resource that has children → 409 `resource_in_use`. schema: type: boolean default: false ChangeRequestId: name: change_request_id in: path required: true description: Change request id. schema: type: string minLength: 1 ChannelName: name: channel in: path required: true description: Alert channel name (`observability.alerts.channels`). schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name ConfigVersion: name: config_version in: query required: true description: Wait until every ready node has applied at least this version. schema: type: integer minimum: 0 ConvergeTimeout: name: timeout in: query required: false description: How long to wait (≤ `admin.api.max_wait`). schema: $ref: '#/components/schemas/Duration' Counter_level: name: level in: query required: false description: Filter by counter level. schema: type: string enum: - gateway - organization - team - project - key - model - route - node - deployment Counter_name: name: name in: query required: false description: Filter by counter name. schema: type: string Counter_owner: name: owner in: query required: false description: Filter by counter owner. schema: type: string Cursor: name: cursor in: query required: false description: Opaque cursor from a previous page's `next_cursor`. Malformed, tampered or foreign → 400 `invalid_parameter`. schema: type: string DeploymentName: name: name in: path required: true description: Deployment name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/ProviderName DrainWait: name: wait in: query required: false description: 'Only when `{id}` is the receiving node: return when nothing is in flight or queued, or at `drain_max`.' schema: type: boolean default: false DryRun: name: dry_run in: query required: false description: Run the whole pipeline and commit nothing. schema: type: boolean default: false EndUserRequired: name: end_user in: query required: true description: The end user whose records are deleted. schema: type: string EventId: name: event_id in: path required: true description: Alert event id. schema: type: string FactorId: name: factor_id in: path required: true description: Second-factor id. schema: type: string minLength: 1 From: name: from in: query required: false description: Inclusive lower bound (RFC 3339). schema: $ref: '#/components/schemas/Timestamp' Generation: name: generation in: path required: true description: Config generation number. schema: type: integer minimum: 1 GrantId: name: grant_id in: path required: true description: Overage grant id. schema: type: string minLength: 1 GroupBy: name: group_by in: query required: false description: Comma-separated ledger attributes to group by (e.g. `key`, `model,project`). schema: type: array items: type: string explode: false style: form GuardrailName: name: name in: path required: true description: Guardrail name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/GuardrailName IdempotencyKey: name: Idempotency-Key in: header required: false schema: type: string minLength: 1 maxLength: 255 pattern: ^[\x21-\x7E]+$ description: Executes the POST at most once per key per operator within `admin.api.idempotency_ttl`; a repeat with the same body returns the original status and body; a different body → 422 `idempotency_key_reused`. IfMatch: name: If-Match in: header required: false schema: type: string description: Resource ETag (resource writes) or `""` (apply). Mismatch → 412 `precondition_failed`. IfNoneMatch: name: If-None-Match in: header required: false schema: type: string enum: - '*' description: '`*`: create only; 412 if the resource exists.' Interval: name: interval in: query required: false description: Bucket size; `hour` and `day` are synonyms of `1h` and `1d`. schema: type: string enum: - 1m - 5m - 15m - 1h - 6h - 1d - hour - day InvalidationRuleName: name: rule in: path required: true description: Cache invalidation rule name (`cache.invalidation_rules`). schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name InvitationId: name: invitation_id in: path required: true description: Invitation id. schema: type: string minLength: 1 JobId: name: job_id in: path required: true description: Job id. schema: type: string minLength: 1 KeyName: name: name in: path required: true description: Virtual key name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name Ledger_deployment: name: deployment in: query required: false description: Filter by `deployment`. schema: type: string Ledger_end_user: name: end_user in: query required: false description: Filter by `end_user`. schema: type: string Ledger_key: name: key in: query required: false description: Filter by `key`. schema: type: string Ledger_model: name: model in: query required: false description: Filter by `model`. schema: type: string Ledger_organization: name: organization in: query required: false description: Filter by `organization`. schema: type: string Ledger_project: name: project in: query required: false description: Filter by `project`. schema: type: string Ledger_status: name: status in: query required: false description: Filter by `status`. schema: type: string Ledger_tag: name: tag in: query required: false description: Filter by `tag`. schema: type: string Ledger_team: name: team in: query required: false description: Filter by `team`. schema: type: string Ledger_user: name: user in: query required: false description: Filter by `user`. schema: type: string Limit: name: limit in: query required: false description: Page size, 1..`admin.api.max_page_size` (default `admin.api.default_page_size`). Out of range → 400 `invalid_parameter`. schema: type: integer minimum: 1 maximum: 10000 LogId: name: id in: path required: true description: Log record id (UUIDv7, `x-antirion-log-id`). schema: type: string Log_code: name: code in: query required: false description: Filter by `code`. Repeat for OR. schema: type: array items: type: string explode: true Log_deployment: name: deployment in: query required: false description: Filter by `deployment`. Repeat for OR. schema: type: array items: type: string explode: true Log_end_user: name: end_user in: query required: false description: Filter by `end_user`. Repeat for OR. schema: type: array items: type: string explode: true Log_key: name: key in: query required: false description: Filter by `key`. Repeat for OR. schema: type: array items: type: string explode: true Log_model: name: model in: query required: false description: Filter by `model`. Repeat for OR. schema: type: array items: type: string explode: true Log_organization: name: organization in: query required: false description: Filter by `organization`. Repeat for OR. schema: type: array items: type: string explode: true Log_project: name: project in: query required: false description: Filter by `project`. Repeat for OR. schema: type: array items: type: string explode: true Log_provider: name: provider in: query required: false description: Filter by `provider`. Repeat for OR. schema: type: array items: type: string explode: true Log_request_id: name: request_id in: query required: false description: Filter by `request_id`. schema: type: string Log_response_path: name: response_path in: query required: false description: Filter by `response_path`. Repeat for OR. schema: type: array items: type: string explode: true Log_session_id: name: session_id in: query required: false description: Filter by `session_id`. Repeat for OR. schema: type: array items: type: string explode: true Log_status_code: name: status_code in: query required: false description: Filter by `status_code`. Repeat for OR. schema: type: array items: type: integer explode: true Log_tag: name: tag in: query required: false description: Filter by `tag`. Repeat for OR. schema: type: array items: type: string explode: true Log_team: name: team in: query required: false description: Filter by `team`. Repeat for OR. schema: type: array items: type: string explode: true McpGatewayName: name: name in: path required: true description: MCP gateway name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name McpServerName: name: name in: path required: true description: MCP server name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/McpName ModelName: name: name in: path required: true description: Model name. allows `/` and `:` in Model names; a `/` is sent percent-encoded as `%2F` within this one path segment. schema: $ref: ../schema/antirion-config.schema.json#/$defs/ModelName NodeId: name: id in: path required: true description: A `node_id`. schema: type: string OauthProvider: name: provider in: path required: true description: OAuth provider name (`auth.admin.sso.oauth`). schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name OidcCode: name: code in: query required: false description: Authorization code. schema: type: string OidcProvider: name: provider in: path required: true description: Name of an `auth.admin.sso.oidc` provider. schema: type: string OidcState: name: state in: query required: false description: The `state` issued by the login redirect. schema: type: string OrganizationName: name: name in: path required: true description: Organization name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/TenantName OverageRequestId: name: request_id in: path required: true description: Overage request id. schema: type: string minLength: 1 Partition: name: partition in: query required: false description: Partition value of a partitioned budget or limit. schema: type: string PluginName: name: name in: path required: true description: Extension name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name ProjectName: name: name in: path required: true description: Project name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/TenantName ProviderKeyName: name: key in: path required: true description: Name of an entry of `providers.

.auth.api_keys`. schema: type: string ProviderName: name: name in: path required: true description: Provider name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/ProviderName Prune: name: prune in: query required: false description: Delete resources of this source that are absent from the document. schema: type: boolean default: false RequestId: name: request_id in: path required: true description: The request's log id (`x-antirion-log-id`, the record's `id`), which ledger lines carry as `request_id`; never the client's `x-request-id`. schema: type: string ReturnTo: name: return_to in: query required: false description: Relative path starting with `/` and not `//`; anything else redirects to `/`. schema: type: string RoleBinding_principal_id: name: principal_id in: query required: false description: Filter by principal id. schema: type: string RoleBinding_principal_type: name: principal_type in: query required: false description: Filter by principal type. schema: type: string RoleBinding_role: name: role in: query required: false description: Filter by role. schema: type: string RoleBinding_scope: name: scope in: query required: false description: Filter by exact scope. schema: type: string RouteName: name: name in: path required: true description: Route name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name SafetyEventId: name: event_id in: path required: true description: Safety event id. schema: type: string minLength: 1 SamlProvider: name: provider in: path required: true description: Name of an `auth.admin.sso.saml` provider. schema: type: string SessionId: name: session_id in: path required: true description: Session id; not the cookie value. schema: type: string minLength: 1 SinkName: name: sink in: path required: true description: Audit sink name (`governance.audit_sinks`). schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name SsoProviderError: name: error in: query required: false description: The error the identity provider sent instead of a code. `access_denied` lands as `sso_denied`, any other as `sso_provider_error`; only a plain error code is repeated, never the provider's description. schema: type: string TeamName: name: name in: path required: true description: Team name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/TenantName To: name: to in: query required: false description: Exclusive upper bound (RFC 3339). schema: $ref: '#/components/schemas/Timestamp' TokenKid: name: kid in: path required: true description: Admin token key id. schema: type: string UserName: name: name in: path required: true description: User or service-account name. schema: $ref: ../schema/antirion-config.schema.json#/$defs/UserName ViewId: name: view_id in: path required: true description: Saved log view id. schema: type: string minLength: 1 Wait: name: wait in: query required: false description: Wait up to this duration (≤ `admin.api.max_wait`) for every live node to serve the new generation. schema: $ref: '#/components/schemas/Duration' WebhookName: name: webhook in: path required: true description: Event webhook name (`observability.alerts.webhooks`). schema: $ref: ../schema/antirion-config.schema.json#/$defs/Name headers: XAntirionVersion: description: Gateway version; on every Admin API response. schema: type: string ETag: description: Strong ETag of the resource, or `""` for the config document. schema: type: string Location: description: URL of the created resource. schema: type: string format: uri-reference XConfigGeneration: description: Generation created (or current, when nothing changed) by this mutation. schema: type: integer minimum: 1 XConfigPropagated: description: Whether every live node serves that generation at response time. schema: type: boolean RetryAfter: description: Seconds to wait. schema: type: integer minimum: 0 Allow: description: Methods the path allows. schema: type: string WWWAuthenticate: description: '`Bearer`.' schema: type: string SetCookie: description: '`antirion_session=; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=`.' schema: type: string XFieldsRedacted: description: Comma list of fields nulled for lack of permission. schema: type: string responses: BadRequest: description: '`malformed_document` (unparseable body, duplicate keys, custom tags), `validation_failed` (well-formed but invalid; `details[]` lists every problem) or `invalid_parameter` (unknown or invalid query parameter, invalid cursor).' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: malformed_document: value: error: code: malformed_document message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a validation_failed: value: error: code: validation_failed message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a invalid_parameter: value: error: code: invalid_parameter message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a Unauthenticated: description: Missing, malformed or unknown admin credential, or any virtual key. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' WWW-Authenticate: $ref: '#/components/headers/WWWAuthenticate' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: unauthenticated: value: error: code: unauthenticated message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a Forbidden: description: Authenticated, inside the visible scope, but lacking the permission; or a cookie-authenticated write without a matching `Origin`. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: forbidden: value: error: code: forbidden message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a NotFound: description: Unknown resource, collection or path, or a resource outside the caller's scope (identical body either way). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: not_found: value: error: code: not_found message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a MethodNotAllowed: description: The path exists but not with this method (e.g. writing a static setting, modifying the audit log). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Allow: $ref: '#/components/headers/Allow' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: method_not_allowed: value: error: code: method_not_allowed message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a HeldForApproval: description: The two-person rule holds this action (`governance.dual_control.actions`,); the body is the change request of kind `action` that runs it once a second principal approves and applies it. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/ChangeRequest' Conflict: description: '`already_exists` (POST create of an existing name), `resource_in_use` (DELETE of a referenced resource; `details[]` lists referrers), `managed_by_apply` (lock).' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: already_exists: value: error: code: already_exists message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a resource_in_use: value: error: code: resource_in_use message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a managed_by_apply: value: error: code: managed_by_apply message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a PreconditionFailed: description: '`If-Match`/`If-None-Match` mismatch.' headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: precondition_failed: value: error: code: precondition_failed message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a PayloadTooLarge: description: Body above `admin.api.max_document`. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: payload_too_large: value: error: code: payload_too_large message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a UnsupportedMediaType: description: Content type is not JSON, YAML (document endpoints) or merge-patch (PATCH). headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: unsupported_media_type: value: error: code: unsupported_media_type message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a IdempotencyKeyReused: description: Same `Idempotency-Key`, different body. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: idempotency_key_reused: value: error: code: idempotency_key_reused message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a RateLimited: description: Admin rate limit or login throttle. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Retry-After: $ref: '#/components/headers/RetryAfter' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: rate_limited: value: error: code: rate_limited message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a Internal: description: Bug. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: internal: value: error: code: internal message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a StoreUnavailable: description: The store cannot be written; every admin write gets this code. Reads may still succeed from the node snapshot. headers: x-antirion-version: $ref: '#/components/headers/XAntirionVersion' Retry-After: $ref: '#/components/headers/RetryAfter' content: application/json: schema: $ref: '#/components/schemas/AdminError' examples: store_unavailable: value: error: code: store_unavailable message: … request_id: 01926f5e-7c1a-7d2b-9a51-1f0e2c3d4b5a