API reference
The platform chart deploys three backend REST APIs for administration and automation. The console uses these APIs.
All three are cluster-internal. The chart creates ClusterIP Services and no ingress, so reach them over Service DNS from inside the cluster, or publish them yourself as described in Deploy the platform.
The Registry Server is also deployed by this chart, but its API is shared with the open source build and is documented in the Registry Server API reference.
Enterprise Manager
The Enterprise Manager API covers users, groups, connectors, managed secrets, virtual API keys, budgets, and signed Stacklok CLI configuration.
The running service also self-serves this reference at /api/doc, which is
generated from the same source and therefore always matches the version you have
deployed.
The generated specification omits the SCIM provisioning and budget webhook
routes. Use /api/doc on the running service for its complete API reference.
Enterprise Manager API (0.1.0)
Download OpenAPI specification:Download
Stacklok Enterprise Manager — unified admin API for configuration delivery, directory, and budget management.
Budget cells summary
Authorizations:
query Parameters
| scope | string Enum: "user" "group" Principal tier filter |
| subject | string Subject id prefix match |
| at | string Instant the period windows are computed against, RFC 3339 (default now) |
| cursor | string Opaque keyset cursor from a previous page |
| limit | integer Page size (default 50, max 200, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "cells": [
- {
- "limit_usd": "string",
- "on_default": true,
- "ordinal": 0,
- "period": "string",
- "period_end": "string",
- "period_start": "string",
- "remaining_usd": "string",
- "scope": "string",
- "subject_id": "string",
- "used_usd": "string"
}
], - "next_cursor": "string"
}Budget consumption breakdown
One budget's current-period spend broken down by user, model, and provider. The period window is computed server-side (current period only). Each dimension's entries sum to total_used_usd.
Authorizations:
query Parameters
| scope required | string Enum: "user" "group" Principal tier |
| subject_id required | string Budget subject id (OIDC sub for user budgets, group UUID for group budgets) |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "by_model": [
- {
- "used_usd": "string",
- "value": "string"
}
], - "by_provider": [
- {
- "used_usd": "string",
- "value": "string"
}
], - "by_user": [
- {
- "used_usd": "string",
- "value": "string"
}
], - "period": "string",
- "period_end": "string",
- "period_start": "string",
- "scope": "string",
- "subject_id": "string",
- "total_used_usd": "string"
}Daily spend series
Zero-filled daily USD totals over the served window, including the current (in-progress) UTC day. from/to echo the bounds actually served after clamping (to at the end of the current UTC day, from at the retention horizon).
Authorizations:
query Parameters
| granularity | string Value: "day" Bucket granularity |
| from | string Window start, ISO date (default 30 days back, including today) |
| to | string Window end (exclusive), ISO date |
| model | string Served model of the underlying event, exact match |
| scope | string Enum: "user" "group" Payer tier charged |
| subject_id | string Payer charged, exact match |
Responses
Response samples
- 200
- 400
- 500
{- "buckets": [
- {
- "date": "string",
- "usd": "string"
}
], - "from": "string",
- "granularity": "string",
- "to": "string"
}Delete pricing catalog entry
Remove one (provider, model) rate row outright. There is no revert-to-baseline: the next request for that model is denied at admission as unpriceable. This republishes the ENTIRE remaining catalog as a new operator-dated version, permanently opting this deployment out of baseline updates shipped later.
Authorizations:
path Parameters
| provider required | string Literal provider as stored |
| model required | string Model name (may contain '/') |
header Parameters
| If-Match required | string ETag from GET /v1/budgets/pricing or the per-entry GET |
Responses
Response samples
- 404
- 409
- 412
- 428
- 500
{- "error": "string"
}Delete staged pricing catalog version
Remove a pricing catalog version staged to take effect later, addressed by its exact effective_from. Clears the 409 a staged version causes on every pricing write. A version that has already taken effect cannot be removed and returns 409.
Authorizations:
path Parameters
| effectiveFrom required | string Staged version's effective_from, RFC 3339 |
Responses
Response samples
- 400
- 404
- 409
- 500
{- "error": "string"
}Response samples
- 200
- 404
- 500
{- "effective_from": "string",
- "provider_aliases": {
- "property1": "string",
- "property2": "string"
}, - "spec": {
- "entries": [
- {
- "anthropic": {
- "cacheCreation1hInputUsdPerMillion": "string",
- "cacheCreation5mInputUsdPerMillion": "string",
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string"
}, - "google": {
- "audioInputUsdPerMillion": "string",
- "audioOutputUsdPerMillion": "string",
- "cachedAudioInputUsdPerMillion": "string",
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string",
- "promptSizeTiers": [
- {
- "aboveTokens": 0,
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string"
}
], - "thoughtsOutputUsdPerMillion": "string"
}, - "model": "string",
- "openai": {
- "audioInputUsdPerMillion": "string",
- "audioOutputUsdPerMillion": "string",
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string",
- "promptSizeTiers": [
- {
- "aboveTokens": 0,
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string"
}
], - "reasoningOutputUsdPerMillion": "string"
}, - "provider": "string"
}
], - "tools": {
- "anthropic": {
- "webSearchUsdPerThousand": "string"
}, - "google": {
- "groundingSearchUsdPerThousand": "string"
}, - "openai": {
- "fileSearchUsdPerThousand": "string",
- "webSearchUsdPerThousand": "string"
}
}
}
}Get pricing catalog entry
Authorizations:
path Parameters
| provider required | string Literal provider as stored |
| model required | string Model name (may contain '/') |
Responses
Response samples
- 200
- 404
- 500
{- "anthropic": {
- "cacheCreation1hInputUsdPerMillion": "string",
- "cacheCreation5mInputUsdPerMillion": "string",
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string"
}, - "google": {
- "audioInputUsdPerMillion": "string",
- "audioOutputUsdPerMillion": "string",
- "cachedAudioInputUsdPerMillion": "string",
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string",
- "promptSizeTiers": [
- {
- "aboveTokens": 0,
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string"
}
], - "thoughtsOutputUsdPerMillion": "string"
}, - "model": "string",
- "openai": {
- "audioInputUsdPerMillion": "string",
- "audioOutputUsdPerMillion": "string",
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string",
- "promptSizeTiers": [
- {
- "aboveTokens": 0,
- "cachedInputUsdPerMillion": "string",
- "inputUsdPerMillion": "string",
- "outputUsdPerMillion": "string"
}
], - "reasoningOutputUsdPerMillion": "string"
}, - "provider": "string"
}Group budget breakdown slice
A group budget's current-period spend sliced by one dimension. dimension selects the slice axis; entries sum to total_used_usd.
Authorizations:
path Parameters
| id required | string Group subject_id |
query Parameters
| dimension required | string Enum: "user" "model" Slice axis |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "dimension": "string",
- "entries": [
- {
- "used_usd": "string",
- "value": "string"
}
], - "period": "string",
- "period_end": "string",
- "period_start": "string",
- "scope": "string",
- "subject_id": "string",
- "total_used_usd": "string"
}List charges
Authorizations:
query Parameters
| from | string Inclusive event_time lower bound, RFC 3339 |
| to | string Exclusive event_time upper bound, RFC 3339 |
| model | string Served model of the underlying event, exact match |
| scope | string Enum: "user" "group" Payer tier charged |
| subject_id | string Payer charged, exact match |
| cursor | string Opaque keyset cursor from a previous page |
| limit | integer Page size (default 50, max 10000, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "charges": [
- {
- "auth_subject": "string",
- "charged_usd": "string",
- "event_id": "string",
- "event_time": "string",
- "id": "string",
- "interaction_id": "string",
- "model": "string",
- "period_end": "string",
- "period_start": "string",
- "pricing_catalog_id": "string",
- "provider": "string",
- "scope": "string",
- "subject_id": "string"
}
], - "next_cursor": "string"
}List own charges
Lists the charge records derived from the caller's own usage events, scoped to the verified token subject. A page may contain fewer than limit records even when more data exists; keep following next_cursor until it is absent.
Authorizations:
query Parameters
| from | string Inclusive event_time lower bound, RFC 3339 |
| to | string Exclusive event_time upper bound, RFC 3339 |
| model | string Served model of the underlying event, exact match |
| cursor | string Opaque keyset cursor from a previous page |
| limit | integer Page size (default 50, max 200, clamped) |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "charges": [
- {
- "auth_subject": "string",
- "charged_usd": "string",
- "event_id": "string",
- "event_time": "string",
- "id": "string",
- "interaction_id": "string",
- "model": "string",
- "period_end": "string",
- "period_start": "string",
- "pricing_catalog_id": "string",
- "provider": "string",
- "scope": "string",
- "subject_id": "string"
}
], - "next_cursor": "string"
}List own usage events
Lists the caller's own usage events, scoped to the verified token subject. A page may contain fewer than limit records even when more data exists; keep following next_cursor until it is absent.
Authorizations:
query Parameters
| from | string Inclusive event_time lower bound, RFC 3339 |
| to | string Exclusive event_time upper bound, RFC 3339 |
| model | string Served model, exact match |
| outcome | string Enum: "delivered" "blocked_downstream" "client_disconnect" "upstream_error" Interaction outcome |
| cursor | string Opaque keyset cursor from a previous page |
| limit | integer Page size (default 50, max 200, clamped) |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "events": [
- {
- "auth_issuer": "string",
- "auth_subject": "string",
- "duration_ms": 0,
- "event_time": "string",
- "id": "string",
- "ingest_time": "string",
- "interaction_id": "string",
- "model": "string",
- "outcome": "string",
- "platform_groups": [
- "string"
], - "platform_user_id": "string",
- "provider": "string",
- "raw_usage": { },
- "requested_model": "string",
- "route": "string",
- "upstream_status": 0,
- "virtual_key_id": "string"
}
], - "next_cursor": "string"
}List usage events
Authorizations:
query Parameters
| from | string Inclusive event_time lower bound, RFC 3339 |
| to | string Exclusive event_time upper bound, RFC 3339 |
| model | string Served model, exact match |
| auth_subject | string Verified OIDC subject, exact match |
| outcome | string Enum: "delivered" "blocked_downstream" "client_disconnect" "upstream_error" Interaction outcome |
| cursor | string Opaque keyset cursor from a previous page |
| limit | integer Page size (default 50, max 10000, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "events": [
- {
- "auth_issuer": "string",
- "auth_subject": "string",
- "duration_ms": 0,
- "event_time": "string",
- "id": "string",
- "ingest_time": "string",
- "interaction_id": "string",
- "model": "string",
- "outcome": "string",
- "platform_groups": [
- "string"
], - "platform_user_id": "string",
- "provider": "string",
- "raw_usage": { },
- "requested_model": "string",
- "route": "string",
- "upstream_status": 0,
- "virtual_key_id": "string"
}
], - "next_cursor": "string"
}Own budgets summary
The caller's personal day/month cards (absent when no personal budget exists at that period) and every budget cell applicable to them. Group rows expose team aggregates, never teammate records; my_contribution_usd is the caller's own share, folded from their charge records (retention-bounded).
Authorizations:
Responses
Response samples
- 200
- 401
- 500
{- "budgets": [
- {
- "limit_usd": "string",
- "my_contribution_usd": "string",
- "on_default": true,
- "ordinal": 0,
- "period": "string",
- "period_end": "string",
- "period_start": "string",
- "remaining_usd": "string",
- "scope": "string",
- "subject_id": "string",
- "used_usd": "string"
}
], - "day": {
- "budgets": 0,
- "limit_usd": "string",
- "period_end": "string",
- "period_start": "string",
- "remaining_usd": "string",
- "used_usd": "string"
}, - "month": {
- "budgets": 0,
- "limit_usd": "string",
- "period_end": "string",
- "period_start": "string",
- "remaining_usd": "string",
- "used_usd": "string"
}, - "subject": "string"
}Own daily spend series
Authorizations:
query Parameters
| granularity | string Value: "day" Bucket granularity |
| from | string Window start, ISO date (default 30 days back, including today) |
| to | string Window end (exclusive), ISO date |
| model | string Served model of the underlying event, exact match |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "buckets": [
- {
- "date": "string",
- "usd": "string"
}
], - "from": "string",
- "granularity": "string",
- "to": "string"
}Put group budget
Authorizations:
path Parameters
| id required | string Group subject_id |
header Parameters
| If-Match | string ETag from GET /v1/budgets |
Request Body schema: application/jsonrequired
Group budget specification
Responses
Request samples
- Payload
{ }Response samples
- 400
- 412
- 500
{- "error": "string"
}Put pricing catalog entry
Upsert one (provider, model) rate row. The body must carry exactly one of anthropic / openai / google. This republishes the ENTIRE merged catalog as a new operator-dated version: the first per-entry edit permanently opts this deployment out of built-in pricing baseline updates shipped in later releases, and a model only a newer baseline prices is then denied at admission as unpriceable.
Authorizations:
path Parameters
| provider required | string Literal provider to store under |
| model required | string Model name (may contain '/') |
header Parameters
| If-Match required | string ETag from GET /v1/budgets/pricing or the per-entry GET |
Request Body schema: application/jsonrequired
Rate block for this entry
Responses
Request samples
- Payload
{ }Response samples
- 400
- 404
- 409
- 412
- 428
- 500
{- "error": "string"
}Put user budget
Authorizations:
path Parameters
| id required | string User subject_id |
header Parameters
| If-Match | string ETag from GET /v1/budgets |
Request Body schema: application/jsonrequired
User budget specification
Responses
Request samples
- Payload
{ }Response samples
- 400
- 412
- 500
{- "error": "string"
}Set budgets
Authorizations:
header Parameters
| If-Match | string ETag from GET /v1/budgets |
Request Body schema: application/jsonrequired
Complete budget collection
Responses
Request samples
- Payload
{ }Response samples
- 400
- 412
- 500
{- "error": "string"
}Spend export (CSV)
A grouped, bucketed rollup of charge records as CSV, sorted bucket ascending then charged_usd descending then group key(s) ascending. A single group_by dimension renders a fixed "group_key" column; two or more render one named column per dimension, in the order given. The served window (after default/retention clamping) is echoed in the X-Spend-Export-From/To response headers. Experiment-gated; 404s when the operator has not enabled it.
Authorizations:
query Parameters
| group_by | string Comma-separated grouping dimensions, e.g. user,model. Each must be one of user, model, provider, with no repeats. Defaults to user. |
| granularity | string Enum: "day" "week" "month" Bucket width |
| from | string Window start, RFC 3339 or YYYY-MM-DD (default 30 days back, including today) |
| to | string Window end (exclusive), RFC 3339 or YYYY-MM-DD |
| model | string Filter: served model of the underlying event, exact match. Narrows which charges are included; does not change the grouping — use group_by for that |
| scope | string Enum: "user" "group" Filter: payer tier charged |
| subject_id | string Filter: payer charged, exact match |
Responses
User budget breakdown slice
A user's spend sliced by one dimension. dimension=model is the current-period spend on the user's own budget; dimension=group is every group budget the user belongs to or has contributed to (no single period window). Entries sum to total_used_usd.
Authorizations:
path Parameters
| id required | string User subject_id |
query Parameters
| dimension required | string Enum: "model" "group" Slice axis |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "dimension": "string",
- "entries": [
- {
- "used_usd": "string",
- "value": "string"
}
], - "period": "string",
- "period_end": "string",
- "period_start": "string",
- "scope": "string",
- "subject_id": "string",
- "total_used_usd": "string"
}Get enterprise configuration
Returns the signed enterprise configuration envelope for the calling client.
Authorizations:
header Parameters
| X-Client-Type required | string Enum: "toolhive-desktop" "toolhive-cli" "toolhive-cloud-ui" Client type |
| X-Client-Version required | string Client version (semver, e.g. 1.2.3) |
| If-None-Match | string ETag for conditional GET (RFC 7232) |
Responses
Response samples
- 200
- 400
- 503
{- "config": {
- "assistant": {
- "enforcement": "enforced",
- "value": true
}, - "build_env": { },
- "ca_certificate": {
- "enforcement": "enforced",
- "value": {
- "pem": "string",
- "url": "string"
}
}, - "degraded_mode": {
- "grace_period": "string",
- "message": "string",
- "policy": "warn"
}, - "gateway": {
- "enforcement": "enforced",
- "value": {
- "api_url": "string",
- "proxy_url": "string"
}
}, - "help_menu": {
- "enforcement": "enforced",
- "value": true
}, - "non_registry_servers": {
- "enforcement": "enforced",
- "value": true
}, - "playground": {
- "enforcement": "enforced",
- "value": true
}, - "registry": {
- "enforcement": "enforced",
- "value": {
- "allow_private_ip": true,
- "api_url": "string",
- "server_api_url": "string"
}
}, - "telemetry": {
- "enforcement": "enforced",
- "value": {
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "insecure": true,
- "metrics_enabled": true,
- "otel_endpoint": "string",
- "sampling_rate": 0,
- "tracing_enabled": true
}
}
}, - "degraded_mode": {
- "grace_period": "string",
- "message": "string",
- "policy": "warn"
}, - "etag": "sha256:abc123",
- "issued_at": "string",
- "not_after": "string",
- "refresh_interval": "5m0s",
- "schema_version": "1",
- "signature": "string"
}Add subgroup
Authorizations:
path Parameters
| group_id required | string Group UUID |
| child_id required | string Child group UUID |
Responses
Response samples
- 200
- 400
- 404
- 409
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Add user member
Authorizations:
path Parameters
| group_id required | string Group UUID |
| user_id required | string User UUID |
Responses
Response samples
- 200
- 400
- 404
- 409
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Create connector
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
Request Body schema: application/jsonrequired
Connector to create
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 409
- 500
{- "allow_private_ips": true,
- "auth": {
- "aws_sts": {
- "fallback_role_arn": "string",
- "provider_id": "string",
- "region": "string",
- "role_claim": "string",
- "role_mappings": [
- {
- "claim": "string",
- "matcher": "string",
- "priority": 0,
- "role_arn": "string"
}
], - "service": "string",
- "session_duration": 0,
- "session_name_claim": "string"
}, - "header_injection": {
- "header_name": "string"
}, - "obo": {
- "audience": "string",
- "authority": "string",
- "cache_skew": "string",
- "client_id": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "tenant_id": "string"
}, - "token_exchange": {
- "audience": "string",
- "client_id": "string",
- "client_secret_configured": true,
- "external_token_header_name": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "token_url": "string"
}, - "type": "none",
- "upstream_inject": {
- "provider_id": "string"
}, - "xaa": {
- "idp_client_id": "string",
- "idp_token_url": "string",
- "insecure_target_token_url": true,
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "target_audience": "string",
- "target_client_id": "string",
- "target_resource": "string",
- "target_token_url": "string"
}
}, - "created_at": "string",
- "deployment_mode": "string",
- "description": "string",
- "endpoint": "string",
- "gateway_id": "string",
- "icon_url": "string",
- "id": "string",
- "name": "string",
- "origin": "string",
- "repository_url": "string",
- "source_name": "string",
- "source_namespace": "string",
- "status": "string",
- "support_url": "string",
- "transport": "string",
- "updated_at": "string",
- "version": "string"
}Create connector identity provider
Authorizations:
Request Body schema: application/jsonrequired
Identity provider to create
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 409
- 500
{- "created_at": "string",
- "id": "string",
- "name": "string",
- "oauth2_config": {
- "authorization_endpoint": "string",
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "redirect_uri": "string",
- "scopes": [
- "string"
], - "token_endpoint": "string",
- "token_endpoint_auth_method": "string"
}, - "oidc_config": {
- "additional_authorization_params": {
- "property1": "string",
- "property2": "string"
}, - "allow_private_ips": true,
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "issuer_url": "string",
- "redirect_uri": "string",
- "scopes": [
- "string"
], - "subject_claim": "string",
- "token_endpoint_auth_method": "string"
}, - "provider_type": "string",
- "registration_mode": "string",
- "source": "string",
- "updated_at": "string"
}Create group
Authorizations:
Request Body schema: application/jsonrequired
Group to create
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Create managed secret
Authorizations:
Request Body schema: application/jsonrequired
Managed secret to create
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 409
- 500
- 503
{- "created_at": "string",
- "id": "string",
- "name": "string",
- "updated_at": "string"
}Response samples
- 200
- 400
- 404
- 500
{- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}Get connector
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
| id required | string Connector UUID |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "allow_private_ips": true,
- "auth": {
- "aws_sts": {
- "fallback_role_arn": "string",
- "provider_id": "string",
- "region": "string",
- "role_claim": "string",
- "role_mappings": [
- {
- "claim": "string",
- "matcher": "string",
- "priority": 0,
- "role_arn": "string"
}
], - "service": "string",
- "session_duration": 0,
- "session_name_claim": "string"
}, - "header_injection": {
- "header_name": "string"
}, - "obo": {
- "audience": "string",
- "authority": "string",
- "cache_skew": "string",
- "client_id": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "tenant_id": "string"
}, - "token_exchange": {
- "audience": "string",
- "client_id": "string",
- "client_secret_configured": true,
- "external_token_header_name": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "token_url": "string"
}, - "type": "none",
- "upstream_inject": {
- "provider_id": "string"
}, - "xaa": {
- "idp_client_id": "string",
- "idp_token_url": "string",
- "insecure_target_token_url": true,
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "target_audience": "string",
- "target_client_id": "string",
- "target_resource": "string",
- "target_token_url": "string"
}
}, - "created_at": "string",
- "deployment_mode": "string",
- "description": "string",
- "endpoint": "string",
- "gateway_id": "string",
- "icon_url": "string",
- "id": "string",
- "name": "string",
- "origin": "string",
- "repository_url": "string",
- "source_name": "string",
- "source_namespace": "string",
- "status": "string",
- "support_url": "string",
- "transport": "string",
- "updated_at": "string",
- "version": "string"
}Get connector identity provider
Authorizations:
path Parameters
| id required | string IdentityProvider UUID |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "created_at": "string",
- "id": "string",
- "name": "string",
- "oauth2_config": {
- "authorization_endpoint": "string",
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "redirect_uri": "string",
- "scopes": [
- "string"
], - "token_endpoint": "string",
- "token_endpoint_auth_method": "string"
}, - "oidc_config": {
- "additional_authorization_params": {
- "property1": "string",
- "property2": "string"
}, - "allow_private_ips": true,
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "issuer_url": "string",
- "redirect_uri": "string",
- "scopes": [
- "string"
], - "subject_claim": "string",
- "token_endpoint_auth_method": "string"
}, - "provider_type": "string",
- "registration_mode": "string",
- "source": "string",
- "updated_at": "string"
}Response samples
- 200
- 400
- 404
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Get group members
Authorizations:
path Parameters
| id required | string Group UUID |
query Parameters
| limit | integer Maximum items per collection (default 50, max 200) |
| users_cursor | string Opaque cursor — pages the transitive-users collection forward (mutually exclusive with users_before) |
| users_before | string Opaque cursor — pages the transitive-users collection backward (mutually exclusive with users_cursor) |
| groups_cursor | string Opaque cursor — pages the direct-child-groups collection forward (mutually exclusive with groups_before) |
| groups_before | string Opaque cursor — pages the direct-child-groups collection backward (mutually exclusive with groups_cursor) |
| active | boolean Filter the transitive-users collection by active status (direct_child_groups is unaffected) |
| search | string Case-insensitive substring search: display_name/user_name/email on the transitive-users collection, display_name/name on the direct-child-groups collection |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "direct_child_groups": [
- {
- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}
], - "next_groups_cursor": "string",
- "next_users_cursor": "string",
- "prev_groups_cursor": "string",
- "prev_users_cursor": "string",
- "transitive_users": [
- {
- "active": true,
- "created_at": "string",
- "display_name": "string",
- "email": "string",
- "id": "string",
- "photo_url": "string",
- "source": "string",
- "updated_at": "string",
- "user_name": "string"
}
]
}Response samples
- 200
- 400
- 404
- 500
{- "active": true,
- "created_at": "string",
- "display_name": "string",
- "email": "string",
- "id": "string",
- "photo_url": "string",
- "source": "string",
- "updated_at": "string",
- "user_name": "string"
}Response samples
- 200
- 400
- 404
- 500
{- "items": [
- {
- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}List connector connections
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
| id required | string Connector UUID |
Responses
Response samples
- 200
- 400
- 404
- 500
{- "items": [
- {
- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}Response samples
- 200
- 500
{- "items": [
- {
- "created_at": "string",
- "id": "string",
- "name": "string",
- "oauth2_config": {
- "authorization_endpoint": "string",
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "redirect_uri": "string",
- "scopes": [
- "string"
], - "token_endpoint": "string",
- "token_endpoint_auth_method": "string"
}, - "oidc_config": {
- "additional_authorization_params": {
- "property1": "string",
- "property2": "string"
}, - "allow_private_ips": true,
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "issuer_url": "string",
- "redirect_uri": "string",
- "scopes": [
- "string"
], - "subject_claim": "string",
- "token_endpoint_auth_method": "string"
}, - "provider_type": "string",
- "registration_mode": "string",
- "source": "string",
- "updated_at": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}List connectors
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
Responses
Response samples
- 200
- 500
{- "items": [
- {
- "allow_private_ips": true,
- "auth": {
- "aws_sts": {
- "fallback_role_arn": "string",
- "provider_id": "string",
- "region": "string",
- "role_claim": "string",
- "role_mappings": [
- {
- "claim": "string",
- "matcher": "string",
- "priority": 0,
- "role_arn": "string"
}
], - "service": "string",
- "session_duration": 0,
- "session_name_claim": "string"
}, - "header_injection": {
- "header_name": "string"
}, - "obo": {
- "audience": "string",
- "authority": "string",
- "cache_skew": "string",
- "client_id": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "tenant_id": "string"
}, - "token_exchange": {
- "audience": "string",
- "client_id": "string",
- "client_secret_configured": true,
- "external_token_header_name": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "token_url": "string"
}, - "type": "none",
- "upstream_inject": {
- "provider_id": "string"
}, - "xaa": {
- "idp_client_id": "string",
- "idp_token_url": "string",
- "insecure_target_token_url": true,
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "target_audience": "string",
- "target_client_id": "string",
- "target_resource": "string",
- "target_token_url": "string"
}
}, - "created_at": "string",
- "deployment_mode": "string",
- "description": "string",
- "endpoint": "string",
- "gateway_id": "string",
- "icon_url": "string",
- "id": "string",
- "name": "string",
- "origin": "string",
- "repository_url": "string",
- "source_name": "string",
- "source_namespace": "string",
- "status": "string",
- "support_url": "string",
- "transport": "string",
- "updated_at": "string",
- "version": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}List discovered MCP servers
Lists the MCP servers the cluster is running as candidates a connector could be admitted from, each carrying the connectors on this gateway that already hold its endpoint.
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
Responses
Response samples
- 200
- 404
- 500
- 503
{- "servers": [
- {
- "allow_private_ips": true,
- "endpoint": "string",
- "existing_connectors": [
- {
- "id": "string",
- "name": "string"
}
], - "group": "string",
- "health": "string",
- "name": "string",
- "namespace": "string",
- "transport": "string"
}
]
}List groups
Authorizations:
query Parameters
| name | string Filter by group name |
| display_name | string Filter by display name |
| source | string Filter by provisioning source (e.g. scim) |
| search | string Case-insensitive substring search across display_name and name |
| cursor | string Opaque pagination cursor — pages forward from here (mutually exclusive with before) |
| before | string Opaque pagination cursor — pages backward from here (mutually exclusive with cursor) |
| limit | integer Maximum items to return (default 50, max 200) |
Responses
Response samples
- 200
- 400
- 500
{- "items": [
- {
- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}List users
Authorizations:
query Parameters
string Filter by email address | |
| user_name | string Filter by username |
| source | string Filter by provisioning source (e.g. scim) |
| active | boolean Filter by active status |
| search | string Case-insensitive substring search across display_name, user_name, and email |
| cursor | string Opaque pagination cursor — pages forward from here (mutually exclusive with before) |
| before | string Opaque pagination cursor — pages backward from here (mutually exclusive with cursor) |
| limit | integer Maximum items to return (default 50, max 200) |
Responses
Response samples
- 200
- 400
- 500
{- "items": [
- {
- "active": true,
- "created_at": "string",
- "display_name": "string",
- "email": "string",
- "id": "string",
- "photo_url": "string",
- "source": "string",
- "updated_at": "string",
- "user_name": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}Patch group
Authorizations:
path Parameters
| id required | string Group UUID |
Request Body schema: application/jsonrequired
Fields to update
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 409
- 412
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Remove subgroup
Authorizations:
path Parameters
| group_id required | string Group UUID |
| child_id required | string Child group UUID |
Responses
Response samples
- 200
- 400
- 404
- 409
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Remove user member
Authorizations:
path Parameters
| group_id required | string Group UUID |
| user_id required | string User UUID |
Responses
Response samples
- 200
- 400
- 404
- 409
- 500
{- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}Replace a connector policy's granted user groups
Authorizations:
path Parameters
| id required | string Connector UUID |
header Parameters
| If-Match required | string ETag from GET /v1/connectors/{id}/policy |
Request Body schema: application/jsonrequired
User group ids
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 404
- 409
- 412
- 413
- 422
- 428
- 500
{- "connector_id": "string",
- "document": "string",
- "granted_user_groups": [
- {
- "id": "string",
- "name": "string"
}
], - "mode": "string"
}Revoke a user group's access to a connector
Authorizations:
path Parameters
| id required | string Connector UUID |
| group_id required | string User group UUID |
Responses
Response samples
- 200
- 400
- 404
- 409
- 412
- 500
{- "connector_id": "string",
- "document": "string",
- "granted_user_groups": [
- {
- "id": "string",
- "name": "string"
}
], - "mode": "string"
}Set a connector policy's Cedar document
Authorizations:
path Parameters
| id required | string Connector UUID |
Request Body schema: application/jsonrequired
Cedar document
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 404
- 409
- 412
- 413
- 422
- 500
{- "connector_id": "string",
- "document": "string",
- "granted_user_groups": [
- {
- "id": "string",
- "name": "string"
}
], - "mode": "string"
}Switch a connector policy back to structured authoring mode
Authorizations:
path Parameters
| id required | string Connector UUID |
Responses
Response samples
- 200
- 400
- 404
- 412
- 500
{- "connector_id": "string",
- "document": "string",
- "granted_user_groups": [
- {
- "id": "string",
- "name": "string"
}
], - "mode": "string"
}Switch a connector policy to Cedar authoring mode
Authorizations:
path Parameters
| id required | string Connector UUID |
Responses
Response samples
- 200
- 400
- 404
- 412
- 500
{- "connector_id": "string",
- "document": "string",
- "granted_user_groups": [
- {
- "id": "string",
- "name": "string"
}
], - "mode": "string"
}Update connector
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
| id required | string Connector UUID |
Request Body schema: application/jsonrequired
Connector's new state
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 404
- 409
- 500
{- "allow_private_ips": true,
- "auth": {
- "aws_sts": {
- "fallback_role_arn": "string",
- "provider_id": "string",
- "region": "string",
- "role_claim": "string",
- "role_mappings": [
- {
- "claim": "string",
- "matcher": "string",
- "priority": 0,
- "role_arn": "string"
}
], - "service": "string",
- "session_duration": 0,
- "session_name_claim": "string"
}, - "header_injection": {
- "header_name": "string"
}, - "obo": {
- "audience": "string",
- "authority": "string",
- "cache_skew": "string",
- "client_id": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "tenant_id": "string"
}, - "token_exchange": {
- "audience": "string",
- "client_id": "string",
- "client_secret_configured": true,
- "external_token_header_name": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "token_url": "string"
}, - "type": "none",
- "upstream_inject": {
- "provider_id": "string"
}, - "xaa": {
- "idp_client_id": "string",
- "idp_token_url": "string",
- "insecure_target_token_url": true,
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "target_audience": "string",
- "target_client_id": "string",
- "target_resource": "string",
- "target_token_url": "string"
}
}, - "created_at": "string",
- "deployment_mode": "string",
- "description": "string",
- "endpoint": "string",
- "gateway_id": "string",
- "icon_url": "string",
- "id": "string",
- "name": "string",
- "origin": "string",
- "repository_url": "string",
- "source_name": "string",
- "source_namespace": "string",
- "status": "string",
- "support_url": "string",
- "transport": "string",
- "updated_at": "string",
- "version": "string"
}Update connector identity provider
Authorizations:
path Parameters
| id required | string IdentityProvider UUID |
Request Body schema: application/jsonrequired
Identity provider's new state
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 404
- 409
- 500
{- "created_at": "string",
- "id": "string",
- "name": "string",
- "oauth2_config": {
- "authorization_endpoint": "string",
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "redirect_uri": "string",
- "scopes": [
- "string"
], - "token_endpoint": "string",
- "token_endpoint_auth_method": "string"
}, - "oidc_config": {
- "additional_authorization_params": {
- "property1": "string",
- "property2": "string"
}, - "allow_private_ips": true,
- "client_id": "string",
- "client_secret": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "dcr": {
- "discovery_url": "string",
- "initial_access_token": {
- "kubernetes_secret": {
- "key": "string",
- "name": "string",
- "namespace": "string"
}, - "managed_secret_id": "string"
}, - "registration_endpoint": "string",
- "software_id": "string",
- "software_statement": "string"
}, - "issuer_url": "string",
- "redirect_uri": "string",
- "scopes": [
- "string"
], - "subject_claim": "string",
- "token_endpoint_auth_method": "string"
}, - "provider_type": "string",
- "registration_mode": "string",
- "source": "string",
- "updated_at": "string"
}OAuth protected resource metadata
Returns RFC 9728 metadata describing this protected resource.
Responses
Response samples
- 200
{- "authorization_servers": [
- "string"
], - "bearer_methods_supported": [
- "string"
], - "jwks_uri": "string",
- "resource": "string",
- "scopes_supported": [
- "string"
]
}ToolHive configuration discovery
Returns a discovery document for ToolHive client bootstrap.
Responses
Response samples
- 200
{- "client_id": "string",
- "config_endpoint": "string",
- "issuer": "string",
- "jwks_uri": "string",
- "oauth_protected_resource": "string",
- "scopes_supported": [
- "string"
]
}Create a virtual API key
Mints a key tied to the authenticated caller's OIDC identity. The full plaintext secret is returned ONLY in this response — it is never retrievable afterwards. Ownership is derived from the caller's token, not the request body.
Authorizations:
Request Body schema: application/jsonrequired
Key creation parameters
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 401
- 500
{- "key": {
- "created_at": "string",
- "created_by": "string",
- "expires_at": "string",
- "id": "string",
- "last_used_at": "string",
- "metadata": {
- "property1": "string",
- "property2": "string"
}, - "name": "string",
- "owner_ref": "string",
- "prefix": "string",
- "status": "string"
}, - "secret": "string"
}Get one of the caller's virtual API keys
Never includes key secrets or hashes. Returns 404 (not 403) when the id exists but is owned by another caller, so key existence is not leaked across owners.
Authorizations:
path Parameters
| id required | string Key short ID |
Responses
Response samples
- 200
- 401
- 404
- 500
{- "created_at": "string",
- "created_by": "string",
- "expires_at": "string",
- "id": "string",
- "last_used_at": "string",
- "metadata": {
- "property1": "string",
- "property2": "string"
}, - "name": "string",
- "owner_ref": "string",
- "prefix": "string",
- "status": "string"
}List the caller's virtual API keys
Returns every key owned by the authenticated caller. Never includes key secrets or hashes.
Authorizations:
Responses
Response samples
- 200
- 401
- 500
{- "keys": [
- {
- "created_at": "string",
- "created_by": "string",
- "expires_at": "string",
- "id": "string",
- "last_used_at": "string",
- "metadata": {
- "property1": "string",
- "property2": "string"
}, - "name": "string",
- "owner_ref": "string",
- "prefix": "string",
- "status": "string"
}
]
}Re-enable one of the caller's disabled virtual API keys
Moves a disabled key back to active. Re-enabling a revoked key is rejected with 409 — revocation is permanent.
Authorizations:
path Parameters
| id required | string Key short ID |
Responses
Response samples
- 401
- 404
- 409
- 500
{- "error": "string"
}Rotate one of the caller's virtual API keys
Generates a new secret for the same key ID. The old secret keeps validating for a 24h grace period so in-flight callers can pick up the new secret. The new plaintext secret is returned only once.
Authorizations:
path Parameters
| id required | string Key short ID |
Responses
Response samples
- 200
- 401
- 404
- 500
{- "key": {
- "created_at": "string",
- "created_by": "string",
- "expires_at": "string",
- "id": "string",
- "last_used_at": "string",
- "metadata": {
- "property1": "string",
- "property2": "string"
}, - "name": "string",
- "owner_ref": "string",
- "prefix": "string",
- "status": "string"
}, - "secret": "string"
}Create my connection
Authorizations:
Request Body schema: application/jsonrequired
Connection to create
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 401
- 403
- 404
- 409
- 500
{- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}Enable or disable my connection
Authorizations:
path Parameters
| id required | string Connection UUID |
Request Body schema: application/jsonrequired
New enablement
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 401
- 403
- 404
- 500
{- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}Get a Connector visible to me
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
| id required | string Connector UUID |
Responses
Response samples
- 200
- 400
- 401
- 403
- 404
- 500
{- "allow_private_ips": true,
- "auth": {
- "aws_sts": {
- "fallback_role_arn": "string",
- "provider_id": "string",
- "region": "string",
- "role_claim": "string",
- "role_mappings": [
- {
- "claim": "string",
- "matcher": "string",
- "priority": 0,
- "role_arn": "string"
}
], - "service": "string",
- "session_duration": 0,
- "session_name_claim": "string"
}, - "header_injection": {
- "header_name": "string"
}, - "obo": {
- "audience": "string",
- "authority": "string",
- "cache_skew": "string",
- "client_id": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "tenant_id": "string"
}, - "token_exchange": {
- "audience": "string",
- "client_id": "string",
- "client_secret_configured": true,
- "external_token_header_name": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "token_url": "string"
}, - "type": "none",
- "upstream_inject": {
- "provider_id": "string"
}, - "xaa": {
- "idp_client_id": "string",
- "idp_token_url": "string",
- "insecure_target_token_url": true,
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "target_audience": "string",
- "target_client_id": "string",
- "target_resource": "string",
- "target_token_url": "string"
}
}, - "created_at": "string",
- "deployment_mode": "string",
- "description": "string",
- "endpoint": "string",
- "gateway_id": "string",
- "icon_url": "string",
- "id": "string",
- "name": "string",
- "origin": "string",
- "repository_url": "string",
- "source_name": "string",
- "source_namespace": "string",
- "status": "string",
- "support_url": "string",
- "transport": "string",
- "updated_at": "string",
- "version": "string"
}Get my connection
Authorizations:
path Parameters
| id required | string Connection UUID |
Responses
Response samples
- 200
- 400
- 401
- 403
- 404
- 500
{- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}Get the caller's own directory profile
Returns the authenticated caller's directory profile and transitive group membership, resolved from their verified token rather than a path parameter. An authenticated caller with no directory binding (never provisioned, or deactivated) gets 200 with an empty group list, not a 404 — a miss is not a failure. subject and issuer are always present since they come from the verified token; echoing issuer lets a caller self-diagnose a cross-issuer provisioning gap.
Authorizations:
Responses
Response samples
- 200
- 401
- 500
{- "active": true,
- "display_name": "string",
- "email": "string",
- "groups": [
- {
- "created_at": "string",
- "description": "string",
- "display_name": "string",
- "id": "string",
- "members": [
- {
- "display": "string",
- "id": "string",
- "type": "string"
}
], - "name": "string",
- "source": "string",
- "transitive_member_count": 0,
- "updated_at": "string"
}
], - "id": "string",
- "issuer": "string",
- "source": "string",
- "subject": "string",
- "user_name": "string"
}List Connectors visible to me
Authorizations:
path Parameters
| gateway_id required | string Connector-gateway install id |
query Parameters
| cursor | string Opaque pagination cursor — pages forward from here (mutually exclusive with before) |
| before | string Opaque pagination cursor — pages backward from here (mutually exclusive with cursor) |
| limit | integer Maximum items to return (default 20, max 200) |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "items": [
- {
- "allow_private_ips": true,
- "auth": {
- "aws_sts": {
- "fallback_role_arn": "string",
- "provider_id": "string",
- "region": "string",
- "role_claim": "string",
- "role_mappings": [
- {
- "claim": "string",
- "matcher": "string",
- "priority": 0,
- "role_arn": "string"
}
], - "service": "string",
- "session_duration": 0,
- "session_name_claim": "string"
}, - "header_injection": {
- "header_name": "string"
}, - "obo": {
- "audience": "string",
- "authority": "string",
- "cache_skew": "string",
- "client_id": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "tenant_id": "string"
}, - "token_exchange": {
- "audience": "string",
- "client_id": "string",
- "client_secret_configured": true,
- "external_token_header_name": "string",
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "token_url": "string"
}, - "type": "none",
- "upstream_inject": {
- "provider_id": "string"
}, - "xaa": {
- "idp_client_id": "string",
- "idp_token_url": "string",
- "insecure_target_token_url": true,
- "provider_id": "string",
- "scopes": [
- "string"
], - "subject_token_type": "string",
- "target_audience": "string",
- "target_client_id": "string",
- "target_resource": "string",
- "target_token_url": "string"
}
}, - "created_at": "string",
- "deployment_mode": "string",
- "description": "string",
- "endpoint": "string",
- "gateway_id": "string",
- "icon_url": "string",
- "id": "string",
- "name": "string",
- "origin": "string",
- "repository_url": "string",
- "source_name": "string",
- "source_namespace": "string",
- "status": "string",
- "support_url": "string",
- "transport": "string",
- "updated_at": "string",
- "version": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}List my connections
Authorizations:
query Parameters
| gateway_id | string Narrow to Connections on one gateway install |
| cursor | string Opaque pagination cursor — pages forward from here (mutually exclusive with before) |
| before | string Opaque pagination cursor — pages backward from here (mutually exclusive with cursor) |
| limit | integer Maximum items to return (default 20, max 200) |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "items": [
- {
- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}
], - "next_cursor": "string",
- "prev_cursor": "string"
}Set my connection's tool narrowing
Authorizations:
path Parameters
| id required | string Connection UUID |
Request Body schema: application/jsonrequired
New tool policy
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 401
- 403
- 404
- 413
- 500
{- "connector_id": "string",
- "created_at": "string",
- "enabled": true,
- "gateway_id": "string",
- "id": "string",
- "tools_enabled_by_default": true,
- "tools_exception_list": [
- "string"
], - "updated_at": "string",
- "user_id": "string"
}Connector tool-call activity
Authorizations:
path Parameters
| id required | string Connector id |
query Parameters
| gateway_id required | string connector-gateway instance id |
| user_id | string Platform user id (UUID); narrows to one user's calls |
| outcome | string Enum: "ok" "error" Outcome filter |
| decision | string Enum: "allowed" "denied" Decision filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
| cursor | string Opaque keyset cursor from a previous page, pages forward (older) |
| before | string Opaque keyset cursor from a previous page, pages backward (newer); mutually exclusive with cursor |
| limit | integer Page size (default 50, max 500, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "next_cursor": "string",
- "prev_cursor": "string",
- "records": [
- {
- "billable": true,
- "billable_reason": "string",
- "call_id": "string",
- "category": "string",
- "connector_id": "string",
- "connector_name": "string",
- "decision": "string",
- "definition_version": "string",
- "environment": "string",
- "gateway_id": "string",
- "groups": [
- {
- "id": "string",
- "name": "string"
}
], - "occurred_at": "string",
- "outcome": "string",
- "tool_name": "string",
- "user_email": "string",
- "user_id": "string"
}
]
}Connector usage
Authorizations:
path Parameters
| id required | string Connector id |
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
Responses
Response samples
- 200
- 400
- 500
{- "connector_id": "string",
- "connector_name": "string",
- "group_series": [
- {
- "group": {
- "id": "string",
- "name": "string"
}, - "points": [
- {
- "bucket_start": "string",
- "tool_call_count": 0
}
]
}
], - "tool_call_count": 0
}My tool-call activity
Authorizations:
query Parameters
| gateway_id required | string connector-gateway instance id |
| connector_id required | string Connector id |
| outcome | string Enum: "ok" "error" Outcome filter |
| decision | string Enum: "allowed" "denied" Decision filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
| cursor | string Opaque keyset cursor from a previous page, pages forward (older) |
| before | string Opaque keyset cursor from a previous page, pages backward (newer); mutually exclusive with cursor |
| limit | integer Page size (default 50, max 500, clamped) |
Responses
Response samples
- 200
- 400
- 401
- 500
{- "next_cursor": "string",
- "prev_cursor": "string",
- "records": [
- {
- "billable": true,
- "billable_reason": "string",
- "call_id": "string",
- "category": "string",
- "connector_id": "string",
- "connector_name": "string",
- "decision": "string",
- "definition_version": "string",
- "environment": "string",
- "gateway_id": "string",
- "groups": [
- {
- "id": "string",
- "name": "string"
}
], - "occurred_at": "string",
- "outcome": "string",
- "tool_name": "string",
- "user_email": "string",
- "user_id": "string"
}
]
}Per-event usage export
Authorizations:
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
| cursor | string Opaque keyset cursor from a previous page |
| limit | integer Page size (default 50, max 500, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "checkpoints": [
- {
- "chain_hash": "string",
- "chain_id": "string",
- "hash_alg": "string",
- "key_id": "string",
- "sequence": 0,
- "sig_alg": "string",
- "signature": "string",
- "signed_at": "string"
}
], - "next_cursor": "string",
- "records": [
- {
- "chain_id": "string",
- "id": "string",
- "prev_hash": "string",
- "record_hash": "string",
- "sequence": 0,
- "usage": {
- "billable": true,
- "billable_reason": "string",
- "call_id": "string",
- "category": "string",
- "connector_id": "string",
- "connector_name": "string",
- "decision": "string",
- "definition_version": "string",
- "environment": "string",
- "gateway_id": "string",
- "groups": [
- {
- "id": "string",
- "name": "string"
}
], - "occurred_at": "string",
- "outcome": "string",
- "tool_name": "string",
- "user_email": "string",
- "user_id": "string"
}
}
]
}Top connectors
Authorizations:
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
| limit | integer Max entries (default 10, max 100, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "connectors": [
- {
- "connector_id": "string",
- "connector_name": "string",
- "tool_call_count": 0
}
]
}Top tools
Authorizations:
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
| limit | integer Max entries (default 10, max 100, clamped) |
Responses
Response samples
- 200
- 400
- 500
{- "tools": [
- {
- "connector_id": "string",
- "connector_name": "string",
- "tool_call_count": 0,
- "tool_name": "string"
}
]
}Usage summary
Authorizations:
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
Responses
Response samples
- 200
- 400
- 500
{- "active_user_count": 0,
- "tool_call_count": 0
}Usage time series
Authorizations:
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start | string Window start, RFC 3339 (default: unbounded) |
| end | string Window end, RFC 3339, exclusive (default: unbounded) |
| dimension | string Enum: "environment" "tool" "decision" "connector" Breakdown dimension |
Responses
Response samples
- 200
- 400
- 500
{- "bucket_width_seconds": 0,
- "buckets": [
- {
- "breakdown": [
- {
- "key": "string",
- "tool_call_count": 0
}
], - "bucket_start": "string",
- "tool_call_count": 0
}
], - "dimension": "string"
}User usage
Authorizations:
path Parameters
| id required | string Platform user id (UUID) |
query Parameters
| gateway_id required | string connector-gateway instance id |
| environment | string Deployment environment filter |
| start required | string Window start, RFC 3339 |
| end required | string Window end, RFC 3339, exclusive |
Responses
Response samples
- 200
- 400
- 500
{- "connectors": [
- {
- "connector_id": "string",
- "connector_name": "string",
- "last_activity": "string",
- "tool_call_count": 0,
- "tools": [
- {
- "last_activity": "string",
- "tool_call_count": 0,
- "tool_name": "string"
}
]
}
], - "last_activity": "string",
- "series": [
- {
- "bucket_start": "string",
- "tool_call_count": 0
}
], - "tool_call_count": 0,
- "user_id": "string"
}Connector Gateway
The Connector Gateway API covers connector enablement and per-user authorization state. See Configure the Connector Gateway.
Connector Gateway API (0.1.0)
Download OpenAPI specification:Download
Stacklok connector-gateway control-plane — user-self API to view and toggle the caller's MCP connectors.
Clear a connector's explicit state (revert to default)
path Parameters
| connector_id required | string Connector (vmcp backend) ID |
header Parameters
| If-Match required | string Current connector ETag. Missing -> 428; stale -> 412. |
Responses
Response samples
- 401
- 412
- 428
- 500
- 501
{- "error": "string"
}List a Connector's Tools
path Parameters
| connector_id required | string Connector (Directory connectors.id) UUID |
Responses
Response samples
- 200
- 400
- 401
- 404
- 502
{- "tools": [
- {
- "description": "string",
- "destructive_hint": true,
- "input_schema": {
- "property1": null,
- "property2": null
}, - "name": "string",
- "read_only_hint": true
}
]
}Set a connector's enable/disable state
path Parameters
| connector_id required | string Connector (vmcp backend) ID |
header Parameters
| If-Match required | string Current connector ETag. Missing -> 428; stale -> 412. |
Request Body schema: application/jsonrequired
Desired state
Responses
Request samples
- Payload
{ }Response samples
- 200
- 400
- 401
- 412
- 428
- 500
- 501
{- "connector_id": "string",
- "enabled": true,
- "updated_at": "string"
}AI Gateway management
The AI Gateway management API updates custom resources through the Kubernetes API. See Configure the AI Gateway.
For task-oriented AI Gateway configuration, see AI Gateway.
AI Gateway Management API (0.1.0)
Download OpenAPI specification:Download
Admin-scoped HTTP API backing the help-desk UI. The server is a thin
facade over the Kubernetes API: write endpoints translate to typed
AIPolicy CR create/update/delete calls via controller-runtime, and
introspection endpoints read from the same cache. No parallel store.
Each API server instance is bound to exactly one Kubernetes namespace
(configured via operator flag) and all AIPolicy CRs live in that
namespace. The namespace is therefore not in the URL path; multi-
namespace deployments run multiple API instances. A future major version
may introduce /v1/namespaces/{ns}/... if multi-tenant scoping is
required; clients should treat the current paths as namespace-local.
GET on a single policy returns an ETag header whose value is the
quoted metadata.resourceVersion. PATCH and DELETE both
require the If-Match header. Concurrency failures use distinct
status codes so the UI can branch without parsing error strings:
- 428 Precondition Required (RFC 6585) —
If-Matchheader is missing. This is a client bug; UIs should surface it as a dev-tools error rather than a user-facing "policy changed" dialog. - 412 Precondition Failed (RFC 7232) —
If-Matchwas sent but the value no longer matches the server'sresourceVersion(another admin edited concurrently). UIs should re-fetch and offer a merge/overwrite flow. - 409 Conflict — reserved for
POSTwith ametadata.namethat already exists. UIs should prompt for a different name.
List all MCP servers visible to the gateway.
Forward-compatible; always returns an empty items array in
Phase 8. Enforcement lands in a later phase.
Authorizations:
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 200
- 401
- 429
- 503
{- "items": [
- {
- "description": "string",
- "name": "string",
- "ready": true
}
]
}List all models visible to the gateway in the current namespace.
Derived from the owning AIGateway's spec.routes[].match.model.
Deduplicated and sorted by model id, OpenAI-shaped
(object:"list", data[]) to match the data-plane
GET /v1/models intercept.
Authorizations:
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 200
- 400
- 401
- 403
- 404
- 429
- 503
{- "data": [
- {
- "context_window": 200000,
- "created": 1690000000,
- "display_name": "string",
- "id": "openai/gpt-4o-mini",
- "object": "model",
- "owned_by": "openai"
}
], - "object": "list"
}Return the owning gateway's identity.
Returns the AIGateway name and namespace this api-key-service serves. Sourced from the operator-injected GATEWAY_NAME / GATEWAY_NAMESPACE — authoritative and unambiguous.
Authorizations:
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 200
- 401
{- "name": "prod-gateway",
- "namespace": "llm-gateway"
}Return the caller's identity and resolved policy bindings.
Returns subject, groups, resolved roles, the set of AIPolicies whose principalMatchers the caller satisfies, and the union of models granted by those policies' budgets. Matched-only — the response never includes policies the caller does not match.
Authorizations:
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 200
- 401
- 403
- 429
- 503
{- "email": "admin@example.com",
- "groups": [
- "string"
], - "matchedPolicies": [
- {
- "description": "string",
- "mcpPolicy": {
- "servers": [
- "string"
]
}, - "name": "string"
}
], - "models": [
- "string"
], - "roles": [
- "string"
], - "subject": "github|42",
- "unrestrictedModels": false
}Create a new AIPolicy.
Use metadata.name as the idempotency key. Retrying a POST
with the same name returns 409 Conflict; clients should treat
this as either a duplicate submission (succeeded previously) or
a deliberate collision (surface to the user).
Authorizations:
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Request Body schema: application/jsonrequired
Full AIPolicy object. metadata.namespace is ignored; the server's configured namespace wins.
Responses
Request samples
- Payload
{ }Response samples
- 201
- 400
- 401
- 403
- 409
- 422
- 429
- 503
{- "apiVersion": "string",
- "kind": "string",
- "metadata": {
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "creationTimestamp": "2019-08-24T14:15:22Z",
- "deletionGracePeriodSeconds": 0,
- "deletionTimestamp": "2019-08-24T14:15:22Z",
- "generation": 0,
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "main-budget",
- "namespace": "string",
- "resourceVersion": "string",
- "uid": "07cc67f4-45d6-494b-adac-09b5cbc7e2b5"
}, - "spec": {
- "description": "string",
- "gatewayRef": {
- "name": "main"
}, - "mcpPolicy": {
- "servers": [
- "string"
]
}, - "principalMatchers": [
- {
- "claims": {
- "property1": "string",
- "property2": "string"
}
}
]
}, - "status": {
- "appliedToSecurityPolicy": "string",
- "conditions": [
- {
- "lastTransitionTime": "2019-08-24T14:15:22Z",
- "message": "string",
- "observedGeneration": 0,
- "reason": "string",
- "status": "True",
- "type": "string"
}
], - "observedGeneration": 0
}
}Delete an AIPolicy.
If-Match is required; missing returns 428 and stale returns 412, so accidental wipes during a concurrent edit never silently succeed.
Authorizations:
path Parameters
| name required | string Policy name. |
header Parameters
| If-Match required | string Quoted resourceVersion from a preceding GET. Required. |
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 401
- 403
- 404
- 412
- 428
- 429
- 503
{- "error": "unauthenticated",
- "requestId": "e7c61d23-0b1a-4d3e-8a0b-18d4f1d7e2c3",
- "violations": [
- {
- "field": "/spec/principalMatchers/0/claims",
- "message": "must contain at least one entry"
}
]
}Get a single AIPolicy by name.
Authorizations:
path Parameters
| name required | string Policy name (DNS-1123 subdomain, max 253 chars). |
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 200
- 401
- 403
- 404
- 429
- 503
{- "apiVersion": "string",
- "kind": "string",
- "metadata": {
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "creationTimestamp": "2019-08-24T14:15:22Z",
- "deletionGracePeriodSeconds": 0,
- "deletionTimestamp": "2019-08-24T14:15:22Z",
- "generation": 0,
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "main-budget",
- "namespace": "string",
- "resourceVersion": "string",
- "uid": "07cc67f4-45d6-494b-adac-09b5cbc7e2b5"
}, - "spec": {
- "description": "string",
- "gatewayRef": {
- "name": "main"
}, - "mcpPolicy": {
- "servers": [
- "string"
]
}, - "principalMatchers": [
- {
- "claims": {
- "property1": "string",
- "property2": "string"
}
}
]
}, - "status": {
- "appliedToSecurityPolicy": "string",
- "conditions": [
- {
- "lastTransitionTime": "2019-08-24T14:15:22Z",
- "message": "string",
- "observedGeneration": 0,
- "reason": "string",
- "status": "True",
- "type": "string"
}
], - "observedGeneration": 0
}
}List AIPolicies in the configured namespace.
Returns a page of AIPolicies. limit caps the underlying
apiserver page size (max 500; larger values are clamped).
pageToken resumes a prior list at the next page boundary.
labelSelector accepts the standard apimachinery selector
syntax (e.g., team=eng,tier!=internal). gatewayRef is a
post-list filter applied to the returned page; when used with
limit, the returned page may contain fewer matches than the
limit — callers must keep paging while nextPageToken is
non-empty to enumerate every match. When labelSelector is
set, the apiserver omits remainingItemCount (per the
Kubernetes API spec: the remaining count is unknown for
selector-filtered lists), so the field will be absent on the
response regardless of how many pages remain. A
present-but-empty value for limit, pageToken, or
labelSelector (e.g., ?limit=) is equivalent to the
parameter being absent and uses the server default for that
parameter — empty is not "explicitly clear this filter".
Authorizations:
query Parameters
| limit | integer Max items per page (1..500). Values above 500 are clamped to 500; 0 or omitted uses the server default (500). |
| pageToken | string Opaque continue token from a previous response. An expired or malformed token returns 400; restart the list from page one. |
| labelSelector | string Kubernetes label selector (e.g., team=eng,tier!=internal). Malformed selectors return 400. |
| gatewayRef | string Restrict to policies targeting this AIGateway name. Applied as a post-list filter; may reduce the returned page size below limit. |
header Parameters
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Responses
Response samples
- 200
- 400
- 401
- 403
- 429
- 503
{- "apiVersion": "string",
- "items": [
- {
- "apiVersion": "string",
- "kind": "string",
- "metadata": {
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "creationTimestamp": "2019-08-24T14:15:22Z",
- "deletionGracePeriodSeconds": 0,
- "deletionTimestamp": "2019-08-24T14:15:22Z",
- "generation": 0,
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "main-budget",
- "namespace": "string",
- "resourceVersion": "string",
- "uid": "07cc67f4-45d6-494b-adac-09b5cbc7e2b5"
}, - "spec": {
- "description": "string",
- "gatewayRef": {
- "name": "main"
}, - "mcpPolicy": {
- "servers": [
- "string"
]
}, - "principalMatchers": [
- {
- "claims": {
- "property1": "string",
- "property2": "string"
}
}
]
}, - "status": {
- "appliedToSecurityPolicy": "string",
- "conditions": [
- {
- "lastTransitionTime": "2019-08-24T14:15:22Z",
- "message": "string",
- "observedGeneration": 0,
- "reason": "string",
- "status": "True",
- "type": "string"
}
], - "observedGeneration": 0
}
}
], - "kind": "string",
- "nextPageToken": "string",
- "remainingItemCount": 0
}Update an AIPolicy using JSON merge patch.
Patches are applied against spec only; any status or
metadata.resourceVersion sent in the body is ignored (use
If-Match for optimistic concurrency). spec.gatewayRef is
immutable after creation; attempting to modify it returns 422.
Authorizations:
path Parameters
| name required | string Policy name. |
header Parameters
| If-Match required | string Quoted resourceVersion from a preceding GET. Required: missing returns 428 Precondition Required; stale returns 412 Precondition Failed. |
| X-Request-Id | string Correlation ID; echoed on responses and included in audit records. |
Request Body schema: required
RFC 7396 JSON merge patch; only /spec may be patched.
object (AIPolicySpecPatch) | |||||||
| |||||||
Responses
Request samples
- Payload
{- "spec": {
- "description": "string",
- "mcpPolicy": {
- "servers": [
- "string"
]
}, - "principalMatchers": [
- {
- "claims": {
- "property1": "string",
- "property2": "string"
}
}
]
}
}Response samples
- 200
- 400
- 401
- 403
- 404
- 412
- 422
- 428
- 429
- 503
{- "apiVersion": "string",
- "kind": "string",
- "metadata": {
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "creationTimestamp": "2019-08-24T14:15:22Z",
- "deletionGracePeriodSeconds": 0,
- "deletionTimestamp": "2019-08-24T14:15:22Z",
- "generation": 0,
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "main-budget",
- "namespace": "string",
- "resourceVersion": "string",
- "uid": "07cc67f4-45d6-494b-adac-09b5cbc7e2b5"
}, - "spec": {
- "description": "string",
- "gatewayRef": {
- "name": "main"
}, - "mcpPolicy": {
- "servers": [
- "string"
]
}, - "principalMatchers": [
- {
- "claims": {
- "property1": "string",
- "property2": "string"
}
}
]
}, - "status": {
- "appliedToSecurityPolicy": "string",
- "conditions": [
- {
- "lastTransitionTime": "2019-08-24T14:15:22Z",
- "message": "string",
- "observedGeneration": 0,
- "reason": "string",
- "status": "True",
- "type": "string"
}
], - "observedGeneration": 0
}
}