- AI Gateway
- 1.2.0
- Management API
LLM Proxy Management¶
CRUD operations for LLM Proxy configurations
Create a new LLM proxy¶
POST /llm-proxies
Code samples
curl -X POST http://localhost:9090/api/management/v1/llm-proxies \
-u {username}:{password} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d @payload.json
Add a new LLM proxy to the Gateway. A proxy defines how to interact with an LLM service deployed in the Gateway, including authentication and policies.
Payload
{
"apiVersion": "gateway.api-platform.wso2.com/v1",
"kind": "LlmProxy",
"metadata": {
"name": "openai-proxy"
},
"spec": {
"displayName": "OpenAI Proxy",
"version": "v1.0",
"context": "/openai-proxy",
"provider": {
"id": "wso2-openai-provider"
},
"policies": []
}
}
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | LLMProxyConfigurationRequest | true | LLM proxy in YAML or JSON format |
Example responses
201 Response
{
"apiVersion": "gateway.api-platform.wso2.com/v1",
"kind": "LlmProxy",
"metadata": {
"name": "openai-proxy"
},
"spec": {
"displayName": "OpenAI Proxy",
"version": "v1.0",
"context": "/openai-proxy",
"provider": {
"id": "wso2-openai-provider"
},
"policies": []
},
"status": {
"id": "openai-proxy",
"state": "deployed",
"createdAt": "2026-04-24T07:21:13Z",
"updatedAt": "2026-04-24T07:21:13Z",
"deployedAt": "2026-04-24T07:21:13Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | LLM proxy created and deployed successfully | LLMProxyConfiguration |
| 400 | Bad Request | Invalid configuration (validation failed) | ErrorResponse |
| 409 | Conflict | Conflict - Proxy with same name and version already exists | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
List all LLM proxies¶
GET /llm-proxies
Code samples
curl -X GET http://localhost:9090/api/management/v1/llm-proxies \
-u {username}:{password} \
-H 'Accept: application/json'
List LLM proxies registered in the Gateway, optionally filtered by name, version, context, status, or vhost.
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| displayName | query | string | false | Filter by LLM proxy displayName |
| version | query | string | false | Filter by LLM proxy version |
| context | query | string | false | Filter by LLM proxy context/path |
| status | query | string | false | Filter by deployment status |
| vhost | query | string | false | Filter by LLM proxy vhost |
Enumerated Values
| Parameter | Value |
|---|---|
| status | deployed |
| status | undeployed |
Example responses
200 Response
{
"status": "success",
"count": 2,
"proxies": [
{
"apiVersion": "gateway.api-platform.wso2.com/v1",
"kind": "LlmProxy",
"metadata": {
"name": "openai-proxy"
},
"spec": {
"displayName": "OpenAI Proxy",
"version": "v1.0",
"context": "/openai-proxy",
"provider": {
"id": "wso2-openai-provider"
},
"policies": []
},
"status": {
"id": "openai-proxy",
"state": "deployed",
"createdAt": "2026-04-24T07:21:13Z",
"updatedAt": "2026-04-24T07:21:13Z",
"deployedAt": "2026-04-24T07:21:13Z"
}
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | List of LLM proxies | Inline |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
| count | integer | false | none | none |
| proxies | [allOf] | false | none | none |
allOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | LLMProxyConfigurationRequest | false | none | none |
| apiVersion | string | true | none | Proxy specification version |
| kind | string | true | none | Proxy kind |
| metadata | Metadata | true | none | none |
| name | string | true | none | Unique handle for the resource |
| labels | object | false | none | Labels are key-value pairs for organizing and selecting APIs. Keys must not contain spaces. |
| additionalProperties | string | false | none | none |
| annotations | object | false | none | Annotations are arbitrary non-identifying metadata. Use domain-prefixed keys. |
| additionalProperties | string | false | none | none |
| spec | LLMProxyConfigData | true | none | none |
| displayName | string | true | none | Human-readable LLM proxy name (must be URL-friendly - only letters, numbers, spaces, hyphens, underscores, and dots allowed) |
| version | string | true | none | Semantic version of the LLM proxy |
| context | string | false | none | Base path for all API routes (must start with /, no trailing slash) |
| vhost | string | false | none | Virtual host name used for routing. Supports standard domain names, subdomains, or wildcard domains. Must follow RFC-compliant hostname rules. Wildcards are only allowed in the left-most label (e.g., *.example.com). |
| provider | LLMProxyProvider | true | none | none |
| id | string | true | none | Unique id of a deployed llm provider |
| auth | LLMUpstreamAuth | false | none | none |
| type | string | true | none | none |
| header | string | false | none | none |
| value | string | false | write-only | Upstream credential. Write-only: accepted on create/update and never returned by the management API on a read, for any role. An update that omits it inherits the stored value; set type: none to remove auth. |
| globalPolicies | [Policy] | false | none | Global (api-level) policies applied across ALL operations as one shared scope, evaluated before operation-level policies. |
| name | string | true | none | Name of the policy |
| version | string | true | none | Version of the policy. Only major-only version is allowed (e.g., v0, v1). Full semantic version (e.g., v1.0.0) is not accepted and will be rejected. The Gateway Controller resolves the major version to the single matching full version installed in the gateway image. |
| executionCondition | string | false | none | Expression controlling conditional execution of the policy |
| params | object | false | none | Arbitrary parameters for the policy (free-form key/value structure) |
| operationPolicies | [OperationPolicy] | false | none | Operation-level policies scoped to specific paths/methods, evaluated after global policies. |
| name | string | true | none | none |
| version | string | true | none | none |
| executionCondition | string | false | none | Expression controlling conditional execution of the policy |
| paths | [OperationPolicyPath] | true | none | none |
| path | string | true | none | none |
| methods | [string] | true | none | none |
| params | object | true | none | JSON Schema describing the parameters accepted by this policy. This itself is a JSON Schema document. |
| additionalProviders | [LLMProxyAdditionalProvider] | false | none | Optional list of additional LLM providers attached to this proxy as selectable upstreams. Policies (e.g. an OpenAI translator) can route requests to any of these by setting the upstream name. The primary provider field above remains the default upstream and the FK target. |
| id | string | true | none | Unique id of a deployed llm provider |
| as | string | false | none | Logical LLM Provider name used by policies to select this provider. Must be unique within the proxy. Defaults to id when omitted. |
| auth | LLMUpstreamAuth | false | none | none |
| transformer | LLMProxyTransformer | false | none | Request/response translator applied when this provider is the selected upstream. The proxy injects the translator as a conditional policy whose execution condition matches this provider, so it runs only when the provider is selected. The provider's as name (defaults to id) is passed to the translator as its target upstream. |
| type | string | true | none | Translator policy name (for example openai-to-anthropic). |
| version | string | true | none | Major-only translator policy version (for example v1). The Gateway Controller resolves it to the installed full version. |
| params | object | false | none | Translator-specific parameters (for example model, apiVersion). |
| policies | [LLMPolicy] | false | none | DEPRECATED - use operationPolicies. Still honoured (treated identically to operationPolicies). |
| name | string | true | none | none |
| version | string | true | none | none |
| paths | [LLMPolicyPath] | true | none | none |
| path | string | true | none | none |
| methods | [string] | true | none | none |
| params | object | true | none | JSON Schema describing the parameters accepted by this policy. This itself is a JSON Schema document. |
| deploymentState | string | false | none | Desired deployment state - 'deployed' (default) or 'undeployed'. When set to 'undeployed', the LLM Proxy is removed from router traffic but configuration and policies are preserved for potential redeployment. |
| resilience | Resilience | false | none | Backend/route timeout configuration. Maps to Envoy RouteAction timeouts. Can be set at the API level (applies to all routes) and/or the operation level (applies to that operation's route). When set at both levels, the operation-level value takes precedence. When unset, the gateway's global route timeout defaults apply. |
| timeout | string | false | none | Maximum time for the entire route (request to upstream response). "0s" disables the timeout. |
| idleTimeout | string | false | none | Per-route stream idle timeout (overrides the listener stream idle timeout for this route). "0s" disables the timeout. |
and
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| anonymous | object | false | none | none |
| status | ResourceStatus | false | read-only | Server-managed lifecycle fields. Populated on responses. |
| id | string | false | none | Unique identifier assigned by the server (equal to metadata.name) |
| state | string | false | none | Desired deployment state reported by the server |
| createdAt | string(date-time) | false | none | Timestamp when the resource was first created (UTC) |
| updatedAt | string(date-time) | false | none | Timestamp when the resource was last updated (UTC) |
| deployedAt | string(date-time) | false | none | Timestamp when the resource was last deployed (omitted when undeployed) |
Enumerated Values
| Property | Value |
|---|---|
| apiVersion | gateway.api-platform.wso2.com/v1 |
| kind | LlmProxy |
| type | api-key |
| type | other |
| type | none |
| deploymentState | deployed |
| deploymentState | undeployed |
| state | deployed |
| state | undeployed |
Get LLM proxy by unique identifier¶
GET /llm-proxies/{id}
Code samples
curl -X GET http://localhost:9090/api/management/v1/llm-proxies/{id} \
-u {username}:{password} \
-H 'Accept: application/json'
Get an LLM proxy by its ID.
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique identifier of the LLM proxy |
Example responses
200 Response
{
"apiVersion": "gateway.api-platform.wso2.com/v1",
"kind": "LlmProxy",
"metadata": {
"name": "openai-proxy"
},
"spec": {
"displayName": "OpenAI Proxy",
"version": "v1.0",
"context": "/openai-proxy",
"provider": {
"id": "wso2-openai-provider"
},
"policies": []
},
"status": {
"id": "openai-proxy",
"state": "deployed",
"createdAt": "2026-04-24T07:21:13Z",
"updatedAt": "2026-04-24T07:21:13Z",
"deployedAt": "2026-04-24T07:21:13Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | LLM proxy details | LLMProxyConfiguration |
| 404 | Not Found | LLM proxy not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Update an existing LLM proxy¶
PUT /llm-proxies/{id}
Code samples
curl -X PUT http://localhost:9090/api/management/v1/llm-proxies/{id} \
-u {username}:{password} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d @payload.json
Update an existing LLM proxy in the Gateway.
Payload
{
"apiVersion": "gateway.api-platform.wso2.com/v1",
"kind": "LlmProxy",
"metadata": {
"name": "openai-proxy"
},
"spec": {
"displayName": "OpenAI Proxy",
"version": "v1.0",
"context": "/openai-proxy",
"provider": {
"id": "wso2-openai-provider"
},
"policies": []
}
}
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique identifier of the LLM proxy |
| body | body | LLMProxyConfigurationRequest | true | Updated LLM proxy |
Example responses
200 Response
{
"apiVersion": "gateway.api-platform.wso2.com/v1",
"kind": "LlmProxy",
"metadata": {
"name": "openai-proxy"
},
"spec": {
"displayName": "OpenAI Proxy",
"version": "v1.0",
"context": "/openai-proxy",
"provider": {
"id": "wso2-openai-provider"
},
"policies": []
},
"status": {
"id": "openai-proxy",
"state": "deployed",
"createdAt": "2026-04-24T07:21:13Z",
"updatedAt": "2026-04-24T07:21:13Z",
"deployedAt": "2026-04-24T07:21:13Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | LLM proxy updated successfully | LLMProxyConfiguration |
| 400 | Bad Request | Invalid configuration | ErrorResponse |
| 404 | Not Found | LLM proxy not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Delete an LLM proxy¶
DELETE /llm-proxies/{id}
Code samples
curl -X DELETE http://localhost:9090/api/management/v1/llm-proxies/{id} \
-u {username}:{password} \
-H 'Accept: application/json'
Delete an LLM proxy from the Gateway.
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique identifier of the LLM proxy |
Example responses
200 Response
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | LLM proxy deleted successfully | Inline |
| 404 | Not Found | LLM proxy not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
| message | string | false | none | none |
| id | string | false | none | none |
Create a new API key for an LLM proxy¶
POST /llm-proxies/{id}/api-keys
Code samples
curl -X POST http://localhost:9090/api/management/v1/llm-proxies/{id}/api-keys \
-u {username}:{password} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d @payload.json
Generate a new API key for an LLM proxy in the Gateway.
Payload
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique handle of the LLM proxy to generate the key for |
| body | body | APIKeyCreationRequest | true | none |
Example responses
201 Response
{
"status": "success",
"message": "API key generated successfully",
"remainingApiKeyQuota": 9,
"apiKey": {
"name": "my-production-key",
"displayName": "My Production Key",
"apiKey": "apip_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"apiId": "reading-list-api-v1.0",
"status": "active",
"createdAt": "2026-04-01T10:30:00Z",
"createdBy": "admin",
"expiresAt": null,
"source": "local"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | API key created successfully | APIKeyCreationResponse |
| 400 | Bad Request | Invalid configuration (validation failed) | ErrorResponse |
| 404 | Not Found | LLM proxy not found | ErrorResponse |
| 409 | Conflict | Conflict (duplicate key or conflicting update) | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Get the list of API keys for an LLM proxy¶
GET /llm-proxies/{id}/api-keys
Code samples
curl -X GET http://localhost:9090/api/management/v1/llm-proxies/{id}/api-keys \
-u {username}:{password} \
-H 'Accept: application/json'
List all API keys for an LLM proxy in the Gateway.
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique handle of the LLM proxy to retrieve keys for |
Example responses
200 Response
{
"apiKeys": [
{
"name": "my-production-key",
"displayName": "My Production Key",
"apiKey": "apip_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"apiId": "reading-list-api-v1.0",
"status": "active",
"createdAt": "2026-04-01T10:30:00Z",
"createdBy": "admin",
"expiresAt": null,
"source": "local"
}
],
"totalCount": 3,
"status": "success"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | List of API keys | APIKeyListResponse |
| 404 | Not Found | LLM proxy not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Regenerate API key for an LLM proxy¶
POST /llm-proxies/{id}/api-keys/{apiKeyName}/regenerate
Code samples
curl -X POST http://localhost:9090/api/management/v1/llm-proxies/{id}/api-keys/{apiKeyName}/regenerate \
-u {username}:{password} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d @payload.json
Regenerate an existing API key for an LLM proxy in the Gateway.
Payload
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique handle of the LLM proxy |
| apiKeyName | path | string | true | Name of the API key to regenerate |
| body | body | APIKeyRegenerationRequest | true | none |
Example responses
200 Response
{
"status": "success",
"message": "API key generated successfully",
"remainingApiKeyQuota": 9,
"apiKey": {
"name": "my-production-key",
"displayName": "My Production Key",
"apiKey": "apip_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"apiId": "reading-list-api-v1.0",
"status": "active",
"createdAt": "2026-04-01T10:30:00Z",
"createdBy": "admin",
"expiresAt": null,
"source": "local"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | API key rotated successfully | APIKeyCreationResponse |
| 400 | Bad Request | Invalid configuration (validation failed) | ErrorResponse |
| 404 | Not Found | LLM proxy or API key not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Update an API key for an LLM proxy¶
PUT /llm-proxies/{id}/api-keys/{apiKeyName}
Code samples
curl -X PUT http://localhost:9090/api/management/v1/llm-proxies/{id}/api-keys/{apiKeyName} \
-u {username}:{password} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d @payload.json
Update an API key with a custom value instead of auto-generating one.
Payload
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique handle of the LLM proxy |
| apiKeyName | path | string | true | Name of the API key to update |
| body | body | APIKeyUpdateRequest | true | none |
Example responses
200 Response
{
"status": "success",
"message": "API key generated successfully",
"remainingApiKeyQuota": 9,
"apiKey": {
"name": "my-production-key",
"displayName": "My Production Key",
"apiKey": "apip_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"apiId": "reading-list-api-v1.0",
"status": "active",
"createdAt": "2026-04-01T10:30:00Z",
"createdBy": "admin",
"expiresAt": null,
"source": "local"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | API key updated successfully | APIKeyCreationResponse |
| 400 | Bad Request | Invalid request (validation failed) | ErrorResponse |
| 404 | Not Found | LLM proxy or API key not found | ErrorResponse |
| 409 | Conflict | Conflict (duplicate key or conflicting update) | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |
Revoke an API key for an LLM proxy¶
DELETE /llm-proxies/{id}/api-keys/{apiKeyName}
Code samples
curl -X DELETE http://localhost:9090/api/management/v1/llm-proxies/{id}/api-keys/{apiKeyName} \
-u {username}:{password} \
-H 'Accept: application/json'
Revoke an API key. Once revoked, it can no longer be used to authenticate requests.
Authentication¶
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | true | Unique handle of the LLM proxy |
| apiKeyName | path | string | true | Name of the API key to revoke |
Example responses
200 Response
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | API key revoked successfully | APIKeyRevocationResponse |
| 400 | Bad Request | Invalid configuration (validation failed) | ErrorResponse |
| 404 | Not Found | LLM proxy or API key not found | ErrorResponse |
| 500 | Internal Server Error | Internal server error | ErrorResponse |