From 843d33f963756359bcca4f2a4db437e0a766a1aa Mon Sep 17 00:00:00 2001 From: kayx23 Date: Wed, 28 Oct 2026 20:34:06 +0800 Subject: [PATCH] docs: add source-verified 3.16 Admin API contract --- docs/en/latest/admin-api.json | 17085 +++++++++++++++++++++++++++++ utils/check-admin-api.py | 286 + utils/requirements-admin-api.txt | 20 + 3 files changed, 17391 insertions(+) create mode 100644 docs/en/latest/admin-api.json create mode 100644 utils/check-admin-api.py create mode 100644 utils/requirements-admin-api.txt diff --git a/docs/en/latest/admin-api.json b/docs/en/latest/admin-api.json new file mode 100644 index 000000000000..2ba9b9ae5c22 --- /dev/null +++ b/docs/en/latest/admin-api.json @@ -0,0 +1,17085 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Apache APISIX Admin API", + "description": "The Apache APISIX Admin API is a REST interface for managing gateway resources and applying configuration changes without restarting APISIX. Accepted changes propagate to workers asynchronously.\n\nThis contract targets Apache APISIX 3.16.0. Resource operations are available with the etcd configuration provider; /configs operations require the YAML provider and replace those resource routes. The default response format is Admin API v3 (deployment.admin.admin_api_version: v3). The legacy v2 format is also described. List filtering and pagination apply only to v3.\n\nAuthentication uses a configured Admin API key in X-API-KEY; api_key query and x_api_key cookie are also accepted. Authentication can be disabled in deployment.admin.admin_key_required. The HEAD /apisix/admin probe and POST /schema/validate/{resource} handler do not check the key in this release. Network allowlists and deployment configuration still apply.\n\nSchemas describe built-in validation. Additional Lua checks validate references, enabled plugins and their plugin-specific schemas, certificates, expressions, upstreams, and protocol configuration. These checks depend on deployment state and are not expressible completely in OpenAPI. Plugin and metadata configurations remain open objects; query the schema endpoints and consult the plugin reference for the installed plugin. Changes propagate asynchronously to workers.\n\nSee [APISIX Documentation](https://apisix.apache.org/docs/apisix/3.16/getting-started/README/) for more information.", + "version": "3.16.0", + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "servers": [ + { + "url": "{protocol}://{host}:{port}", + "description": "Admin API listener. HTTPS requires `deployment.admin.https_admin: true` and certificate and key paths under `deployment.admin.admin_api_mtls`.", + "variables": { + "protocol": { + "default": "http", + "enum": [ + "http", + "https" + ], + "description": "Protocol scheme. Use `https` only when HTTPS is enabled and the Admin API certificate and key are configured." + }, + "host": { + "default": "127.0.0.1", + "description": "Host used by the client. The default listener binds to all interfaces, while the default allowlist permits `127.0.0.0/24`." + }, + "port": { + "default": "9180", + "description": "Admin API listening port." + } + } + } + ], + "security": [ + { + "AdminKey": [] + }, + { + "ApiKeyQuery": [] + }, + { + "ApiKeyCookie": [] + } + ], + "paths": { + "/apisix/admin/routes": { + "get": { + "operationId": "listRoutes", + "summary": "List routes", + "description": "List routes. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "routes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + }, + { + "$ref": "#/components/parameters/uri" + }, + { + "$ref": "#/components/parameters/filter" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/routes", + "dir": true, + "nodes": [ + { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putRouteCollection", + "summary": "Create or replace Route", + "description": "Create or replace Route. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "routes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/RouteRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + }, + "post": { + "operationId": "postRouteCollection", + "summary": "Create Route with a generated ID", + "description": "Create Route with a generated ID. Do not send id.", + "tags": [ + "routes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "create", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/RouteRequest" + }, + { + "not": { + "required": [ + "id" + ] + } + } + ] + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Route" + } + } + } + } + } + } + }, + "/apisix/admin/routes/{id}": { + "get": { + "operationId": "getRoute", + "summary": "Get Route", + "description": "Get Route. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putRouteById", + "summary": "Create or replace Route", + "description": "Create or replace Route. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Route" + } + } + } + } + } + }, + "patch": { + "operationId": "patchRouteById", + "summary": "Update Route", + "description": "Update Route. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoutePatch" + }, + "example": { + "plugins": {} + } + } + } + } + }, + "delete": { + "operationId": "deleteRoute", + "summary": "Delete Route", + "description": "Delete Route. ", + "tags": [ + "routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/routes/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/routes/{id}/{sub_path}": { + "patch": { + "operationId": "patchRouteSubPath", + "summary": "Update Route", + "description": "Update Route. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/routes/1", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/services": { + "get": { + "operationId": "listServices", + "summary": "List services", + "description": "List services. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "services" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/services", + "dir": true, + "nodes": [ + { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putServiceCollection", + "summary": "Create or replace Service", + "description": "Create or replace Service. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "services" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/ServiceRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + }, + "post": { + "operationId": "postServiceCollection", + "summary": "Create Service with a generated ID", + "description": "Create Service with a generated ID. Do not send id.", + "tags": [ + "services" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "create", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/ServiceRequest" + }, + { + "not": { + "required": [ + "id" + ] + } + } + ] + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Service" + } + } + } + } + } + } + }, + "/apisix/admin/services/{id}": { + "get": { + "operationId": "getService", + "summary": "Get Service", + "description": "Get Service. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "services" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putServiceById", + "summary": "Create or replace Service", + "description": "Create or replace Service. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "services" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Service" + } + } + } + } + } + }, + "patch": { + "operationId": "patchServiceById", + "summary": "Update Service", + "description": "Update Service. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "services" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServicePatch" + }, + "example": { + "plugins": {} + } + } + } + } + }, + "delete": { + "operationId": "deleteService", + "summary": "Delete Service", + "description": "Delete Service. The literal force=true bypasses reference checks.", + "tags": [ + "services" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Force" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/services/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/services/{id}/{sub_path}": { + "patch": { + "operationId": "patchServiceSubPath", + "summary": "Update Service", + "description": "Update Service. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "services" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/services/1", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/upstreams": { + "get": { + "operationId": "listUpstreams", + "summary": "List upstreams", + "description": "List upstreams. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/upstreams", + "dir": true, + "nodes": [ + { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putUpstreamCollection", + "summary": "Create or replace Upstream", + "description": "Create or replace Upstream. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/UpstreamRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + }, + "post": { + "operationId": "postUpstreamCollection", + "summary": "Create Upstream with a generated ID", + "description": "Create Upstream with a generated ID. Do not send id.", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "create", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/UpstreamRequest" + }, + { + "not": { + "required": [ + "id" + ] + } + } + ] + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Upstream" + } + } + } + } + } + } + }, + "/apisix/admin/upstreams/{id}": { + "get": { + "operationId": "getUpstream", + "summary": "Get Upstream", + "description": "Get Upstream. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putUpstreamById", + "summary": "Create or replace Upstream", + "description": "Create or replace Upstream. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Upstream" + } + } + } + } + } + }, + "patch": { + "operationId": "patchUpstreamById", + "summary": "Update Upstream", + "description": "Update Upstream. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamPatch" + }, + "example": { + "plugins": {} + } + } + } + } + }, + "delete": { + "operationId": "deleteUpstream", + "summary": "Delete Upstream", + "description": "Delete Upstream. The literal force=true bypasses reference checks.", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Force" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/upstreams/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/upstreams/{id}/{sub_path}": { + "patch": { + "operationId": "patchUpstreamSubPath", + "summary": "Update Upstream", + "description": "Update Upstream. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "upstreams" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpstreamResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/upstreams/1", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/consumers": { + "get": { + "operationId": "listConsumers", + "summary": "List consumers", + "description": "List consumers. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "consumers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/consumers", + "dir": true, + "nodes": [ + { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putConsumerCollection", + "summary": "Create or replace a Consumer", + "description": "Create or replace a Consumer. The required username in the body selects the key and must match the path username when supplied.", + "tags": [ + "consumers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Consumer" + } + } + } + } + } + } + }, + "/apisix/admin/consumers/{username}": { + "get": { + "operationId": "getConsumer", + "summary": "Get Consumer", + "description": "Get Consumer. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "consumers" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putConsumerById", + "summary": "Create or replace a Consumer", + "description": "Create or replace a Consumer. The required username in the body selects the key and must match the path username when supplied.", + "tags": [ + "consumers" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Consumer" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteConsumer", + "summary": "Delete Consumer", + "description": "Delete Consumer. Consumer credentials are removed first.", + "tags": [ + "consumers" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/consumers/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/ssls": { + "get": { + "operationId": "listSSLs", + "summary": "List ssls", + "description": "List ssls. Responses follow deployment.admin.admin_api_version. Single GET removes key; list GET does not strip private-key fields. ", + "tags": [ + "ssls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/ssls", + "dir": true, + "nodes": [ + { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putSSLCollection", + "summary": "Create or replace SSL", + "description": "Create or replace SSL. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "ssls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SSLRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + }, + "post": { + "operationId": "postSSLCollection", + "summary": "Create SSL with a generated ID", + "description": "Create SSL with a generated ID. Do not send id.", + "tags": [ + "ssls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "create", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SSLRequest" + }, + { + "not": { + "required": [ + "id" + ] + } + } + ] + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/SSL" + } + } + } + } + } + } + }, + "/apisix/admin/ssls/{id}": { + "get": { + "operationId": "getSSL", + "summary": "Get SSL", + "description": "Get SSL. Responses follow deployment.admin.admin_api_version. Single GET removes key; list GET does not strip private-key fields. ", + "tags": [ + "ssls" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLReadResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putSSLById", + "summary": "Create or replace SSL", + "description": "Create or replace SSL. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "ssls" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/SSL" + } + } + } + } + } + }, + "patch": { + "operationId": "patchSSLById", + "summary": "Update SSL", + "description": "Update SSL. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "ssls" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLPatch" + }, + "example": { + "status": 1 + } + } + } + } + }, + "delete": { + "operationId": "deleteSSL", + "summary": "Delete SSL", + "description": "Delete SSL. ", + "tags": [ + "ssls" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/ssls/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/ssls/{id}/{sub_path}": { + "patch": { + "operationId": "patchSSLSubPath", + "summary": "Update SSL", + "description": "Update SSL. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "ssls" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SSLResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/ssls/1", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/global_rules": { + "get": { + "operationId": "listGlobalRules", + "summary": "List global_rules", + "description": "List global_rules. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/global_rules", + "dir": true, + "nodes": [ + { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putGlobalRuleCollection", + "summary": "Create or replace GlobalRule", + "description": "Create or replace GlobalRule. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/GlobalRuleRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "plugins": {}, + "id": "1" + } + } + } + } + } + }, + "/apisix/admin/global_rules/{id}": { + "get": { + "operationId": "getGlobalRule", + "summary": "Get GlobalRule", + "description": "Get GlobalRule. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putGlobalRuleById", + "summary": "Create or replace GlobalRule", + "description": "Create or replace GlobalRule. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/GlobalRule" + } + } + } + } + } + }, + "patch": { + "operationId": "patchGlobalRuleById", + "summary": "Update GlobalRule", + "description": "Update GlobalRule. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRulePatch" + }, + "example": { + "plugins": {} + } + } + } + } + }, + "delete": { + "operationId": "deleteGlobalRule", + "summary": "Delete GlobalRule", + "description": "Delete GlobalRule. ", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/global_rules/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/global_rules/{id}/{sub_path}": { + "patch": { + "operationId": "patchGlobalRuleSubPath", + "summary": "Update GlobalRule", + "description": "Update GlobalRule. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "global_rules" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalRuleResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/global_rules/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/consumer_groups": { + "get": { + "operationId": "listConsumerGroups", + "summary": "List consumer_groups", + "description": "List consumer_groups. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/consumer_groups", + "dir": true, + "nodes": [ + { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putConsumerGroupCollection", + "summary": "Create or replace ConsumerGroup", + "description": "Create or replace ConsumerGroup. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/ConsumerGroupRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "plugins": {}, + "id": "1" + } + } + } + } + } + }, + "/apisix/admin/consumer_groups/{id}": { + "get": { + "operationId": "getConsumerGroup", + "summary": "Get ConsumerGroup", + "description": "Get ConsumerGroup. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putConsumerGroupById", + "summary": "Create or replace ConsumerGroup", + "description": "Create or replace ConsumerGroup. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/ConsumerGroup" + } + } + } + } + } + }, + "patch": { + "operationId": "patchConsumerGroupById", + "summary": "Update ConsumerGroup", + "description": "Update ConsumerGroup. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupPatch" + }, + "example": { + "plugins": {} + } + } + } + } + }, + "delete": { + "operationId": "deleteConsumerGroup", + "summary": "Delete ConsumerGroup", + "description": "Delete ConsumerGroup. The literal force=true bypasses reference checks.", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Force" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/consumer_groups/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/consumer_groups/{id}/{sub_path}": { + "patch": { + "operationId": "patchConsumerGroupSubPath", + "summary": "Update ConsumerGroup", + "description": "Update ConsumerGroup. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "consumer_groups" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsumerGroupResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/consumer_groups/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/plugin_configs": { + "get": { + "operationId": "listPluginConfigs", + "summary": "List plugin_configs", + "description": "List plugin_configs. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/plugin_configs", + "dir": true, + "nodes": [ + { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putPluginConfigCollection", + "summary": "Create or replace PluginConfig", + "description": "Create or replace PluginConfig. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PluginConfigRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "plugins": {}, + "id": "1" + } + } + } + } + } + }, + "/apisix/admin/plugin_configs/{id}": { + "get": { + "operationId": "getPluginConfig", + "summary": "Get PluginConfig", + "description": "Get PluginConfig. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putPluginConfigById", + "summary": "Create or replace PluginConfig", + "description": "Create or replace PluginConfig. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/PluginConfig" + } + } + } + } + } + }, + "patch": { + "operationId": "patchPluginConfigById", + "summary": "Update PluginConfig", + "description": "Update PluginConfig. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigPatch" + }, + "example": { + "plugins": {} + } + } + } + } + }, + "delete": { + "operationId": "deletePluginConfig", + "summary": "Delete PluginConfig", + "description": "Delete PluginConfig. The literal force=true bypasses reference checks.", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Force" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/plugin_configs/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/plugin_configs/{id}/{sub_path}": { + "patch": { + "operationId": "patchPluginConfigSubPath", + "summary": "Update PluginConfig", + "description": "Update PluginConfig. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "plugin_configs" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PluginConfigResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/plugin_configs/1", + "value": { + "plugins": {}, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/stream_routes": { + "get": { + "operationId": "listStreamRoutes", + "summary": "List stream_routes", + "description": "List stream_routes. Responses follow deployment.admin.admin_api_version. Requires apisix.proxy_mode stream or http&stream. ", + "tags": [ + "stream_routes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + }, + { + "$ref": "#/components/parameters/filter" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/stream_routes", + "dir": true, + "nodes": [ + { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putStreamRouteCollection", + "summary": "Create or replace StreamRoute", + "description": "Create or replace StreamRoute. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id. Requires apisix.proxy_mode stream or http&stream.", + "tags": [ + "stream_routes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/StreamRouteRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + }, + "post": { + "operationId": "postStreamRouteCollection", + "summary": "Create StreamRoute with a generated ID", + "description": "Create StreamRoute with a generated ID. Do not send id. Requires apisix.proxy_mode stream or http&stream.", + "tags": [ + "stream_routes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "create", + "node": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/StreamRouteRequest" + }, + { + "not": { + "required": [ + "id" + ] + } + } + ] + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/StreamRoute" + } + } + } + } + } + } + }, + "/apisix/admin/stream_routes/{id}": { + "get": { + "operationId": "getStreamRoute", + "summary": "Get StreamRoute", + "description": "Get StreamRoute. Responses follow deployment.admin.admin_api_version. Requires apisix.proxy_mode stream or http&stream. ", + "tags": [ + "stream_routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putStreamRouteById", + "summary": "Create or replace StreamRoute", + "description": "Create or replace StreamRoute. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id. Requires apisix.proxy_mode stream or http&stream.", + "tags": [ + "stream_routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/stream_routes/1", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StreamRouteRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/StreamRoute" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteStreamRoute", + "summary": "Delete StreamRoute", + "description": "Delete StreamRoute. The literal force=true bypasses reference checks.", + "tags": [ + "stream_routes" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Force" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/stream_routes/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/protos": { + "get": { + "operationId": "listProtos", + "summary": "List protos", + "description": "List protos. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "protos" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/protos", + "dir": true, + "nodes": [ + { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putProtoCollection", + "summary": "Create or replace Proto", + "description": "Create or replace Proto. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "protos" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/ProtoRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + }, + "post": { + "operationId": "postProtoCollection", + "summary": "Create Proto with a generated ID", + "description": "Create Proto with a generated ID. Do not send id.", + "tags": [ + "protos" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "create", + "node": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/ProtoRequest" + }, + { + "not": { + "required": [ + "id" + ] + } + } + ] + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Proto" + } + } + } + } + } + } + }, + "/apisix/admin/protos/{id}": { + "get": { + "operationId": "getProto", + "summary": "Get Proto", + "description": "Get Proto. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "protos" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putProtoById", + "summary": "Create or replace Proto", + "description": "Create or replace Proto. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "protos" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/protos/1", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }", + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProtoRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Proto" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteProto", + "summary": "Delete Proto", + "description": "Delete Proto. The literal force=true bypasses reference checks.", + "tags": [ + "protos" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Force" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/protos/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/plugin_metadata": { + "get": { + "operationId": "listMetadatas", + "summary": "List plugin_metadata", + "description": "List plugin_metadata. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "plugin_metadata" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetadataListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/plugin_metadata", + "dir": true, + "nodes": [ + { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/plugin_metadata/{plugin_name}": { + "get": { + "operationId": "getMetadata", + "summary": "Get Metadata", + "description": "Get Metadata. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "plugin_metadata" + ], + "parameters": [ + { + "name": "plugin_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "plugin name" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetadataResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putMetadataById", + "summary": "Create or replace Metadata", + "description": "Create or replace Metadata. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id. The path plugin name selects metadata_schema; this resource does not support POST or PATCH.", + "tags": [ + "plugin_metadata" + ], + "parameters": [ + { + "name": "plugin_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "plugin name" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetadataResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetadataResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/plugin_metadata/example-plugin", + "value": { + "id": "example-plugin" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetadataRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Metadata" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteMetadata", + "summary": "Delete Metadata", + "description": "Delete Metadata. ", + "tags": [ + "plugin_metadata" + ], + "parameters": [ + { + "name": "plugin_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "plugin name" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/plugin_metadata/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/secrets": { + "get": { + "operationId": "listSecrets", + "summary": "List secrets", + "description": "List secrets. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "secrets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/secrets/vault", + "dir": true, + "nodes": [ + { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/secrets/{secret_type}/{id}": { + "get": { + "operationId": "getSecret", + "summary": "Get Secret", + "description": "Get Secret. Responses follow deployment.admin.admin_api_version. ", + "tags": [ + "secrets" + ], + "parameters": [ + { + "name": "secret_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "vault", + "aws", + "gcp" + ] + }, + "description": "secret type" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + }, + "put": { + "operationId": "putSecretById", + "summary": "Create or replace Secret", + "description": "Create or replace Secret. Returns 201 for creation and 200 for replacement. If body id is present it must match the path; on collection PUT the body supplies id.", + "tags": [ + "secrets" + ], + "parameters": [ + { + "name": "secret_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "vault", + "aws", + "gcp" + ] + }, + "description": "secret type" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + }, + "200": { + "description": "Existing resource replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Secret" + } + } + } + } + } + }, + "patch": { + "operationId": "patchSecretById", + "summary": "Update Secret", + "description": "Update Secret. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "secrets" + ], + "parameters": [ + { + "name": "secret_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "vault", + "aws", + "gcp" + ] + }, + "description": "secret type" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretPatch" + }, + "example": { + "token": "example-token" + } + } + } + } + }, + "delete": { + "operationId": "deleteSecret", + "summary": "Delete Secret", + "description": "Delete Secret. ", + "tags": [ + "secrets" + ], + "parameters": [ + { + "name": "secret_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "vault", + "aws", + "gcp" + ] + }, + "description": "secret type" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Deleted. deleted is a string for compatibility.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + }, + "example": { + "key": "/apisix/secrets/1", + "deleted": "1" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/secrets/{secret_type}": { + "get": { + "operationId": "listSecretsBackendAlias", + "summary": "List secrets through a backend path alias", + "description": "In 3.16, a backend-only GET still reads /secrets/ and returns all backends; the backend segment is used only when an id is supplied. Use /secrets for listing.", + "tags": [ + "secrets" + ], + "parameters": [ + { + "name": "secret_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "vault", + "aws", + "gcp" + ] + }, + "description": "secret type" + }, + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + } + ], + "responses": { + "200": { + "description": "Resource data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/secrets/vault", + "dir": true, + "nodes": [ + { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ] + } + }, + "/apisix/admin/secrets/{secret_type}/{id}/{sub_path}": { + "patch": { + "operationId": "patchSecretSubPath", + "summary": "Update Secret", + "description": "Update Secret. Merge an object into the existing resource, or replace the selected subpath value. The complete result is revalidated.", + "tags": [ + "secrets" + ], + "parameters": [ + { + "name": "secret_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "vault", + "aws", + "gcp" + ] + }, + "description": "secret type" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "name": "sub_path", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "Slash-separated nested keys; may span several URL segments." + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "compareAndSwap", + "node": { + "key": "/apisix/secrets/vault/1", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token", + "id": "vault/1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/resource.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Replacement JSON value for the subpath; string, number, boolean, object, or array. The complete resulting resource must remain valid." + } + } + }, + "/apisix/admin/consumers/{username}/credentials": { + "get": { + "operationId": "listCredentials", + "summary": "Read consumer credentials", + "description": "Read consumer credentials. At most one configured authentication plugin is allowed per credential; plugins is optional.", + "tags": [ + "credentials" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + }, + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/name" + }, + { + "$ref": "#/components/parameters/label" + } + ], + "responses": { + "200": { + "description": "Credential data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialListResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "list": [ + { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ], + "total": 1 + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/consumers/jack/credentials", + "dir": true, + "nodes": [ + { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + }, + "createdIndex": 10, + "modifiedIndex": 10 + } + ] + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/credentials.lua" + ] + }, + "put": { + "operationId": "putCredentialCollection", + "summary": "Create or replace a credential", + "description": "Create or replace a credential. The parent consumer must exist. POST and PATCH are unsupported.", + "tags": [ + "credentials" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/credentials.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/CredentialRequest" + }, + { + "required": [ + "id" + ] + } + ] + }, + "example": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + } + } + } + }, + "/apisix/admin/consumers/{username}/credentials/{id}": { + "get": { + "operationId": "getCredential", + "summary": "Read consumer credentials", + "description": "Read consumer credentials. At most one configured authentication plugin is allowed per credential; plugins is optional.", + "tags": [ + "credentials" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Credential data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "get", + "node": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/credentials.lua" + ] + }, + "put": { + "operationId": "putCredentialById", + "summary": "Create or replace a credential", + "description": "Create or replace a credential. The parent consumer must exist. POST and PATCH are unsupported.", + "tags": [ + "credentials" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + }, + { + "$ref": "#/components/parameters/Ttl" + } + ], + "responses": { + "200": { + "description": "Replaced.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialResult" + }, + "examples": { + "v3": { + "summary": "Illustrative default v3 response", + "value": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + }, + "v2": { + "summary": "Illustrative legacy response", + "value": { + "action": "set", + "node": { + "key": "/apisix/consumers/jack/credentials/1", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + }, + "id": "1" + } + } + } + } + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/credentials.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + }, + "examples": { + "configuration": { + "$ref": "#/components/examples/Credential" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteCredential", + "summary": "Delete a credential", + "description": "Delete a credential.", + "tags": [ + "credentials" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "description": "username" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9-_.]+$" + }, + "description": "id" + } + ], + "responses": { + "200": { + "description": "Deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteResult" + } + } + }, + "headers": { + "X-API-VERSION": { + "schema": { + "type": "string", + "enum": [ + "v2", + "v3" + ] + }, + "description": "Selected Admin API response format." + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "503": { + "$ref": "#/components/responses/503" + } + }, + "x-apisix-source": [ + "apisix/admin/credentials.lua" + ] + } + }, + "/apisix/admin/plugins/{plugin_name}": { + "get": { + "operationId": "getPluginSchema", + "summary": "Get a loaded plugin schema", + "description": "Get a loaded plugin schema. schema_type=consumer selects consumer_schema; metadata_schema is available through the all=true catalog.", + "tags": [ + "plugins" + ], + "parameters": [ + { + "name": "plugin_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "plugin name" + }, + { + "$ref": "#/components/parameters/Subsystem" + }, + { + "$ref": "#/components/parameters/SchemaType" + }, + { + "$ref": "#/components/parameters/All" + } + ], + "responses": { + "200": { + "description": "JSON Schema or plugin catalog when all=true.", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "x-apisix-source": [ + "apisix/admin/plugins.lua" + ] + } + }, + "/apisix/admin/schema/plugins/{plugin_name}": { + "get": { + "operationId": "getPluginSchemaAlias", + "summary": "Get a loaded plugin schema", + "description": "Get a loaded plugin schema. schema_type=consumer selects consumer_schema; metadata_schema is available through the all=true catalog.", + "tags": [ + "plugins" + ], + "parameters": [ + { + "name": "plugin_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1 + }, + "description": "plugin name" + }, + { + "$ref": "#/components/parameters/Subsystem" + }, + { + "$ref": "#/components/parameters/SchemaType" + }, + { + "$ref": "#/components/parameters/All" + } + ], + "responses": { + "200": { + "description": "JSON Schema or plugin catalog when all=true.", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "x-apisix-source": [ + "apisix/admin/plugins.lua" + ] + } + }, + "/apisix/admin/plugins": { + "get": { + "operationId": "getPluginCatalog", + "summary": "Get loaded plugin attributes and schemas with all=true", + "description": "Get loaded plugin attributes and schemas with all=true. Without all=true there is no plugin name, so this handler returns 404.", + "tags": [ + "plugins" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Subsystem" + }, + { + "name": "all", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": [ + "true" + ] + }, + "description": "Required to select the catalog response.", + "example": "true" + } + ], + "responses": { + "200": { + "description": "Loaded plugin catalog, keyed by plugin name.", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "x-apisix-source": [ + "apisix/admin/plugins.lua" + ] + } + }, + "/apisix/admin/plugins/list": { + "get": { + "operationId": "listPluginNames", + "summary": "List enabled, successfully loaded plugins in descending priority order", + "description": "List enabled, successfully loaded plugins in descending priority order.", + "tags": [ + "plugins" + ], + "parameters": [ + { + "$ref": "#/components/parameters/Subsystem" + } + ], + "responses": { + "200": { + "description": "Plugin names.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "400": { + "description": "Invalid subsystem.", + "content": { + "application/json": { + "schema": { + "type": "string" + }, + "example": "invalid subsystem passed" + } + } + }, + "401": { + "$ref": "#/components/responses/401" + } + }, + "x-apisix-source": [ + "apisix/admin/init.lua" + ] + } + }, + "/apisix/admin/plugins/reload": { + "put": { + "operationId": "reloadPlugins", + "summary": "Broadcast a plugin reload event", + "description": "Broadcast a plugin reload event. Success acknowledges the event; it does not wait for every worker to finish.", + "tags": [ + "plugins" + ], + "parameters": [], + "responses": { + "200": { + "description": "Event posted.", + "content": { + "application/json": { + "schema": { + "type": "string" + }, + "example": "done" + } + } + }, + "503": { + "description": "Failed to post event.", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "$ref": "#/components/responses/401" + } + }, + "x-apisix-source": [ + "apisix/admin/init.lua" + ] + } + }, + "/apisix/admin/schema/{resource}": { + "get": { + "operationId": "getResourceSchema", + "summary": "Get a core schema by its singular name (for example route, upstream, credential)", + "description": "Get a core schema by its singular name (for example route, upstream, credential). Unknown names return 400.", + "tags": [ + "schemas" + ], + "parameters": [ + { + "name": "resource", + "in": "path", + "required": true, + "schema": { + "type": "string", + "examples": [ + "route", + "upstream", + "credential" + ] + }, + "description": "Core schema name, singular rather than resource directory name.", + "example": "route" + } + ], + "responses": { + "200": { + "description": "JSON Schema.", + "content": { + "application/json": { + "schema": { + "type": [ + "object", + "array" + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + } + }, + "x-apisix-source": [ + "apisix/admin/schema.lua" + ] + } + }, + "/apisix/admin/schema/validate/{resource}": { + "post": { + "operationId": "validateResourceSchema", + "summary": "Check the built-in resource JSON Schema only", + "description": "Check the built-in resource JSON Schema only. Does not run resource checkers, resolve references, or validate plugin configuration. No API-key check is performed by this handler in 3.16.", + "tags": [ + "schemas" + ], + "parameters": [ + { + "name": "resource", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "routes", + "services", + "upstreams", + "consumers", + "ssls", + "global_rules", + "consumer_groups", + "plugin_configs", + "stream_routes", + "protos", + "credentials" + ] + }, + "description": "Plural resource directory name. secrets and plugin_metadata have no core schema and are not supported.", + "example": "routes" + } + ], + "responses": { + "200": { + "description": "Valid; empty response body." + }, + "400": { + "$ref": "#/components/responses/400" + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "x-apisix-source": [ + "apisix/admin/init.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/Route" + }, + { + "$ref": "#/components/schemas/Service" + }, + { + "$ref": "#/components/schemas/Upstream" + }, + { + "$ref": "#/components/schemas/Consumer" + }, + { + "$ref": "#/components/schemas/Credential" + }, + { + "$ref": "#/components/schemas/SSL" + }, + { + "$ref": "#/components/schemas/GlobalRule" + }, + { + "$ref": "#/components/schemas/PluginConfig" + }, + { + "$ref": "#/components/schemas/ConsumerGroup" + }, + { + "$ref": "#/components/schemas/StreamRoute" + }, + { + "$ref": "#/components/schemas/Proto" + } + ] + } + } + } + }, + "security": [] + } + }, + "/apisix/admin": { + "head": { + "operationId": "probeAdmin", + "summary": "Probe the Admin API listener", + "description": "Probe the Admin API listener. Does not check the API key.", + "tags": [ + "probe" + ], + "parameters": [], + "responses": { + "200": { + "description": "Listener reachable; no response body." + } + }, + "x-apisix-source": [ + "apisix/admin/init.lua" + ], + "security": [] + } + }, + "/apisix/admin/configs": { + "get": { + "operationId": "getStandaloneConfig", + "summary": "Read the current YAML-provider configuration as JSON or YAML", + "description": "Read the current YAML-provider configuration as JSON or YAML. Before the first update only zero version counters are returned.", + "tags": [ + "standalone" + ], + "parameters": [], + "responses": { + "200": { + "description": "Current configuration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StandaloneRead" + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + } + }, + "headers": { + "X-Digest": { + "description": "Client-supplied configuration digest.", + "schema": { + "type": "string" + } + }, + "X-Last-Modified": { + "description": "Unix update time.", + "schema": { + "type": "integer" + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "500": { + "description": "Configuration storage, serialization, or broadcast failed.", + "content": { + "application/json": { + "schema": { + "type": [ + "object", + "string" + ] + } + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/standalone.lua" + ] + }, + "put": { + "operationId": "putStandaloneConfig", + "summary": "Replace the YAML-provider configuration", + "description": "Replace the YAML-provider configuration. Requires X-Digest; matching digest skips all validation and returns 204. A new digest applies the update asynchronously and returns 202.", + "tags": [ + "standalone" + ], + "parameters": [ + { + "name": "X-Digest", + "in": "header", + "required": true, + "schema": { + "type": "string" + }, + "description": "Opaque digest supplied by the client; changed when configuration changes.", + "example": "example-v1" + } + ], + "responses": { + "202": { + "description": "Accepted; empty body.", + "headers": { + "X-Digest": { + "description": "Client-supplied configuration digest.", + "schema": { + "type": "string" + } + }, + "X-Last-Modified": { + "description": "Unix update time.", + "schema": { + "type": "integer" + } + } + } + }, + "204": { + "description": "Digest unchanged; empty body.", + "headers": { + "X-Digest": { + "description": "Client-supplied configuration digest.", + "schema": { + "type": "string" + } + }, + "X-Last-Modified": { + "description": "Unix update time.", + "schema": { + "type": "integer" + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "500": { + "description": "Configuration storage, serialization, or broadcast failed.", + "content": { + "application/json": { + "schema": { + "type": [ + "object", + "string" + ] + } + } + } + } + }, + "x-apisix-source": [ + "apisix/admin/standalone.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StandaloneConfig" + }, + "example": { + "routes": [ + { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + ] + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + } + } + } + }, + "head": { + "operationId": "headStandaloneConfig", + "summary": "Read configuration metadata headers without a body", + "description": "Read configuration metadata headers without a body. Headers can be absent before the first update.", + "tags": [ + "standalone" + ], + "parameters": [], + "responses": { + "200": { + "description": "Metadata only.", + "headers": { + "X-Digest": { + "description": "Client-supplied configuration digest.", + "schema": { + "type": "string" + } + }, + "X-Last-Modified": { + "description": "Unix update time.", + "schema": { + "type": "integer" + } + } + } + }, + "400": { + "description": "Invalid input or a referenced resource prevents this operation." + }, + "401": { + "description": "Missing/incorrect key or method forbidden for a viewer key." + }, + "500": { + "description": "Configuration storage, serialization, or broadcast failed." + } + }, + "x-apisix-source": [ + "apisix/admin/standalone.lua" + ] + } + }, + "/apisix/admin/configs/validate": { + "post": { + "operationId": "validateStandaloneConfig", + "summary": "Validate a YAML-provider configuration without applying it; reports all resource and duplicate-ID errors with zero-based array indexes", + "description": "Validate a YAML-provider configuration without applying it; reports all resource and duplicate-ID errors with zero-based array indexes. Requires the YAML provider.", + "tags": [ + "standalone" + ], + "parameters": [], + "responses": { + "200": { + "description": "Valid; empty body." + }, + "400": { + "description": "Invalid input or validation errors.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error_msg": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "resource_type": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "error": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/401" + } + }, + "x-apisix-source": [ + "apisix/admin/standalone.lua" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StandaloneConfig" + }, + "example": { + "routes": [ + { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + }, + "id": "1" + } + ] + } + }, + "application/yaml": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "AdminKey": { + "type": "apiKey", + "in": "header", + "name": "X-API-KEY", + "description": "Admin API key configured in `config.yaml` under `deployment.admin.admin_key`." + }, + "ApiKeyQuery": { + "type": "apiKey", + "in": "query", + "name": "api_key", + "description": "Admin API key passed as a query parameter. Avoid this form in production because URLs may be logged." + }, + "ApiKeyCookie": { + "type": "apiKey", + "in": "cookie", + "name": "x_api_key", + "description": "Admin API key passed in a cookie." + } + }, + "schemas": { + "Error": { + "type": "object", + "properties": { + "error_msg": { + "type": "string" + }, + "description": { + "type": "string" + }, + "message": { + "type": "string" + }, + "req_body": {} + }, + "description": "Handler and backend errors have different shapes; fields are not always present." + }, + "Route": { + "anyOf": [ + { + "required": [ + "plugins", + "uri" + ] + }, + { + "required": [ + "upstream", + "uri" + ] + }, + { + "required": [ + "upstream_id", + "uri" + ] + }, + { + "required": [ + "service_id", + "uri" + ] + }, + { + "required": [ + "plugins", + "uris" + ] + }, + { + "required": [ + "upstream", + "uris" + ] + }, + { + "required": [ + "upstream_id", + "uris" + ] + }, + { + "required": [ + "service_id", + "uris" + ] + }, + { + "required": [ + "script", + "uri" + ] + }, + { + "required": [ + "script", + "uris" + ] + } + ], + "type": "object", + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "enable_websocket": { + "description": "enable websocket for request", + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "status": { + "description": "route status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "script_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "uri": { + "minLength": 1, + "type": "string", + "maxLength": 4096 + }, + "uris": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "HTTP uri", + "type": "string" + } + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstream" + }, + "methods": { + "uniqueItems": true, + "type": "array", + "items": { + "description": "HTTP method", + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "OPTIONS", + "CONNECT", + "TRACE", + "PURGE" + ] + } + }, + "hosts": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "remote_addr": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "remote_addrs": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + } + }, + "filter_func": { + "pattern": "^function", + "minLength": 10, + "type": "string" + }, + "plugin_config_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "script": { + "minLength": 10, + "type": "string", + "maxLength": 102400 + }, + "priority": { + "type": "integer", + "default": 0 + }, + "plugins": { + "type": "object" + }, + "vars": { + "type": "array" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "service_id": { + "$ref": "#/components/schemas/ResourceId" + } + }, + "additionalProperties": false, + "allOf": [ + { + "oneOf": [ + { + "required": [ + "uri" + ] + }, + { + "required": [ + "uris" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "host" + ] + }, + { + "required": [ + "hosts" + ] + } + ] + } + }, + { + "required": [ + "host" + ] + }, + { + "required": [ + "hosts" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "remote_addr" + ] + }, + { + "required": [ + "remote_addrs" + ] + } + ] + } + }, + { + "required": [ + "remote_addr" + ] + }, + { + "required": [ + "remote_addrs" + ] + } + ] + } + ], + "not": { + "anyOf": [ + { + "required": [ + "script", + "plugins" + ] + }, + { + "required": [ + "script", + "plugin_config_id" + ] + } + ] + }, + "x-apisix-schema": "route", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "RouteRequest": { + "anyOf": [ + { + "required": [ + "plugins", + "uri" + ] + }, + { + "required": [ + "upstream", + "uri" + ] + }, + { + "required": [ + "upstream_id", + "uri" + ] + }, + { + "required": [ + "service_id", + "uri" + ] + }, + { + "required": [ + "plugins", + "uris" + ] + }, + { + "required": [ + "upstream", + "uris" + ] + }, + { + "required": [ + "upstream_id", + "uris" + ] + }, + { + "required": [ + "service_id", + "uris" + ] + }, + { + "required": [ + "script", + "uri" + ] + }, + { + "required": [ + "script", + "uris" + ] + } + ], + "type": "object", + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "enable_websocket": { + "description": "enable websocket for request", + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "status": { + "description": "route status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "script_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "uri": { + "minLength": 1, + "type": "string", + "maxLength": 4096 + }, + "uris": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "HTTP uri", + "type": "string" + } + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstreamRequest" + }, + "methods": { + "uniqueItems": true, + "type": "array", + "items": { + "description": "HTTP method", + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "OPTIONS", + "CONNECT", + "TRACE", + "PURGE" + ] + } + }, + "hosts": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "remote_addr": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "remote_addrs": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + } + }, + "filter_func": { + "pattern": "^function", + "minLength": 10, + "type": "string" + }, + "plugin_config_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "script": { + "minLength": 10, + "type": "string", + "maxLength": 102400 + }, + "priority": { + "type": "integer", + "default": 0 + }, + "plugins": { + "type": "object" + }, + "vars": { + "type": "array" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "service_id": { + "$ref": "#/components/schemas/ResourceId" + } + }, + "additionalProperties": false, + "allOf": [ + { + "oneOf": [ + { + "required": [ + "uri" + ] + }, + { + "required": [ + "uris" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "host" + ] + }, + { + "required": [ + "hosts" + ] + } + ] + } + }, + { + "required": [ + "host" + ] + }, + { + "required": [ + "hosts" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "remote_addr" + ] + }, + { + "required": [ + "remote_addrs" + ] + } + ] + } + }, + { + "required": [ + "remote_addr" + ] + }, + { + "required": [ + "remote_addrs" + ] + } + ] + } + ], + "not": { + "anyOf": [ + { + "required": [ + "script", + "plugins" + ] + }, + { + "required": [ + "script", + "plugin_config_id" + ] + } + ] + }, + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "RoutePatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "RouteEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Route" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "RouteList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RouteEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "RouteLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/RouteEnvelope" + } + }, + "required": [ + "node" + ] + }, + "RouteLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RouteEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "RouteResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/RouteEnvelope" + }, + { + "$ref": "#/components/schemas/RouteLegacy" + } + ] + }, + "RouteListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/RouteList" + }, + { + "$ref": "#/components/schemas/RouteLegacyList" + } + ] + }, + "Service": { + "properties": { + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "enable_websocket": { + "description": "enable websocket for request", + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "script": { + "minLength": 10, + "type": "string", + "maxLength": 102400 + }, + "plugins": { + "type": "object" + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstream" + }, + "hosts": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + } + }, + "type": "object", + "additionalProperties": false, + "x-apisix-schema": "service", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "ServiceRequest": { + "properties": { + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "enable_websocket": { + "description": "enable websocket for request", + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "script": { + "minLength": 10, + "type": "string", + "maxLength": 102400 + }, + "plugins": { + "type": "object" + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstreamRequest" + }, + "hosts": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + } + }, + "type": "object", + "additionalProperties": false, + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "ServicePatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "ServiceEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Service" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "ServiceList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "ServiceLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/ServiceEnvelope" + } + }, + "required": [ + "node" + ] + }, + "ServiceLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "ServiceResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ServiceEnvelope" + }, + { + "$ref": "#/components/schemas/ServiceLegacy" + } + ] + }, + "ServiceListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ServiceList" + }, + { + "$ref": "#/components/schemas/ServiceLegacyList" + } + ] + }, + "Upstream": { + "properties": { + "key": { + "description": "the key of chash for dynamic load balancing", + "type": "string" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "nodes": { + "anyOf": [ + { + "type": "object", + "patternProperties": { + ".*": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + } + } + }, + { + "type": "array", + "items": { + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "port": { + "description": "port of node", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "weight": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + }, + "priority": { + "description": "priority of node", + "type": "integer", + "default": 0 + }, + "metadata": { + "description": "metadata of node", + "type": "object" + } + }, + "type": "object", + "required": [ + "host", + "weight" + ] + } + } + ] + }, + "retries": { + "type": "integer", + "minimum": 0 + }, + "retry_timeout": { + "type": "number", + "minimum": 0 + }, + "tls": { + "properties": { + "client_key": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "verify": { + "description": "Turn on server certificate verification, currently only kafka upstream is supported", + "type": "boolean", + "default": false + }, + "client_cert_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "client_cert": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + } + }, + "type": "object", + "dependentSchemas": { + "client_key": { + "required": [ + "client_cert" + ] + }, + "client_cert_id": { + "not": { + "required": [ + "client_cert", + "client_key" + ] + } + }, + "client_cert": { + "required": [ + "client_key" + ] + } + } + }, + "discovery_args": { + "type": "object", + "properties": { + "namespace_id": { + "description": "namespace id", + "type": "string" + }, + "group_name": { + "description": "group name", + "type": "string" + } + } + }, + "pass_host": { + "description": "mod of host passing", + "default": "pass", + "type": "string", + "enum": [ + "pass", + "node", + "rewrite" + ] + }, + "keepalive_pool": { + "type": "object", + "properties": { + "requests": { + "minimum": 1, + "type": "integer", + "default": 1000 + }, + "size": { + "minimum": 1, + "type": "integer", + "default": 320 + }, + "idle_timeout": { + "minimum": 0, + "type": "number", + "default": 60 + } + } + }, + "service_name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "upstream_host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "type": { + "description": "algorithms of load balancing", + "type": "string", + "default": "roundrobin" + }, + "checks": { + "$ref": "#/components/schemas/HealthCheck" + }, + "hash_on": { + "enum": [ + "vars", + "header", + "cookie", + "consumer", + "vars_combinations" + ], + "type": "string", + "default": "vars" + }, + "discovery_type": { + "description": "discovery type", + "type": "string" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "scheme": { + "description": "The scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be kafka.", + "default": "http", + "enum": [ + "grpc", + "grpcs", + "http", + "https", + "tcp", + "tls", + "udp", + "kafka" + ] + } + }, + "additionalProperties": false, + "type": "object", + "oneOf": [ + { + "required": [ + "nodes" + ] + }, + { + "required": [ + "service_name", + "discovery_type" + ] + } + ], + "x-apisix-schema": "upstream", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "UpstreamRequest": { + "properties": { + "key": { + "description": "the key of chash for dynamic load balancing", + "type": "string" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "nodes": { + "anyOf": [ + { + "type": "object", + "patternProperties": { + ".*": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + } + } + }, + { + "type": "array", + "items": { + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "port": { + "description": "port of node", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "weight": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + }, + "priority": { + "description": "priority of node", + "type": "integer", + "default": 0 + }, + "metadata": { + "description": "metadata of node", + "type": "object" + } + }, + "type": "object", + "required": [ + "host", + "weight" + ] + } + } + ] + }, + "retries": { + "type": "integer", + "minimum": 0 + }, + "retry_timeout": { + "type": "number", + "minimum": 0 + }, + "tls": { + "properties": { + "client_key": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "verify": { + "description": "Turn on server certificate verification, currently only kafka upstream is supported", + "type": "boolean", + "default": false + }, + "client_cert_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "client_cert": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + } + }, + "type": "object", + "dependentSchemas": { + "client_key": { + "required": [ + "client_cert" + ] + }, + "client_cert_id": { + "not": { + "required": [ + "client_cert", + "client_key" + ] + } + }, + "client_cert": { + "required": [ + "client_key" + ] + } + } + }, + "discovery_args": { + "type": "object", + "properties": { + "namespace_id": { + "description": "namespace id", + "type": "string" + }, + "group_name": { + "description": "group name", + "type": "string" + } + } + }, + "pass_host": { + "description": "mod of host passing", + "default": "pass", + "type": "string", + "enum": [ + "pass", + "node", + "rewrite" + ] + }, + "keepalive_pool": { + "type": "object", + "properties": { + "requests": { + "minimum": 1, + "type": "integer", + "default": 1000 + }, + "size": { + "minimum": 1, + "type": "integer", + "default": 320 + }, + "idle_timeout": { + "minimum": 0, + "type": "number", + "default": 60 + } + } + }, + "service_name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "upstream_host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "type": { + "description": "algorithms of load balancing", + "type": "string", + "default": "roundrobin" + }, + "checks": { + "$ref": "#/components/schemas/HealthCheck" + }, + "hash_on": { + "enum": [ + "vars", + "header", + "cookie", + "consumer", + "vars_combinations" + ], + "type": "string", + "default": "vars" + }, + "discovery_type": { + "description": "discovery type", + "type": "string" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "scheme": { + "description": "The scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be kafka.", + "default": "http", + "enum": [ + "grpc", + "grpcs", + "http", + "https", + "tcp", + "tls", + "udp", + "kafka" + ] + } + }, + "additionalProperties": false, + "type": "object", + "oneOf": [ + { + "required": [ + "nodes" + ] + }, + { + "required": [ + "service_name", + "discovery_type" + ] + } + ], + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "UpstreamPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "UpstreamEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Upstream" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "UpstreamList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UpstreamEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "UpstreamLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/UpstreamEnvelope" + } + }, + "required": [ + "node" + ] + }, + "UpstreamLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UpstreamEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "UpstreamResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/UpstreamEnvelope" + }, + { + "$ref": "#/components/schemas/UpstreamLegacy" + } + ] + }, + "UpstreamListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/UpstreamList" + }, + { + "$ref": "#/components/schemas/UpstreamLegacyList" + } + ] + }, + "Consumer": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "group_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "plugins": { + "type": "object" + }, + "username": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "username" + ], + "x-apisix-schema": "consumer", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "ConsumerRequest": { + "properties": { + "group_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "plugins": { + "type": "object" + }, + "username": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "username" + ], + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "ConsumerPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "ConsumerEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Consumer" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "ConsumerList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConsumerEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "ConsumerLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/ConsumerEnvelope" + } + }, + "required": [ + "node" + ] + }, + "ConsumerLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConsumerEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "ConsumerResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConsumerEnvelope" + }, + { + "$ref": "#/components/schemas/ConsumerLegacy" + } + ] + }, + "ConsumerListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConsumerList" + }, + { + "$ref": "#/components/schemas/ConsumerLegacyList" + } + ] + }, + "Credential": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object", + "maxProperties": 1 + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "type": "object", + "additionalProperties": false, + "x-apisix-schema": "credential", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "CredentialRequest": { + "properties": { + "plugins": { + "type": "object", + "maxProperties": 1 + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "type": "object", + "additionalProperties": false, + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "CredentialPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "CredentialEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Credential" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "CredentialList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "CredentialLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/CredentialEnvelope" + } + }, + "required": [ + "node" + ] + }, + "CredentialLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "CredentialResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/CredentialEnvelope" + }, + { + "$ref": "#/components/schemas/CredentialLegacy" + } + ] + }, + "CredentialListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/CredentialList" + }, + { + "$ref": "#/components/schemas/CredentialLegacyList" + } + ] + }, + "SSL": { + "type": "object", + "then": { + "oneOf": [ + { + "required": [ + "sni", + "key", + "cert" + ] + }, + { + "required": [ + "snis", + "key", + "cert" + ] + } + ] + }, + "properties": { + "keys": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "key": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "cert": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "snis": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "type": { + "description": "ssl certificate type, server to server certificate, client to client certificate for upstream", + "enum": [ + "server", + "client" + ], + "type": "string", + "default": "server" + }, + "status": { + "description": "ssl status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "client": { + "properties": { + "ca": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "depth": { + "minimum": 0, + "type": "integer", + "default": 1 + }, + "skip_mtls_uri_regex": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "uri regular expression to skip mtls", + "type": "string" + } + } + }, + "type": "object", + "required": [ + "ca" + ] + }, + "ssl_protocols": { + "description": "set ssl protocols", + "type": "array", + "items": { + "enum": [ + "TLSv1.1", + "TLSv1.2", + "TLSv1.3" + ] + }, + "uniqueItems": true, + "maxItems": 3 + }, + "certs": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "sni": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "else": { + "required": [ + "key", + "cert" + ] + }, + "additionalProperties": false, + "if": { + "properties": { + "type": { + "enum": [ + "server" + ] + } + } + }, + "x-apisix-schema": "ssl", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "SSLRequest": { + "type": "object", + "then": { + "oneOf": [ + { + "required": [ + "sni", + "key", + "cert" + ] + }, + { + "required": [ + "snis", + "key", + "cert" + ] + } + ] + }, + "properties": { + "keys": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "key": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "cert": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "snis": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "type": { + "description": "ssl certificate type, server to server certificate, client to client certificate for upstream", + "enum": [ + "server", + "client" + ], + "type": "string", + "default": "server" + }, + "status": { + "description": "ssl status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "client": { + "properties": { + "ca": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "depth": { + "minimum": 0, + "type": "integer", + "default": 1 + }, + "skip_mtls_uri_regex": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "uri regular expression to skip mtls", + "type": "string" + } + } + }, + "type": "object", + "required": [ + "ca" + ] + }, + "ssl_protocols": { + "description": "set ssl protocols", + "type": "array", + "items": { + "enum": [ + "TLSv1.1", + "TLSv1.2", + "TLSv1.3" + ] + }, + "uniqueItems": true, + "maxItems": 3 + }, + "certs": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "sni": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "else": { + "required": [ + "key", + "cert" + ] + }, + "additionalProperties": false, + "if": { + "properties": { + "type": { + "enum": [ + "server" + ] + } + } + }, + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "SSLPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "SSLRead": { + "type": "object", + "properties": { + "keys": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "key": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "cert": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "snis": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "type": { + "description": "ssl certificate type, server to server certificate, client to client certificate for upstream", + "enum": [ + "server", + "client" + ], + "type": "string", + "default": "server" + }, + "status": { + "description": "ssl status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "client": { + "properties": { + "ca": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "depth": { + "minimum": 0, + "type": "integer", + "default": 1 + }, + "skip_mtls_uri_regex": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "uri regular expression to skip mtls", + "type": "string" + } + } + }, + "type": "object", + "required": [ + "ca" + ] + }, + "ssl_protocols": { + "description": "set ssl protocols", + "type": "array", + "items": { + "enum": [ + "TLSv1.1", + "TLSv1.2", + "TLSv1.3" + ] + }, + "uniqueItems": true, + "maxItems": 3 + }, + "certs": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "sni": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "additionalProperties": false, + "description": "Single SSL GET removes key only. keys is not stripped by resource.lua; list GET uses the stored SSL schema. Remaining certificate checks apply when writing." + }, + "SSLEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/SSL" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "SSLList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SSLEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "SSLLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/SSLEnvelope" + } + }, + "required": [ + "node" + ] + }, + "SSLLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SSLEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "SSLResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/SSLEnvelope" + }, + { + "$ref": "#/components/schemas/SSLLegacy" + } + ] + }, + "SSLListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/SSLList" + }, + { + "$ref": "#/components/schemas/SSLLegacyList" + } + ] + }, + "GlobalRule": { + "properties": { + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object" + }, + "create_time": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "plugins" + ], + "x-apisix-schema": "global_rule", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "GlobalRuleRequest": { + "properties": { + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "plugins": { + "type": "object" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "plugins" + ], + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "GlobalRulePatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "GlobalRuleEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/GlobalRule" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "GlobalRuleList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GlobalRuleEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "GlobalRuleLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/GlobalRuleEnvelope" + } + }, + "required": [ + "node" + ] + }, + "GlobalRuleLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GlobalRuleEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "GlobalRuleResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/GlobalRuleEnvelope" + }, + { + "$ref": "#/components/schemas/GlobalRuleLegacy" + } + ] + }, + "GlobalRuleListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/GlobalRuleList" + }, + { + "$ref": "#/components/schemas/GlobalRuleLegacyList" + } + ] + }, + "PluginConfig": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "type": "string" + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "plugins" + ], + "x-apisix-schema": "plugin_config", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "PluginConfigRequest": { + "properties": { + "plugins": { + "type": "object" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "type": "string" + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "plugins" + ], + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "PluginConfigPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "PluginConfigEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/PluginConfig" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "PluginConfigList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PluginConfigEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "PluginConfigLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/PluginConfigEnvelope" + } + }, + "required": [ + "node" + ] + }, + "PluginConfigLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PluginConfigEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "PluginConfigResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/PluginConfigEnvelope" + }, + { + "$ref": "#/components/schemas/PluginConfigLegacy" + } + ] + }, + "PluginConfigListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/PluginConfigList" + }, + { + "$ref": "#/components/schemas/PluginConfigLegacyList" + } + ] + }, + "ConsumerGroup": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "plugins" + ], + "x-apisix-schema": "consumer_group", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "ConsumerGroupRequest": { + "properties": { + "plugins": { + "type": "object" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "plugins" + ], + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "ConsumerGroupPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "ConsumerGroupEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/ConsumerGroup" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "ConsumerGroupList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConsumerGroupEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "ConsumerGroupLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/ConsumerGroupEnvelope" + } + }, + "required": [ + "node" + ] + }, + "ConsumerGroupLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConsumerGroupEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "ConsumerGroupResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConsumerGroupEnvelope" + }, + { + "$ref": "#/components/schemas/ConsumerGroupLegacy" + } + ] + }, + "ConsumerGroupListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConsumerGroupList" + }, + { + "$ref": "#/components/schemas/ConsumerGroupLegacyList" + } + ] + }, + "StreamRoute": { + "properties": { + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "protocol": { + "properties": { + "conf": { + "description": "protocol-specific configuration", + "type": "object" + }, + "name": { + "type": "string" + }, + "superior_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "logger": { + "type": "array", + "items": { + "properties": { + "conf": { + "description": "logger plugin configuration", + "type": "object" + }, + "name": { + "type": "string" + }, + "filter": { + "description": "logger filter rules", + "type": "array" + } + }, + "additionalProperties": false, + "dependentRequired": { + "name": [ + "conf" + ] + } + } + } + }, + "type": "object", + "required": [ + "name" + ] + }, + "sni": { + "description": "server name indication", + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "remote_addr": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "server_addr": { + "description": "server IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "plugins": { + "type": "object" + }, + "server_port": { + "description": "server port", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstream" + }, + "service_id": { + "$ref": "#/components/schemas/ResourceId" + } + }, + "type": "object", + "additionalProperties": false, + "x-apisix-schema": "stream_route", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "StreamRouteRequest": { + "properties": { + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "protocol": { + "properties": { + "conf": { + "description": "protocol-specific configuration", + "type": "object" + }, + "name": { + "type": "string" + }, + "superior_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "logger": { + "type": "array", + "items": { + "properties": { + "conf": { + "description": "logger plugin configuration", + "type": "object" + }, + "name": { + "type": "string" + }, + "filter": { + "description": "logger filter rules", + "type": "array" + } + }, + "additionalProperties": false, + "dependentRequired": { + "name": [ + "conf" + ] + } + } + } + }, + "type": "object", + "required": [ + "name" + ] + }, + "sni": { + "description": "server name indication", + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "remote_addr": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "server_addr": { + "description": "server IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "plugins": { + "type": "object" + }, + "server_port": { + "description": "server port", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstreamRequest" + }, + "service_id": { + "$ref": "#/components/schemas/ResourceId" + } + }, + "type": "object", + "additionalProperties": false, + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "StreamRoutePatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "StreamRouteEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/StreamRoute" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "StreamRouteList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StreamRouteEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "StreamRouteLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/StreamRouteEnvelope" + } + }, + "required": [ + "node" + ] + }, + "StreamRouteLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StreamRouteEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "StreamRouteResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/StreamRouteEnvelope" + }, + { + "$ref": "#/components/schemas/StreamRouteLegacy" + } + ] + }, + "StreamRouteListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/StreamRouteList" + }, + { + "$ref": "#/components/schemas/StreamRouteLegacyList" + } + ] + }, + "Proto": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "content": { + "minLength": 1, + "type": "string", + "maxLength": 1048576 + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "content" + ], + "x-apisix-schema": "proto", + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "ProtoRequest": { + "properties": { + "content": { + "minLength": 1, + "type": "string", + "maxLength": 1048576 + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "content" + ], + "description": "Create/replace payload. The path (or collection body id) supplies id; create_time and update_time are assigned by APISIX. PUT replaces configuration, preserving the original create_time." + }, + "ProtoPatch": { + "type": "object", + "description": "Object merged into the existing value. The merged result is checked against the complete resource schema and handler checks; this is not JSON Patch. Arrays are replaced; null-valued object fields are deleted. Use a subpath PATCH to replace a nested value." + }, + "ProtoEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Proto" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "ProtoList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProtoEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "ProtoLegacy": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "node": { + "$ref": "#/components/schemas/ProtoEnvelope" + } + }, + "required": [ + "node" + ] + }, + "ProtoLegacyList": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "node": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "dir": { + "type": "boolean" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProtoEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + }, + "ProtoResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProtoEnvelope" + }, + { + "$ref": "#/components/schemas/ProtoLegacy" + } + ] + }, + "ProtoListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProtoList" + }, + { + "$ref": "#/components/schemas/ProtoLegacyList" + } + ] + }, + "SSLReadEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/SSLRead" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "SSLReadResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/SSLReadEnvelope" + }, + { + "type": "object", + "properties": { + "node": { + "$ref": "#/components/schemas/SSLReadEnvelope" + } + }, + "required": [ + "node" + ] + } + ] + }, + "VaultSecret": { + "properties": { + "uri": { + "type": "string", + "pattern": "^[^\\/]+:\\/\\/([\\da-zA-Z.-]+|\\[[\\da-fA-F:]+\\])(:\\d+)?" + }, + "prefix": { + "type": "string" + }, + "token": { + "type": "string" + }, + "namespace": { + "type": "string" + } + }, + "type": "object", + "required": [ + "uri", + "prefix", + "token" + ] + }, + "AwsSecret": { + "properties": { + "endpoint_url": { + "type": "string", + "pattern": "^[^\\/]+:\\/\\/([\\da-zA-Z.-]+|\\[[\\da-fA-F:]+\\])(:\\d+)?" + }, + "access_key_id": { + "type": "string" + }, + "secret_access_key": { + "type": "string" + }, + "session_token": { + "type": "string" + }, + "region": { + "type": "string", + "default": "us-east-1" + } + }, + "type": "object", + "required": [ + "access_key_id", + "secret_access_key" + ] + }, + "GcpSecret": { + "properties": { + "ssl_verify": { + "type": "boolean", + "default": true + }, + "auth_file": { + "type": "string" + }, + "auth_config": { + "properties": { + "scope": { + "default": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "entries_uri": { + "type": "string", + "default": "https://secretmanager.googleapis.com/v1" + }, + "client_email": { + "type": "string" + }, + "private_key": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "token_uri": { + "type": "string", + "default": "https://oauth2.googleapis.com/token" + } + }, + "type": "object", + "required": [ + "client_email", + "private_key", + "project_id" + ] + } + }, + "type": "object", + "oneOf": [ + { + "required": [ + "auth_config" + ] + }, + { + "required": [ + "auth_file" + ] + } + ] + }, + "Secret": { + "anyOf": [ + { + "$ref": "#/components/schemas/VaultSecret" + }, + { + "$ref": "#/components/schemas/AwsSecret" + }, + { + "$ref": "#/components/schemas/GcpSecret" + } + ], + "description": "Use the schema matching secret_type. APISIX adds id as backend/id and timestamps; these manager schemas allow extra fields." + }, + "SecretRequest": { + "anyOf": [ + { + "$ref": "#/components/schemas/VaultSecret" + }, + { + "$ref": "#/components/schemas/AwsSecret" + }, + { + "$ref": "#/components/schemas/GcpSecret" + } + ], + "description": "Use the schema matching secret_type. APISIX adds id as backend/id and timestamps; these manager schemas allow extra fields." + }, + "SecretPatch": { + "type": "object" + }, + "Metadata": { + "type": "object", + "description": "Validated against the named loaded plugin metadata_schema, or an injected open object schema if none is declared." + }, + "MetadataRequest": { + "$ref": "#/components/schemas/Metadata" + }, + "MetadataPatch": { + "type": "object" + }, + "SecretEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Secret" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "SecretLegacy": { + "type": "object", + "properties": { + "node": { + "$ref": "#/components/schemas/SecretEnvelope" + } + }, + "required": [ + "node" + ] + }, + "SecretResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecretEnvelope" + }, + { + "$ref": "#/components/schemas/SecretLegacy" + } + ] + }, + "SecretList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SecretEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "SecretListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecretList" + }, + { + "type": "object", + "properties": { + "node": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SecretEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + } + ] + }, + "MetadataEnvelope": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/Metadata" + }, + "createdIndex": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "required": [ + "key", + "value" + ] + }, + "MetadataLegacy": { + "type": "object", + "properties": { + "node": { + "$ref": "#/components/schemas/MetadataEnvelope" + } + }, + "required": [ + "node" + ] + }, + "MetadataResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/MetadataEnvelope" + }, + { + "$ref": "#/components/schemas/MetadataLegacy" + } + ] + }, + "MetadataList": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MetadataEnvelope" + } + } + }, + "required": [ + "total", + "list" + ] + }, + "MetadataListResult": { + "anyOf": [ + { + "$ref": "#/components/schemas/MetadataList" + }, + { + "type": "object", + "properties": { + "node": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MetadataEnvelope" + } + } + } + } + }, + "required": [ + "node" + ] + } + ] + }, + "DeleteResult": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "deleted": { + "type": "string" + }, + "action": { + "type": "string" + }, + "node": { + "type": "object" + } + }, + "required": [ + "key", + "deleted" + ] + }, + "StandaloneCredential": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object", + "maxProperties": 1 + }, + "id": { + "type": "string", + "minLength": 15, + "maxLength": 128, + "pattern": "^[a-zA-Z0-9-_]+/credentials/[a-zA-Z0-9-_.]+$" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "type": "object", + "additionalProperties": false, + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + "StandaloneConfig": { + "type": "object", + "properties": { + "routes": { + "type": "array", + "items": { + "anyOf": [ + { + "required": [ + "plugins", + "uri" + ] + }, + { + "required": [ + "upstream", + "uri" + ] + }, + { + "required": [ + "upstream_id", + "uri" + ] + }, + { + "required": [ + "service_id", + "uri" + ] + }, + { + "required": [ + "plugins", + "uris" + ] + }, + { + "required": [ + "upstream", + "uris" + ] + }, + { + "required": [ + "upstream_id", + "uris" + ] + }, + { + "required": [ + "service_id", + "uris" + ] + }, + { + "required": [ + "script", + "uri" + ] + }, + { + "required": [ + "script", + "uris" + ] + } + ], + "type": "object", + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "enable_websocket": { + "description": "enable websocket for request", + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "status": { + "description": "route status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "script_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "uri": { + "minLength": 1, + "type": "string", + "maxLength": 4096 + }, + "uris": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "HTTP uri", + "type": "string" + } + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstream" + }, + "methods": { + "uniqueItems": true, + "type": "array", + "items": { + "description": "HTTP method", + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "OPTIONS", + "CONNECT", + "TRACE", + "PURGE" + ] + } + }, + "hosts": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "remote_addr": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "remote_addrs": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + } + }, + "filter_func": { + "pattern": "^function", + "minLength": 10, + "type": "string" + }, + "plugin_config_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "script": { + "minLength": 10, + "type": "string", + "maxLength": 102400 + }, + "priority": { + "type": "integer", + "default": 0 + }, + "plugins": { + "type": "object" + }, + "vars": { + "type": "array" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "service_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "allOf": [ + { + "oneOf": [ + { + "required": [ + "uri" + ] + }, + { + "required": [ + "uris" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "host" + ] + }, + { + "required": [ + "hosts" + ] + } + ] + } + }, + { + "required": [ + "host" + ] + }, + { + "required": [ + "hosts" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "remote_addr" + ] + }, + { + "required": [ + "remote_addrs" + ] + } + ] + } + }, + { + "required": [ + "remote_addr" + ] + }, + { + "required": [ + "remote_addrs" + ] + } + ] + } + ], + "not": { + "anyOf": [ + { + "required": [ + "script", + "plugins" + ] + }, + { + "required": [ + "script", + "plugin_config_id" + ] + } + ] + }, + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "routes_conf_version": { + "type": "number" + }, + "services": { + "type": "array", + "items": { + "properties": { + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "enable_websocket": { + "description": "enable websocket for request", + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "script": { + "minLength": 10, + "type": "string", + "maxLength": 102400 + }, + "plugins": { + "type": "object" + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstream" + }, + "hosts": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "modifiedIndex": { + "type": "integer" + } + }, + "type": "object", + "additionalProperties": false, + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "services_conf_version": { + "type": "number" + }, + "upstreams": { + "type": "array", + "items": { + "properties": { + "key": { + "description": "the key of chash for dynamic load balancing", + "type": "string" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "nodes": { + "anyOf": [ + { + "type": "object", + "patternProperties": { + ".*": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + } + } + }, + { + "type": "array", + "items": { + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "port": { + "description": "port of node", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "weight": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + }, + "priority": { + "description": "priority of node", + "type": "integer", + "default": 0 + }, + "metadata": { + "description": "metadata of node", + "type": "object" + } + }, + "type": "object", + "required": [ + "host", + "weight" + ] + } + } + ] + }, + "retries": { + "type": "integer", + "minimum": 0 + }, + "retry_timeout": { + "type": "number", + "minimum": 0 + }, + "tls": { + "properties": { + "client_key": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "verify": { + "description": "Turn on server certificate verification, currently only kafka upstream is supported", + "type": "boolean", + "default": false + }, + "client_cert_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "client_cert": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + } + }, + "type": "object", + "dependentSchemas": { + "client_key": { + "required": [ + "client_cert" + ] + }, + "client_cert_id": { + "not": { + "required": [ + "client_cert", + "client_key" + ] + } + }, + "client_cert": { + "required": [ + "client_key" + ] + } + } + }, + "discovery_args": { + "type": "object", + "properties": { + "namespace_id": { + "description": "namespace id", + "type": "string" + }, + "group_name": { + "description": "group name", + "type": "string" + } + } + }, + "pass_host": { + "description": "mod of host passing", + "default": "pass", + "type": "string", + "enum": [ + "pass", + "node", + "rewrite" + ] + }, + "keepalive_pool": { + "type": "object", + "properties": { + "requests": { + "minimum": 1, + "type": "integer", + "default": 1000 + }, + "size": { + "minimum": 1, + "type": "integer", + "default": 320 + }, + "idle_timeout": { + "minimum": 0, + "type": "number", + "default": 60 + } + } + }, + "service_name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "upstream_host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "type": { + "description": "algorithms of load balancing", + "type": "string", + "default": "roundrobin" + }, + "checks": { + "$ref": "#/components/schemas/HealthCheck" + }, + "hash_on": { + "enum": [ + "vars", + "header", + "cookie", + "consumer", + "vars_combinations" + ], + "type": "string", + "default": "vars" + }, + "discovery_type": { + "description": "discovery type", + "type": "string" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "scheme": { + "description": "The scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be kafka.", + "default": "http", + "enum": [ + "grpc", + "grpcs", + "http", + "https", + "tcp", + "tls", + "udp", + "kafka" + ] + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "oneOf": [ + { + "required": [ + "nodes" + ] + }, + { + "required": [ + "service_name", + "discovery_type" + ] + } + ], + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "upstreams_conf_version": { + "type": "number" + }, + "consumers": { + "type": "array", + "items": { + "anyOf": [ + { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "group_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "plugins": { + "type": "object" + }, + "username": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "username" + ], + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + }, + { + "$ref": "#/components/schemas/StandaloneCredential" + } + ] + } + }, + "consumers_conf_version": { + "type": "number" + }, + "ssls": { + "type": "array", + "items": { + "type": "object", + "then": { + "oneOf": [ + { + "required": [ + "sni", + "key", + "cert" + ] + }, + { + "required": [ + "snis", + "key", + "cert" + ] + } + ] + }, + "properties": { + "keys": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "key": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "cert": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "snis": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + } + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "type": { + "description": "ssl certificate type, server to server certificate, client to client certificate for upstream", + "enum": [ + "server", + "client" + ], + "type": "string", + "default": "server" + }, + "status": { + "description": "ssl status, 1 to enable, 0 to disable", + "default": 1, + "type": "integer", + "enum": [ + 1, + 0 + ] + }, + "client": { + "properties": { + "ca": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "depth": { + "minimum": 0, + "type": "integer", + "default": 1 + }, + "skip_mtls_uri_regex": { + "uniqueItems": true, + "minItems": 1, + "type": "array", + "items": { + "description": "uri regular expression to skip mtls", + "type": "string" + } + } + }, + "type": "object", + "required": [ + "ca" + ] + }, + "ssl_protocols": { + "description": "set ssl protocols", + "type": "array", + "items": { + "enum": [ + "TLSv1.1", + "TLSv1.2", + "TLSv1.3" + ] + }, + "uniqueItems": true, + "maxItems": 3 + }, + "certs": { + "type": "array", + "items": { + "oneOf": [ + { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + { + "type": "string", + "pattern": "^\\$(secret|env|ENV)://" + } + ] + } + }, + "sni": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "else": { + "required": [ + "key", + "cert" + ] + }, + "additionalProperties": false, + "if": { + "properties": { + "type": { + "enum": [ + "server" + ] + } + } + }, + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "ssls_conf_version": { + "type": "number" + }, + "global_rules": { + "type": "array", + "items": { + "properties": { + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object" + }, + "create_time": { + "type": "integer" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "plugins" + ], + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "global_rules_conf_version": { + "type": "number" + }, + "consumer_groups": { + "type": "array", + "items": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "plugins" + ], + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "consumer_groups_conf_version": { + "type": "number" + }, + "plugin_configs": { + "type": "array", + "items": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "plugins": { + "type": "object" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "type": "string" + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "plugins" + ], + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "plugin_configs_conf_version": { + "type": "number" + }, + "stream_routes": { + "type": "array", + "items": { + "properties": { + "upstream_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "protocol": { + "properties": { + "conf": { + "description": "protocol-specific configuration", + "type": "object" + }, + "name": { + "type": "string" + }, + "superior_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "logger": { + "type": "array", + "items": { + "properties": { + "conf": { + "description": "logger plugin configuration", + "type": "object" + }, + "name": { + "type": "string" + }, + "filter": { + "description": "logger filter rules", + "type": "array" + } + }, + "additionalProperties": false, + "dependentRequired": { + "name": [ + "conf" + ] + } + } + } + }, + "type": "object", + "required": [ + "name" + ] + }, + "sni": { + "description": "server name indication", + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "remote_addr": { + "description": "client IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "server_addr": { + "description": "server IP", + "anyOf": [ + { + "type": "string", + "title": "IPv4", + "format": "ipv4" + }, + { + "pattern": "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([12]?[0-9]|3[0-2])$", + "title": "IPv4/CIDR", + "type": "string" + }, + { + "type": "string", + "title": "IPv6", + "format": "ipv6" + }, + { + "pattern": "^([a-fA-F0-9]{0,4}:){1,8}(:[a-fA-F0-9]{0,4}){0,8}([a-fA-F0-9]{0,4})?/[0-9]{1,3}$", + "title": "IPv6/CIDR", + "type": "string" + } + ], + "type": "string" + }, + "plugins": { + "type": "object" + }, + "server_port": { + "description": "server port", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "upstream": { + "$ref": "#/components/schemas/EmbeddedUpstream" + }, + "service_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "type": "object", + "additionalProperties": false, + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "stream_routes_conf_version": { + "type": "number" + }, + "protos": { + "type": "array", + "items": { + "properties": { + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "content": { + "minLength": 1, + "type": "string", + "maxLength": 1048576 + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "modifiedIndex": { + "type": "integer" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "content" + ], + "description": "Built-in schema from apisix/schema_def.lua; additional handler checks apply." + } + }, + "protos_conf_version": { + "type": "number" + }, + "plugin_metadata": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + }, + "plugin_metadata_conf_version": { + "type": "number" + }, + "secrets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Secret" + } + }, + "secrets_conf_version": { + "type": "number" + }, + "plugins": { + "type": "array", + "items": {} + }, + "plugins_conf_version": { + "type": "number" + } + }, + "description": "YAML-provider configuration. Credentials are entries in consumers with id username/credentials/id. Resource version numbers may not decrease; unchanged versions retain existing resources. Omitted versions increment by one, and omitted resource arrays are cleared on update. Lua validates duplicate IDs and resource checkers, without cross-resource reference checks." + }, + "StandaloneRead": { + "allOf": [ + { + "$ref": "#/components/schemas/StandaloneConfig" + } + ], + "properties": { + "X-Digest": { + "type": "string" + }, + "X-Last-Modified": { + "type": "integer" + } + } + }, + "HealthCheckActive": { + "type": "object", + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "port": { + "minimum": 1, + "type": "integer", + "maximum": 65535 + }, + "req_headers": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "uniqueItems": true + } + }, + "http_path": { + "type": "string", + "default": "/" + }, + "https_verify_certificate": { + "type": "boolean", + "default": true + }, + "healthy": { + "type": "object", + "properties": { + "http_statuses": { + "minItems": 1, + "items": { + "minimum": 200, + "type": "integer", + "maximum": 599 + }, + "uniqueItems": true, + "default": [ + 200, + 302 + ], + "type": "array" + }, + "successes": { + "minimum": 1, + "default": 2, + "type": "integer", + "maximum": 254 + }, + "interval": { + "minimum": 1, + "type": "integer", + "default": 1 + } + } + }, + "type": { + "default": "http", + "type": "string", + "enum": [ + "http", + "https", + "tcp" + ] + }, + "unhealthy": { + "type": "object", + "properties": { + "http_statuses": { + "minItems": 1, + "items": { + "minimum": 200, + "type": "integer", + "maximum": 599 + }, + "uniqueItems": true, + "default": [ + 429, + 404, + 500, + 501, + 502, + 503, + 504, + 505 + ], + "type": "array" + }, + "timeouts": { + "minimum": 1, + "default": 3, + "type": "integer", + "maximum": 254 + }, + "interval": { + "minimum": 1, + "type": "integer", + "default": 1 + }, + "tcp_failures": { + "minimum": 1, + "default": 2, + "type": "integer", + "maximum": 254 + }, + "http_failures": { + "minimum": 1, + "default": 5, + "type": "integer", + "maximum": 254 + } + } + }, + "timeout": { + "type": "number", + "default": 1 + }, + "concurrency": { + "type": "integer", + "default": 10 + } + } + }, + "HealthCheckPassive": { + "type": "object", + "properties": { + "unhealthy": { + "type": "object", + "properties": { + "http_statuses": { + "minItems": 1, + "items": { + "minimum": 200, + "type": "integer", + "maximum": 599 + }, + "uniqueItems": true, + "default": [ + 429, + 500, + 503 + ], + "type": "array" + }, + "timeouts": { + "minimum": 0, + "default": 7, + "type": "integer", + "maximum": 254 + }, + "tcp_failures": { + "minimum": 0, + "default": 2, + "type": "integer", + "maximum": 254 + }, + "http_failures": { + "minimum": 0, + "default": 5, + "type": "integer", + "maximum": 254 + } + } + }, + "type": { + "default": "http", + "type": "string", + "enum": [ + "http", + "https", + "tcp" + ] + }, + "healthy": { + "type": "object", + "properties": { + "http_statuses": { + "minItems": 1, + "items": { + "minimum": 200, + "type": "integer", + "maximum": 599 + }, + "uniqueItems": true, + "default": [ + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 226, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308 + ], + "type": "array" + }, + "successes": { + "minimum": 0, + "default": 5, + "type": "integer", + "maximum": 254 + } + } + } + } + }, + "HealthCheck": { + "properties": { + "passive": { + "$ref": "#/components/schemas/HealthCheckPassive" + }, + "active": { + "$ref": "#/components/schemas/HealthCheckActive" + } + }, + "anyOf": [ + { + "required": [ + "active" + ] + }, + { + "required": [ + "active", + "passive" + ] + } + ], + "type": "object" + }, + "EmbeddedUpstream": { + "properties": { + "key": { + "description": "the key of chash for dynamic load balancing", + "type": "string" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "create_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "nodes": { + "anyOf": [ + { + "type": "object", + "patternProperties": { + ".*": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + } + } + }, + { + "type": "array", + "items": { + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "port": { + "description": "port of node", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "weight": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + }, + "priority": { + "description": "priority of node", + "type": "integer", + "default": 0 + }, + "metadata": { + "description": "metadata of node", + "type": "object" + } + }, + "type": "object", + "required": [ + "host", + "weight" + ] + } + } + ] + }, + "retries": { + "type": "integer", + "minimum": 0 + }, + "retry_timeout": { + "type": "number", + "minimum": 0 + }, + "tls": { + "properties": { + "client_key": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "verify": { + "description": "Turn on server certificate verification, currently only kafka upstream is supported", + "type": "boolean", + "default": false + }, + "client_cert_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "client_cert": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + } + }, + "type": "object", + "dependentSchemas": { + "client_key": { + "required": [ + "client_cert" + ] + }, + "client_cert_id": { + "not": { + "required": [ + "client_cert", + "client_key" + ] + } + }, + "client_cert": { + "required": [ + "client_key" + ] + } + } + }, + "discovery_args": { + "type": "object", + "properties": { + "namespace_id": { + "description": "namespace id", + "type": "string" + }, + "group_name": { + "description": "group name", + "type": "string" + } + } + }, + "pass_host": { + "description": "mod of host passing", + "default": "pass", + "type": "string", + "enum": [ + "pass", + "node", + "rewrite" + ] + }, + "keepalive_pool": { + "type": "object", + "properties": { + "requests": { + "minimum": 1, + "type": "integer", + "default": 1000 + }, + "size": { + "minimum": 1, + "type": "integer", + "default": 320 + }, + "idle_timeout": { + "minimum": 0, + "type": "number", + "default": 60 + } + } + }, + "service_name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "upstream_host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "type": { + "description": "algorithms of load balancing", + "type": "string", + "default": "roundrobin" + }, + "checks": { + "$ref": "#/components/schemas/HealthCheck" + }, + "hash_on": { + "enum": [ + "vars", + "header", + "cookie", + "consumer", + "vars_combinations" + ], + "type": "string", + "default": "vars" + }, + "discovery_type": { + "description": "discovery type", + "type": "string" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "scheme": { + "description": "The scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be kafka.", + "default": "http", + "enum": [ + "grpc", + "grpcs", + "http", + "https", + "tcp", + "tls", + "udp", + "kafka" + ] + } + }, + "additionalProperties": false, + "type": "object", + "oneOf": [ + { + "required": [ + "nodes" + ] + }, + { + "required": [ + "service_name", + "discovery_type" + ] + } + ] + }, + "EmbeddedUpstreamRequest": { + "properties": { + "key": { + "description": "the key of chash for dynamic load balancing", + "type": "string" + }, + "id": { + "$ref": "#/components/schemas/ResourceId" + }, + "name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "desc": { + "type": "string", + "maxLength": 256 + }, + "labels": { + "$ref": "#/components/schemas/Labels" + }, + "nodes": { + "anyOf": [ + { + "type": "object", + "patternProperties": { + ".*": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + } + } + }, + { + "type": "array", + "items": { + "properties": { + "host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "port": { + "description": "port of node", + "maximum": 65535, + "type": "integer", + "minimum": 1 + }, + "weight": { + "description": "weight of node", + "type": "integer", + "minimum": 0 + }, + "priority": { + "description": "priority of node", + "type": "integer", + "default": 0 + }, + "metadata": { + "description": "metadata of node", + "type": "object" + } + }, + "type": "object", + "required": [ + "host", + "weight" + ] + } + } + ] + }, + "retries": { + "type": "integer", + "minimum": 0 + }, + "retry_timeout": { + "type": "number", + "minimum": 0 + }, + "tls": { + "properties": { + "client_key": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + }, + "verify": { + "description": "Turn on server certificate verification, currently only kafka upstream is supported", + "type": "boolean", + "default": false + }, + "client_cert_id": { + "$ref": "#/components/schemas/ResourceId" + }, + "client_cert": { + "minLength": 128, + "type": "string", + "maxLength": 65536 + } + }, + "type": "object", + "dependentSchemas": { + "client_key": { + "required": [ + "client_cert" + ] + }, + "client_cert_id": { + "not": { + "required": [ + "client_cert", + "client_key" + ] + } + }, + "client_cert": { + "required": [ + "client_key" + ] + } + } + }, + "discovery_args": { + "type": "object", + "properties": { + "namespace_id": { + "description": "namespace id", + "type": "string" + }, + "group_name": { + "description": "group name", + "type": "string" + } + } + }, + "pass_host": { + "description": "mod of host passing", + "default": "pass", + "type": "string", + "enum": [ + "pass", + "node", + "rewrite" + ] + }, + "keepalive_pool": { + "type": "object", + "properties": { + "requests": { + "minimum": 1, + "type": "integer", + "default": 1000 + }, + "size": { + "minimum": 1, + "type": "integer", + "default": 320 + }, + "idle_timeout": { + "minimum": 0, + "type": "number", + "default": 60 + } + } + }, + "service_name": { + "minLength": 1, + "type": "string", + "maxLength": 256 + }, + "upstream_host": { + "type": "string", + "pattern": "^\\*$|^\\*?[0-9a-zA-Z-._\\[\\]:]+$" + }, + "type": { + "description": "algorithms of load balancing", + "type": "string", + "default": "roundrobin" + }, + "checks": { + "$ref": "#/components/schemas/HealthCheck" + }, + "hash_on": { + "enum": [ + "vars", + "header", + "cookie", + "consumer", + "vars_combinations" + ], + "type": "string", + "default": "vars" + }, + "discovery_type": { + "description": "discovery type", + "type": "string" + }, + "timeout": { + "$ref": "#/components/schemas/Timeout" + }, + "scheme": { + "description": "The scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be kafka.", + "default": "http", + "enum": [ + "grpc", + "grpcs", + "http", + "https", + "tcp", + "tls", + "udp", + "kafka" + ] + } + }, + "additionalProperties": false, + "type": "object", + "oneOf": [ + { + "required": [ + "nodes" + ] + }, + { + "required": [ + "service_name", + "discovery_type" + ] + } + ] + }, + "ResourceId": { + "anyOf": [ + { + "pattern": "^[a-zA-Z0-9-_.]+$", + "minLength": 1, + "type": "string", + "maxLength": 64 + }, + { + "type": "integer", + "minimum": 1 + } + ] + }, + "Timeout": { + "properties": { + "read": { + "type": "number", + "exclusiveMinimum": 0 + }, + "connect": { + "type": "number", + "exclusiveMinimum": 0 + }, + "send": { + "type": "number", + "exclusiveMinimum": 0 + } + }, + "type": "object", + "required": [ + "connect", + "send", + "read" + ] + }, + "Labels": { + "description": "key/value pairs to specify attributes", + "type": "object", + "patternProperties": { + ".*": { + "description": "value of label", + "minLength": 1, + "type": "string", + "pattern": "^\\S+$", + "maxLength": 256 + } + } + } + }, + "parameters": { + "Ttl": { + "name": "ttl", + "in": "query", + "required": false, + "schema": { + "type": "number" + }, + "description": "Lease duration in seconds, passed to etcd. Only numeric conversion is checked by the Admin handler; the backend can reject invalid lease durations.", + "example": 3600 + }, + "Force": { + "name": "force", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "Only the literal true skips dependency checks.", + "example": "true" + }, + "Page": { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer" + }, + "description": "v3 only. Pagination requires both page and page_size to be numeric. A page below 1 is clamped to 1. Omission does not supply a default.", + "example": 1 + }, + "PageSize": { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 10, + "maximum": 500 + }, + "description": "v3 only. With a numeric page, paginate after filtering and sort by createdIndex. If either argument is absent, return all filtered entries.", + "example": 20 + }, + "name": { + "name": "name", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "v3 only: regular expression matched against value.name." + }, + "label": { + "name": "label", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "v3 only: match a label key (not its value)." + }, + "uri": { + "name": "uri", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "v3 only: regular expression matched against uri and uris." + }, + "filter": { + "name": "filter", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "v3 only: encoded query string of exact service_id/upstream_id matches. Supported only for routes and stream_routes. Unsupported fields are ignored." + }, + "Subsystem": { + "name": "subsystem", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "http", + "stream" + ], + "default": "http" + }, + "description": "Plugin subsystem." + }, + "SchemaType": { + "name": "schema_type", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "The literal consumer selects consumer_schema; otherwise returns the normal schema." + }, + "All": { + "name": "all", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "The literal true returns the loaded plugin catalog, including schemas and attributes. Deprecated.", + "example": "true", + "deprecated": true + } + }, + "responses": { + "400": { + "description": "Invalid input or a referenced resource prevents this operation.", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/Error" + }, + { + "type": "string" + } + ] + } + } + } + }, + "401": { + "description": "Missing/incorrect key or method forbidden for a viewer key.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "error_msg": "failed to check token", + "description": "missing apikey" + } + } + } + }, + "404": { + "description": "Resource, plugin, or key not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Key not found" + } + } + } + }, + "503": { + "description": "Backend unavailable, write disabled on data plane, or concurrent update failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "examples": { + "Route": { + "summary": "Illustrative Route configuration", + "value": { + "uri": "/example", + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + } + } + }, + "Service": { + "summary": "Illustrative Service configuration", + "value": { + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + } + } + }, + "Upstream": { + "summary": "Illustrative Upstream configuration", + "value": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + } + }, + "Consumer": { + "summary": "Illustrative Consumer configuration", + "value": { + "username": "jack", + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + }, + "Credential": { + "summary": "Illustrative Credential configuration", + "value": { + "plugins": { + "key-auth": { + "key": "example-key" + } + } + } + }, + "GlobalRule": { + "summary": "Illustrative GlobalRule configuration", + "value": { + "plugins": {} + } + }, + "ConsumerGroup": { + "summary": "Illustrative ConsumerGroup configuration", + "value": { + "plugins": {} + } + }, + "PluginConfig": { + "summary": "Illustrative PluginConfig configuration", + "value": { + "plugins": {} + } + }, + "StreamRoute": { + "summary": "Illustrative StreamRoute configuration", + "value": { + "server_port": 9100, + "upstream": { + "type": "roundrobin", + "nodes": { + "127.0.0.1:1980": 1 + } + } + } + }, + "Proto": { + "summary": "Illustrative Proto configuration", + "value": { + "content": "syntax = \"proto3\"; message Hello { string name = 1; }" + } + }, + "SSL": { + "summary": "Illustrative SSL configuration (set both APISIX_EXAMPLE_TLS_CERT and APISIX_EXAMPLE_TLS_KEY in the APISIX environment first)", + "value": { + "sni": "test.com", + "cert": "$env://APISIX_EXAMPLE_TLS_CERT", + "key": "$env://APISIX_EXAMPLE_TLS_KEY" + } + }, + "Secret": { + "summary": "Illustrative Secret configuration", + "value": { + "uri": "http://127.0.0.1:8200", + "prefix": "kv", + "token": "example-token" + } + }, + "Metadata": { + "summary": "Illustrative Metadata configuration", + "value": {} + } + } + }, + "x-apisix-source": { + "repository": "https://github.com/apache/apisix", + "revision": "3a504e5eef0a7cbbbc5ae18df37e0a7c3598c7bc", + "version": "3.16.0", + "files": [ + "apisix/admin/init.lua", + "apisix/admin/resource.lua", + "apisix/admin/v3_adapter.lua", + "apisix/schema_def.lua", + "apisix/core/etcd.lua", + "apisix/admin/standalone.lua" + ] + } +} diff --git a/utils/check-admin-api.py b/utils/check-admin-api.py new file mode 100644 index 000000000000..7628a8816cb6 --- /dev/null +++ b/utils/check-admin-api.py @@ -0,0 +1,286 @@ +#!/usr/bin/env python3 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""Offline checks for the release's Admin API OpenAPI document. + +Validation-only dependencies: jsonschema, openapi-spec-validator, lupa. +Install them in a virtual environment, then run python utils/check-admin-api.py. +No server, credentials, or external documentation repository is used. +Lua 5.1 evaluates schema_def.lua, which has no requires or runtime side effects. +This checks static schema parity; it does not replace live Admin API tests. +""" + +import copy +import json +import re +from pathlib import Path + +from jsonschema import Draft202012Validator +from lupa import LuaRuntime +from openapi_spec_validator import validate +from referencing import Registry, Resource +from referencing.jsonschema import DRAFT202012 + +if not __debug__: + raise RuntimeError("run this checker without Python optimization so validation assertions remain active") + +ROOT = Path(__file__).resolve().parents[1] +SPEC = ROOT / "docs/en/latest/admin-api.json" + + +def unique_object(pairs): + result = {} + for key, value in pairs: + assert key not in result, f"Duplicate JSON key: {key}" + result[key] = value + return result + + +spec_text = SPEC.read_text() +assert not re.search(r"api7|apiseven", spec_text, re.IGNORECASE) +spec = json.loads(spec_text, object_pairs_hook=unique_object) +assert not re.search(r"-----BEGIN (?:[A-Z]+ )?PRIVATE KEY-----", spec_text) + + +def walk(value, location=""): + yield location, value + if isinstance(value, dict): + for key, child in value.items(): + yield from walk(child, location + "/" + key) + elif isinstance(value, list): + for index, child in enumerate(value): + yield from walk(child, location + "/" + str(index)) + + +def deref(value): + while isinstance(value, dict) and "$ref" in value: + pointer = value["$ref"] + assert pointer.startswith("#/"), f"External reference: {pointer}" + value = spec + for segment in pointer[2:].split("/"): + value = value[segment.replace("~1", "/").replace("~0", "~")] + return value + + +refs = 0 +for location, value in walk(spec): + if isinstance(value, dict) and "$ref" in value: + deref(value) + refs += 1 +validate(spec) +version = re.search(r'VERSION = "([^"]+)"', + (ROOT / "apisix/core/version.lua").read_text()).group(1) +assert spec["info"]["version"] == version +assert spec["x-apisix-source"]["version"] == version + +# Use an in-memory registry: no HTTP retrieval during example validation. +uri = "urn:apisix:admin-api" +registry = Registry().with_resource( + uri, Resource.from_contents(spec, default_specification=DRAFT202012)) +resolver = registry.resolver(uri) +counts = {"examples": 0, "defaults": 0, "schemas": 0} + + +def check_example(schema, example, location): + validator = Draft202012Validator(schema, registry=registry, _resolver=resolver) + errors = list(validator.iter_errors(example)) + assert not errors, f"{location}: " + "; ".join(e.message for e in errors) + counts["examples"] += 1 + + +def check_schema(schema, location): + Draft202012Validator.check_schema(schema) + counts["schemas"] += 1 + # Descend only into schemas, not example data or named property containers. + for keyword, value in schema.items(): + if keyword in ("properties", "patternProperties", "$defs", "dependentSchemas"): + for name, child in value.items(): + check_schema(child, location + "/" + keyword + "/" + name) + elif keyword in ("allOf", "anyOf", "oneOf", "prefixItems"): + for index, child in enumerate(value): + check_schema(child, location + "/" + keyword + "/" + str(index)) + elif keyword in ("items", "additionalProperties", "not", "if", "then", "else", "contains"): + if isinstance(value, dict): + check_schema(value, location + "/" + keyword) + if "default" in schema: + check_example(schema, schema["default"], location + "/default") + counts["defaults"] += 1 + for index, example in enumerate(schema.get("examples", [])): + check_example(schema, example, location + "/examples/" + str(index)) + + +for name, schema in spec["components"]["schemas"].items(): + check_schema(schema, "components/schemas/" + name) + + +def check_media(content, location): + for mime, item in content.items(): + schema = item.get("schema", {}) + check_schema(schema, location + "/" + mime) + if "example" in item: + check_example(schema, item["example"], location) + for name, example in item.get("examples", {}).items(): + example = deref(example) + assert "externalValue" not in example + check_example(schema, example["value"], location + "/" + name) + + +operations = set() +ids = set() +for path, item in spec["paths"].items(): + for method, op in item.items(): + if method == "parameters": + continue + operations.add((path.removeprefix("/apisix/admin"), method)) + assert re.fullmatch(r"[A-Za-z][A-Za-z0-9]*", op["operationId"]) + assert op["operationId"] not in ids, op["operationId"] + ids.add(op["operationId"]) + params = [deref(p) for p in item.get("parameters", []) + op.get("parameters", [])] + keys = [(p["in"], p["name"]) for p in params] + assert len(keys) == len(set(keys)), (path, method, "duplicate parameters") + expected = set(re.findall(r"{([^}]+)}", path)) + actual = {p["name"] for p in params if p["in"] == "path"} + assert expected == actual, (path, method, expected, actual) + for param in params: + assert param["in"] != "path" or param["required"] + check_schema(param["schema"], path + "/" + param["name"]) + if "example" in param: + check_example(param["schema"], param["example"], path) + if "requestBody" in op: + check_media(deref(op["requestBody"])["content"], path + "/" + method + "/request") + assert op["responses"], (path, method) + for status, response in op["responses"].items(): + response = deref(response) + assert response["description"] + assert method != "head" or "content" not in response + check_media(response.get("content", {}), path + "/" + method + "/" + status) + +# Independently derive supported CRUD methods from each release module. +modules = { + "routes": "routes", "services": "services", "upstreams": "upstreams", + "consumers": "consumers", "ssls": "ssl", "global_rules": "global_rules", + "consumer_groups": "consumer_group", "plugin_configs": "plugin_config", + "stream_routes": "stream_routes", "protos": "proto", + "plugin_metadata": "plugin_metadata", "secrets": "secrets", +} +expected_ops = set() +for resource, module in modules.items(): + text = (ROOT / f"apisix/admin/{module}.lua").read_text() + match = re.search(r"unsupported_methods\s*=\s*{([^}]+)}", text) + unsupported = set(re.findall(r'"(\w+)"', match.group(1))) if match else set() + base = "/" + resource + suffix = "/{username}" if resource == "consumers" else "/{plugin_name}" if resource == "plugin_metadata" else "/{secret_type}/{id}" if resource == "secrets" else "/{id}" + item = base + suffix + expected_ops.update([(base, "get"), (item, "get"), (item, "put"), (item, "delete")]) + if resource not in ("secrets", "plugin_metadata"): + expected_ops.add((base, "put")) + if "post" not in unsupported: + expected_ops.add((base, "post")) + if "patch" not in unsupported: + expected_ops.update([(item, "patch"), (item + "/{sub_path}", "patch")]) +expected_ops.add(("/secrets/{secret_type}", "get")) +expected_ops.update({ + ("/consumers/{username}/credentials", "get"), + ("/consumers/{username}/credentials", "put"), + ("/consumers/{username}/credentials/{id}", "get"), + ("/consumers/{username}/credentials/{id}", "put"), + ("/consumers/{username}/credentials/{id}", "delete"), + ("/plugins/{plugin_name}", "get"), ("/schema/plugins/{plugin_name}", "get"), + ("/plugins", "get"), ("/plugins/list", "get"), ("/plugins/reload", "put"), + ("/schema/{resource}", "get"), ("/schema/validate/{resource}", "post"), + ("", "head"), ("/configs", "get"), ("/configs", "put"), + ("/configs", "head"), ("/configs/validate", "post"), +}) +assert operations == expected_ops, ("Missing", expected_ops - operations, "Extra", operations - expected_ops) + +# Evaluate the exact release schema_def.lua with Lua 5.1. Normalize only the +# Draft 4 dependencies keyword into the equivalent 2020-12 keywords. +def native_json(value, key=""): + if hasattr(value, "items"): + keys = list(value.keys()) + if keys and all(isinstance(k, int) for k in keys): + return [native_json(value[i]) for i in range(1, len(keys) + 1)] + if not keys and key in {"required", "enum", "allOf", "anyOf", "oneOf", "examples", "default"}: + return [] + result = {str(k): native_json(v, str(k)) for k, v in value.items()} + dependencies = result.pop("dependencies", {}) + for name, dependency in dependencies.items(): + keyword = "dependentRequired" if isinstance(dependency, list) else "dependentSchemas" + result.setdefault(keyword, {})[name] = dependency + return result + return value + + +def expand(value): + if isinstance(value, dict): + if "$ref" in value: + return expand(deref(value)) + return {key: expand(child) for key, child in value.items()} + if isinstance(value, list): + return [expand(child) for child in value] + return value + + +native = native_json(LuaRuntime().execute((ROOT / "apisix/schema_def.lua").read_text())) +parity = 0 +for name, schema in spec["components"]["schemas"].items(): + if "x-apisix-schema" not in schema: + continue + exported = copy.deepcopy(schema) + key = exported.pop("x-apisix-schema") + exported.pop("description", None) + original = copy.deepcopy(native[key]) + original.pop("description", None) + assert expand(exported) == original, f"Native schema drift: {name}" + parity += 1 + +# The three built-in secret manager schemas are local declarations. Evaluate +# only those declarations with uri_def, without importing networking modules. +lua = LuaRuntime() +lua_source = lua.execute((ROOT / "apisix/schema_def.lua").read_text()) +for backend in ("vault", "aws", "gcp"): + text = (ROOT / f"apisix/secret/{backend}.lua").read_text() + declaration = text[text.index("local schema = {"):text.index("\nlocal _M =")] + value = lua.execute("local core = {schema = ...}\n" + declaration + "\nreturn schema", lua_source) + assert native_json(value) == expand(spec["components"]["schemas"][backend.title() + "Secret"]) + +# Ensure the request variants remove only timestamps and the injected id +# requirement, while retaining every release constraint on actual fields. +for name, schema in spec["components"]["schemas"].items(): + if "x-apisix-schema" not in schema: + continue + expected_request = expand(schema) + expected_request.pop("x-apisix-schema") + expected_request.pop("description", None) + for field in ("create_time", "update_time"): + expected_request["properties"].pop(field, None) + if "upstream" in expected_request["properties"]: + expected_request["properties"]["upstream"]["properties"].pop(field, None) + if "required" in expected_request: + required = [v for v in expected_request["required"] if v != "id"] + if required: + expected_request["required"] = required + else: + expected_request.pop("required") + actual_request = expand(spec["components"]["schemas"][name + "Request"]) + actual_request.pop("description", None) + assert actual_request == expected_request, f"Request schema drift: {name}" + +print(f"PASS: OpenAPI {spec['openapi']}; APISIX {version}; {len(operations)} operations; " + f"{refs} internal refs; unique operation IDs and exact path parameters") +print(f"PASS: {parity} native resource/request schemas and 3 secret manager schemas; {counts['schemas']} schema checks; " + f"{counts['examples']} example/default validations; {counts['defaults']} defaults") diff --git a/utils/requirements-admin-api.txt b/utils/requirements-admin-api.txt new file mode 100644 index 000000000000..8593728c7daf --- /dev/null +++ b/utils/requirements-admin-api.txt @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Validation-only dependencies; the checker reads only local files. +openapi-spec-validator==0.7.2 +jsonschema==4.23.0 +referencing==0.36.2 +lupa==2.8