API7 Enterprise Release Notes
3.9.13
Release Date: 2026-05-22
Breaking Changes
Plugins
-
CAS Auth
Upgrade noteThe
cas-authplugin now requires acookie.secretvalue of at least 32 characters. The plugin uses this secret to sign and verify theCAS_REQUEST_URIcookie, preventing a client-controlled cookie from changing the post-login redirect target.Before upgrading, update every existing
cas-authconfiguration with a sharedcookie.secretacross all gateway nodes.
Upgrade Notes
The proxy-cache and graphql-proxy-cache plugins now use safer cache behavior by default.
For proxy-cache, responses are isolated by consumer when the request has an authenticated consumer or remote user, unless the configured cache_key already contains an identity-bearing variable. The in-memory strategy also no longer caches responses whose upstream Cache-Control contains private, no-store, or no-cache, and both in-memory and on-disk strategies skip responses with Set-Cookie unless cache_set_cookie is set to true.
For graphql-proxy-cache, cache keys now include host, route, service, and consumer identity by default, and responses with Set-Cookie are skipped unless cache_set_cookie is set to true.
If you intentionally share cached responses across consumers, set consumer_isolation: false. If you intentionally cache responses with Set-Cookie, set cache_set_cookie: true.
Features
Plugins
- AI Proxy
- Improved OpenAI-compatible streaming response throughput by reducing per-token flush and SSE parsing overhead. In internal single-worker benchmarks with a mock OpenAI upstream, peak streaming throughput increased from 44,102.6 tokens/s to 138,158.7 tokens/s, about 3.13x higher.
- Improved large JSON request body handling for AI requests that use
post_arg.*route variables. In internal benchmarks with 1 MB, 5 MB, and 10 MB OpenAI Chat Completions-compatible request bodies, throughput improved by 5.15x-5.35x when the gateway forwarded the original body, and by 2.47x-2.67x when the gateway rewrote the body before forwarding. - Added
streaming_flush_interval_msto control periodic flushing for streaming responses. The default is 10 ms, which reduces per-chunk flush overhead while keeping streaming latency bounded.
- OpenAPI to MCP
- Added
allowed_hoststo restrict which hosts a dynamically resolvedbase_urlmay target. Whenallowed_hostsis not configured, existing behavior is unchanged. The plugin also rejects malformed resolved URLs and non-HTTP(S) schemes with HTTP 400.
- Added
- Proxy Cache and GraphQL Proxy Cache
- Added
consumer_isolationandcache_set_cookieoptions to control the new safer cache behavior described in the upgrade note.
- Added
Control Plane
- Alert policies can now automatically create Debug Sessions when alert conditions are triggered. Alert history records whether debug session creation succeeded and includes the created session IDs or error details.
- Fallback Control Plane storage now supports S3-compatible path-style endpoints, which enables integrations with providers such as MinIO that require bucket names in the URL path.
Console (Dashboard)
- Added Debug Sessions UI under Gateway Groups, including session list, create, stop, delete, trace list, trace waterfall detail, search and filtering, minimap, URL state sync, field formatting, and keyboard navigation.
- Added a copy button to delete/disable confirmation dialogs so users can copy the resource identifier before confirming destructive operations.
- Added search support to the service and route selector on the monitoring page.
Developer Portal
- Added a Helm chart for deploying the Developer Portal on Kubernetes.
Fixes
Plugins
- OpenID Connect
- Fixed issue: Client-supplied identity headers (
X-Access-Token,X-Userinfo,X-ID-Token,X-Refresh-Token) could be forwarded upstream instead of values validated by the plugin. These headers are now cleared or overwritten so upstream services only receive plugin-controlled identity values.
- Fixed issue: Client-supplied identity headers (
- Data Mask
- Fixed issue: The plugin could crash or produce incorrect masked output for multi-value query parameters, valueless query parameters, non-string JSON values, regex failures, and form parsing errors. It also no longer logs original sensitive values when regex substitution fails.
- ACL
- Fixed issue:
external_user_label_field_parserandexternal_user_label_field_separatorcould be applied to consumer labels, causing incorrect allow or deny decisions. They now apply only to external-user label extraction.
- Fixed issue:
- Chaitin WAF and Wolf RBAC
- Fixed issue: The plugins used raw client-supplied IP headers when sending client IP information to their backend services. They now use the trusted real client IP resolved by the gateway.
- Client Control
- Fixed issue: When a Global Rule plugin read the request body in the access phase,
client-controlon a route or service could not apply its body size override first, causing large requests to be rejected unexpectedly.
- Fixed issue: When a Global Rule plugin read the request body in the access phase,
Control Plane
- Fixed issue: Deleting a Secret that was still referenced by other resources could leave dangling references and cause gateway runtime errors. Secret deletion is now rejected while references exist.
- Fixed issue: Data Plane Manager certificates could fail hostname verification for older Data Planes when
dp_manager_addresscontained both domain names and IP addresses. - Fixed issue: Malformed gateway version strings in heartbeat payloads could crash compatibility validation. They are now handled as incompatible versions instead of causing a panic.
- Fixed issue: Invalid stream route CIDR/IP values and invalid
post_arg.*JSON path expressions could be accepted by the Control Plane and later rejected or dropped by the Data Plane. These configurations are now rejected at the API level. - Fixed issue: Sensitive encrypted field values could appear in logs when decrypting
AesEncryptfields failed. Logs now include only the value length.
Data Plane
- Fixed issue: Stream routes that referenced a service could keep using stale service-level plugin configuration until the route changed or the worker restarted.
- Fixed issue: Gateway workers could crash during startup when the etcd or DP Manager response was missing expected revision headers. The gateway now logs the problem and retries.
- Fixed issue: Stream workers could crash during config sync when status reporting was enabled.
- Fixed issue: The standard gateway runtime image did not honor the
TZenvironment variable for IANA timezone names because timezone data was missing. - Fixed issue: The tracer could crash on HTTPS or HTTP/2 keepalive connections when tracing was enabled.
- Fixed issue: The gateway CLI wrote Control Plane mTLS client certificate files to the system temporary directory with overly broad permissions. These files are now written under the gateway config certificate directory with restricted permissions.
Console (Dashboard)
- Fixed issue: The OpenID Connect plugin code editor could collapse or become unreachable on small or highly zoomed viewports.
- Fixed issue: Deleting a published service from the service list could show a misleading "service not found" error toast after deletion succeeded.
- Fixed issue: List table defaults could be mutated by one page and leak invalid sorting parameters into the Gateway Instances page.
- Fixed issue: The plugin view drawer could show stale or incorrect JSON when switching between local, global, and metadata tabs.
- Fixed issue: Cached gateway group or portal IDs that no longer existed could lead to blank pages or 404 error toasts instead of redirecting to a valid fallback.
3.9.12
Release Date: 2026-05-08
Features
Plugins
- AI Proxy
- Added support for the AWS Bedrock provider using the Converse API. Configure with
"provider": "bedrock", AWS IAM credentials inauth.aws, and an AWS region inprovider_conf.region. Both non-streaming and streaming (ConverseStream) modes are supported — set"stream": truein the request body for streaming responses.
- Added support for the AWS Bedrock provider using the Converse API. Configure with
- OAS Validator
- Added
spec_urlfield that loads the OpenAPI specification from a remote HTTP(S) URL instead of embedding the full JSON inline in the plugin configuration. This is useful when the spec exceeds the 2 MB inline size limit of thespecfield. The fetched spec is cached with a configurable TTL (default 1 hour, set via plugin metadataspec_url_ttl), and stale entries continue serving requests while the spec refreshes in the background. Additional fieldsspec_url_request_headers(custom HTTP headers, e.g. for authentication) andtimeout(request timeout in milliseconds, default 10000) are available.specandspec_urlare mutually exclusive.
- Added
Fixes
Plugins
- File Logger
- Fixed issue: When both the
gzipplugin andfile-logger(withinclude_resp_bodyenabled) were configured on a route,file-loggerincorrectly attempted to decompress the response body. Because APISIX itself performed the gzip encoding, the body available to the logger was still plaintext, causing spuriousinflate gzip err: INFLATE: data errorlog entries and the response body being lost from the log output.
- Fixed issue: When both the
- Elasticsearch Logger
- Fixed issue: Dynamic index patterns using date-time placeholders (such as
gateway-{%Y.%m.%d}) stopped rotating after the first request. The resolved date string was written back to the shared configuration object, permanently overwriting the template until the worker process restarted.
- Fixed issue: Dynamic index patterns using date-time placeholders (such as
- OAS Validator
- Fixed issue: Header parameter validation was case-sensitive, causing requests to be rejected when the header name casing did not exactly match the OpenAPI specification (for example, sending
X-Request-Idwhen the spec definedx-request-id). Header matching is now case-insensitive per RFC 7230 §3.2.
- Fixed issue: Header parameter validation was case-sensitive, causing requests to be rejected when the header name casing did not exactly match the OpenAPI specification (for example, sending
3.9.11
Release Date: 2026-04-30
Upgrade Notes
This version extends secret references ($secret://, $env://) to work with all plugins centrally. After upgrading the Control Plane to 3.9.11, if you configure secret references in plugin fields that previously did not support them, a Data Plane still running 3.9.10 or earlier will not resolve those references — it will pass the literal $secret://... string to the plugin.
Recommended upgrade path: Upgrade all Data Planes to 3.9.11 before configuring secret references in newly-supported plugin fields. Plugins that already supported secrets in previous versions (jwt-auth, openid-connect, limit-count, authz-keycloak, csrf, limit-req, limit-conn) are not affected.
Features
Plugins
- AI Proxy
- Added a passthrough protocol adapter that proxies unrecognized API formats (such as
/v1/images/generations) through to the upstream without transformation. Previously, requests that did not match a known protocol (OpenAI Chat, Completions, Embeddings, etc.) were rejected. - Rewrote the Anthropic-to-OpenAI protocol converter using a whitelist body construction approach. This prevents Anthropic-specific fields (such as
metadata,top_k,thinking, andoutput_config) from leaking through to OpenAI-compatible upstream providers, and improves conversion accuracy for tool use, system prompts, and multimodal content. - Upstream nginx variables (
$upstream_status,$upstream_addr,$upstream_response_time,$upstream_header_time,$upstream_connect_time,$upstream_response_length) are now populated in access logs when ai-proxy uses cosocket transport to call LLM backends. Previously, these variables were empty because nginx's upstream module was bypassed.
- Added a passthrough protocol adapter that proxies unrecognized API formats (such as
- OAS Validator
- Replaced the Go FFI-based OpenAPI validator with a pure-Lua implementation (
lua-resty-openapi-validator). Internal benchmarks on a real-world large-scale OpenAPI specification (Stripe, ~414 endpoints) show the new validator is 2–7x faster per-request and compiles the spec 20x faster, while also reducing gateway image size by eliminating the Go shared library. The new validator additionally fixes correctness issues with path parameter routing, nullable schemas, allOf/anyOf merging, and adds support for validating form-encoded request bodies that the previous implementation could not handle.
- Replaced the Go FFI-based OpenAPI validator with a pure-Lua implementation (
- All plugins now support
$secret://and$env://references in any configuration field automatically. Previously, only a handful of plugins (jwt-auth, openid-connect, limit-count, authz-keycloak, csrf, limit-req, limit-conn) had explicit secret reference support. This removes the need for each plugin to implement secret resolution individually.
Data Plane
- A new distroless gateway image variant (
api7-ee-3-gateway-distroless) is now available. Built from scratch with only the shared libraries, CA certificates, and timezone data needed to run the gateway, it eliminates OS packages that carry CVEs but are unused at runtime.
Console (Dashboard)
- Configuration compatibility warnings and errors are now displayed in a separate clickable badge on Data Plane instance cards. Clicking the badge opens a modal with a detailed table of all configuration issues (resource type, ID, severity level, and message), making it easier to identify and resolve config schema problems without confusing them with version compatibility status.
Fixes
Plugins
- AI Proxy Multi
- Fixed issue: After the Control Plane pushed a config update, health check validation logged noisy warnings (
unable to construct upstream for plugin: ai-proxy-multi) because DNS resolution state was lost during the config table replacement.
- Fixed issue: After the Control Plane pushed a config update, health check validation logged noisy warnings (
- AI Rate Limiting
- Fixed issue: AI instance names containing dots (such as
Qwen3.5-397B-10.249.238.157) caused HTTP 500 errors because the name was incorrectly interpreted as actx.varpath expression instead of a constant key.
- Fixed issue: AI instance names containing dots (such as
- AI Request Rewrite
- Fixed issue: Requests with no body produced a vague upstream error instead of returning a clear HTTP 400 Bad Request.
- AI Prompt Template
- Fixed issue: JSON parse error messages were garbled Lua table references (such as
table: 0x...) instead of readable error strings.
- Fixed issue: JSON parse error messages were garbled Lua table references (such as
- OpenTelemetry
- Fixed issue: Non-string values in
additional_attributes(such as numbers or booleans from nginx variables) were silently dropped by the OpenTelemetry SDK. They are now coerced to strings before being added to spans.
- Fixed issue: Non-string values in
- Limit Count
- Fixed issue: Redis credentials (
redis_password,redis_username,sentinel_password) were embedded in rate-limiting group keys, exposing sensitive information in Redis keyspace and APISIX logs.
- Fixed issue: Redis credentials (
- Traffic Split (Stream)
- Fixed issue:
ctx.var.route_idalways returned nil in stream (L4) context, causing match conditions based onroute_idin traffic-split rules to never match. - Fixed issue: When traffic-split selected an upstream via
upstream_idin stream context, the selection was ignored and the route's original upstream was always used.
- Fixed issue:
Control Plane
- Fixed issue: Warning-level entries in the configuration compatibility report incorrectly caused Data Plane instances to display "Upgrade Recommended" even when the Control Plane and Data Plane versions matched.
Data Plane
- Fixed issue: The batch processor entered an infinite timer loop during nginx worker shutdown, preventing graceful shutdown and flooding logs with
[alert]messages. - Fixed issue: The batch processor's
processed_entriescounter was reset when stale buffers were cleaned up, breaking delivery metrics for batch-processing plugins (such as http-logger, kafka-logger). - Fixed issue: Active health check
request_bodyconfiguration was silently ignored because the underlying healthcheck library expects the field to be namedhttp_req_body. The schema field has been renamed to match. - Fixed issue: Sensitive field values were exposed in error logs when encrypt/decrypt operations failed. Error messages no longer include the raw value.
- Fixed issue: During upgrades with newly added
encrypt_fields, expected decrypt failures of pre-existing plaintext data generated noisy warn-level log entries. These are now logged at info level with an explanatory message.
3.9.10
Release Date: 2026-04-22
Breaking Changes
Plugins
-
Upgrade note
The OpenAPI2MCP service is no longer bundled inside the gateway image. It now runs as a separate sidecar container (
api7/openapi-to-mcp), reducing the gateway image size by approximately 150 MB. If you use theopenapi-to-mcpormcp-tools-aclplugins, you must deploy the OpenAPI2MCP sidecar alongside the gateway. In Kubernetes, enableopenapiToMcp.enabled=truein the gateway Helm chart. In Docker Compose, run theapi7/openapi-to-mcpcontainer in the same network namespace as the gateway.
Upgrade Notes
This version adds encrypt_fields to several plugins: AI Proxy (auth.header, auth.query, auth.gcp.service_account_json), AI Proxy Multi (same fields under instances.*), AI RAG (embeddings_provider.azure_openai.api_key, vector_search_provider.azure_ai_search.api_key), AWS Lambda (authorization.apikey, authorization.iam.accesskey, authorization.iam.secretkey), OpenID Connect (added client_rsa_private_key), and SAML Auth (added secret_fallbacks).
Once the Control Plane is upgraded to 3.9.10, it encrypts these newly declared fields when writing route/service configurations to etcd. If a Data Plane is still running an older version (3.9.9 or earlier), it does not know about these new encrypt_fields and will skip decryption, causing the encrypted ciphertext to be used as-is — for example, an AI Proxy route will send the AES ciphertext instead of the real API key, resulting in silent authentication failures (HTTP 401 from the LLM provider).
Recommended upgrade path: Follow the standard upgrade sequence — upgrade the Control Plane first, then the Data Planes. However, after upgrading the Control Plane, do not modify configurations for the affected plugins listed above until all Data Planes have been upgraded to 3.9.10. Any configuration edit or re-publish on these plugins will cause the Control Plane to encrypt the newly declared fields, which older Data Planes cannot decrypt. Upgrade Data Planes to 3.9.10 as soon as possible after the Control Plane upgrade to restore full encrypt/decrypt parity.
Features
Plugins
- AI Proxy
- Added
override.request_bodyfor per-protocol deep-merge request body overrides andoverride.llm_optionsfor provider-awaremax_tokensmapping. Operators can set protocol-specific parameters (such asmax_tokens,stop_sequences) as defaults or enforced settings using therequest_body_force_overrideflag. Precedence order: model options → LLM options (always force) → request body (per-protocol deep merge). - Added
max_stream_duration_msandmax_response_bytessafeguards to prevent unbounded LLM streaming responses from pinning a worker process at high CPU. When either limit is exceeded, the stream is terminated gracefully with appropriate error signaling. - The gateway now detects client disconnection during streaming and immediately stops reading from the LLM upstream, freeing worker resources and avoiding unnecessary API quota consumption.
- Added
- Prometheus, OpenTelemetry, Zipkin
- Added a new
response_sourcelabel (Prometheus) andapisix.response_sourcespan attribute (OpenTelemetry, Zipkin) that classifies each response as"apisix"(generated by APISIX, such as plugin rejections or route-not-found),"nginx"(NGINX proxy errors such as connection refused or upstream timeout), or"upstream"(real response from the upstream service). This enables more precise error attribution in dashboards and alerts.
- Added a new
Control Plane
- Added Consul as a service discovery source. Gateways can now discover upstream services registered in Consul, with support for metadata-based filtering and health-check-aware node selection.
- The Control Plane can now dynamically push telemetry configuration (such as trace sampling ratio and export endpoints) to Data Planes via heartbeat, without requiring a gateway restart.
- Added
skip_mtls_uri_regexto SSL/SNI configuration, allowing specific URI patterns to bypass mTLS client certificate verification while keeping mTLS enforced for all other URIs. - Added
POST /apisix/admin/configs/validateendpoint for batch configuration validation. Operators can validate route, service, upstream, and plugin configurations before applying them, catching schema errors without affecting live traffic. - DP Manager now supports native gRPC etcd protocol on port 7943 via cmux, providing Data Planes with an additional connectivity option alongside the existing HTTP-based etcd protocol.
- The
encrypt_fieldsmechanism now supports nested and complex field structures, including arbitrary-depth dotted paths, arrays, and maps. Plugin configurations with deeply nested sensitive fields (such asauth.gcp.service_account_json) are now encrypted at rest correctly.
Console (Dashboard)
- Added form-based configuration modes for the Key Auth and Basic Auth plugins, enabling visual credential setup without manual JSON editing.
- Added OpenID Connect quick start presets with pre-filled configuration templates for common identity providers, simplifying initial OIDC plugin setup.
- Added Consul as a selectable service discovery type in the upstream configuration UI.
- Supported specifying the SNI when configuring
skip_mtls_uri_regex.
Fixes
Plugins
- AI Proxy
- Fixed issue: When an LLM provider emitted many small SSE chunks per second (such as single-character reasoning tokens), a single streaming request could monopolize a worker process at 100% CPU, degrading availability for all other traffic on that worker.
- Fixed issue: When a protocol converter was active (for example, Anthropic-to-OpenAI) and the upstream returned SSE events in an unexpected format, the gateway returned a 500 error instead of 502. The gateway now correctly returns 502 Bad Gateway when the upstream response format is incompatible with the configured protocol conversion.
- Fixed issue: When LLM providers returned JSON
nullfor nullable response fields (such asprompt_tokens_detailsorusage), the gateway crashed because the JSON null sentinel value passed Lua truthiness checks but could not be indexed as a table.
- AI Rate Limiting
- Fixed issue: Upstream-provided usage keys (from LLM response usage data) that collided with reserved expression environment names (such as
mathorabs) could shadow built-in functions, potentially breaking rate limiting expression evaluation or bypassing limits.
- Fixed issue: Upstream-provided usage keys (from LLM response usage data) that collided with reserved expression environment names (such as
Control Plane
- Fixed issue: Creating OAuth credentials via Developer Portal with an OIDC-type DCR Provider failed on identity providers (such as Keycloak) that require the
client_namefield. Theclient_nameis now included in both DCR register and update requests, using the Application name as the value.
Ingress Controller
- Fixed issue: The Ingress Controller set
hostson both Route and Service when translating ApisixRoute resources. For backends that do not support route-level hosts, this caused a false diff every sync cycle, triggering unnecessary PUT requests and generating massive audit log growth. In one production environment, this resulted in 8 GB / 4.2 million redundantUpdateServiceaudit log entries.
Console (Dashboard)
- Fixed issue: The service discovery loading indicator remained visible indefinitely when the discovery request failed.
- Fixed issue: Nacos service metadata was not refreshed when switching between services in the upstream configuration.
- Fixed issue: Switching login option provider types did not clean up configuration fields from the previous provider, leaving stale values in the form.
- Fixed issue: The IAM policy statements editor crashed with a null reference error when policies data was not yet loaded.
- Fixed issue: The InviteUser and ResetPassword actions did not display error messages when the API call failed, making it unclear why the operation did not succeed.
- Fixed issue: The login option name uniqueness check loaded the full list of login options unnecessarily. It now uses a lightweight API call.
- Fixed issue: The IAM delete role operation used the wrong permission action (
iam:UpdateRoleinstead ofiam:DeleteRole).
3.9.9
Release Date: 2026-04-10
Features
Control Plane
- Upstream labels are now persisted and returned correctly via the API. Previously, labels set on upstreams (e.g., by ADC or Ingress Controller) were silently dropped during persistence, causing false diffs on every sync cycle and unnecessary audit log growth.
- The file server address can now be dynamically configured through the System Settings page in the Dashboard, following the same dual-source pattern as the DP Manager address and Admin API address.
Fixes
Plugins
- AI Proxy
- Fixed issue: When using AI Proxy with protocol conversion (e.g., Anthropic client to OpenAI provider),
stream_options.include_usage=truewas injected into the pre-conversion request body instead of the post-conversion OpenAI body, so usage statistics were missing from streaming responses for converted protocols.
- Fixed issue: When using AI Proxy with protocol conversion (e.g., Anthropic client to OpenAI provider),
- Forward Auth
- Fixed issue: When the auth service responded with HTTP 200 but omitted a header listed in
upstream_headers, the original client-supplied value was forwarded to the upstream instead of being cleared. This could allow clients to spoof upstream headers by including them in the original request.
- Fixed issue: When the auth service responded with HTTP 200 but omitted a header listed in
- JWT Auth
- Fixed issue: The JWT Auth plugin did not verify that the JWT token's
algheader matched the consumer's configured algorithm before signature verification, which could allow algorithm confusion attacks.
- Fixed issue: The JWT Auth plugin did not verify that the JWT token's
Data Plane
- Fixed issue: The Data Plane compatibility report showed spurious warnings for valid plugin configurations. Plugins using
patternProperties, conditional schemas (if/then/else),allOf,dependencies, oradditionalProperties=trueincorrectly reported "unrecognized fields" warnings. Affected plugins included ai-proxy, ai-proxy-multi, openapi-to-mcp, acl, http-logger, limit-count-advanced, portal-auth, jwt-auth, proxy-rewrite, and grpc-transcode.
3.9.8
Release Date: 2026-04-07
Breaking Changes
Plugins
-
Limit Count
Upgrade noteThe
sync_interval(Redis delayed sync) feature has been removed from thelimit-countplugin and is now available exclusively in the Limit Count Advanced plugin. If you are usinglimit-countwithsync_intervalconfigured, migrate your configuration to thelimit-count-advancedplugin before upgrading. -
Upgrade note
The default value of
ssl_verifyhas been changed fromfalsetotrue. If you have OpenID Connect plugin configurations that do not explicitly setssl_verifyand your identity provider uses a self-signed certificate or a certificate issued by an internal CA, TLS verification will now fail after upgrading. Explicitly setssl_verifytofalsein affected configurations before upgrading, or ensure the IdP certificate is trusted by the gateway's CA store.
Features
Plugins
- MCP Tools ACL (New Plugin)
- Added a new plugin for per-tool access control on MCP services exposed via the OpenAPI-to-MCP plugin. Supports allowlist (
allow_tools) and denylist (deny_tools) modes with expression-based matching conditions for route-level or service-level tool access policies. Consumers and consumer groups are supported with priority-based rule evaluation. SSE responses are automatically filtered to remove denied tools fromtools/listresults.
- Added a new plugin for per-tool access control on MCP services exposed via the OpenAPI-to-MCP plugin. Supports allowlist (
- AI Proxy
- Added native Anthropic Messages API support. Requests to
/v1/messagesusing the Anthropic SDK format are now passed through directly to Anthropic-compatible backends without protocol conversion, preserving Anthropic-specific fields such as cache token usage. - Added full support for the OpenAI Responses API (
POST /v1/responses). Both streaming and non-streaming responses are handled, and all downstream plugins (RAG, content moderation, prompt decorator, prompt guard, logging) work correctly with the Responses API format.
- Added native Anthropic Messages API support. Requests to
- AI Rate Limiting
- Added a new
expressionlimit strategy with thecost_exprfield, allowing dynamic token cost calculation using custom Lua arithmetic expressions. For example,input_tokens + cache_creation_input_tokensenables cache-aware input token per minute (ITPM) rate limiting for Anthropic Claude.
- Added a new
- OAS Validator
- Added support for OpenAPI 3.1 specification validation, including features such as
exclusiveMinimum/exclusiveMaximumas numbers,if/then/elseconditional schemas, nullable types via["string", "null"],const,patternProperties,prefixItems, and JSON Schema$dynamicRef/$dynamicAnchor. - Added a configurable
rejection_status_codeoption (400–599, default 400). This allows distinguishing semantic validation errors (e.g., 422 Unprocessable Entity) from malformed request syntax (400 Bad Request).
- Added support for OpenAPI 3.1 specification validation, including features such as
- Request ID
- Added
uuidv7as a newalgorithmoption. UUID v7 generates time-ordered, lexicographically sortable unique identifiers, making them more suitable for distributed tracing and log correlation than random UUID v4.
- Added
- OpenAPI to MCP
- Added support for OpenAPI
in: headerparameters. Header parameters defined in OpenAPI specs are now correctly included in MCP tool schemas and forwarded as HTTP headers when invoking the upstream API.
- Added support for OpenAPI
Control Plane
- Added support for Vault dynamic roles for database credential rotation. Dynamic roles create temporary database users with a configurable lease TTL, improving security compared to static roles. Dynamic role is now the default mode, with automatic startup retry using exponential backoff.
- Added a standalone file-server component for hosting files accessible by MCP servers. Files can be uploaded via the Dashboard API and served through a dedicated port. The file server is disabled by default and can be enabled in the system settings.
- Added HTTP Bridge as a new Dynamic Client Registration (DCR) provider type. HTTP Bridge proxies DCR operations (register, update, delete, rotate secret) to an external identity provider via configurable HTTP endpoints.
- Added Data Plane compatibility reporting. When Control Plane and Data Plane versions differ, the Data Plane now reports incompatible resource details (schema validation failures, unknown plugin fields, missing plugins) via heartbeat. Compatibility status is viewable through the runtime instance API.
- Services can now be published without upstream configuration, enabling AI Proxy and other plugin-only scenarios where no backend upstream is needed.
- Optimized custom plugin synchronization with incremental cache refresh. The periodic sync job now queries only for changes instead of performing a full table scan, significantly reducing database load.
Data Plane
- Improved Redis Sentinel connection performance. Master node addresses are now cached with a configurable TTL, reducing Sentinel round-trip queries on each new connection. Additionally, pooled connections skip redundant AUTH and SELECT DB commands, lowering latency for high-throughput Redis operations.
Developer Portal
- Added admin impersonation. Portal administrators can impersonate organization owners to troubleshoot issues, with a 1-hour time-to-live and a persistent warning banner during impersonation.
- Added OAuth client secret regeneration for HTTP Bridge credentials. Organization owners can regenerate secrets through a confirmation modal in the credential management UI.
- Added configurable TOTP-based two-factor authentication (2FA) for Developer Portal login.
- Added role-based access control (RBAC) with three roles: Owner (full control, including organization deletion), Admin (all permissions except organization deletion), and Member (view-only access).
- Organization settings now use slug-prefixed URLs. Page URLs update automatically when switching organizations or renaming the organization slug.
- Application detail pages now display configuration based on portal settings.
- Added an optional signup notice HTML slot for displaying trusted custom content before the sign-up button on the authentication page.
Fixes
Plugins
- AI Aliyun Content Moderation
- Fixed issue: Empty or whitespace-only content caused a 400 error from the Alibaba Cloud moderation API. Additionally, LLM error responses (status ≥ 400) triggered a 500 error during response moderation, and multimodal content arrays crashed text extraction.
- AI Proxy
- Fixed issue: The
apisix_llm_active_connectionsPrometheus gauge was never decremented when a plugin exited early viangx.exit(), causing the metric to grow indefinitely and report incorrect active connection counts.
- Fixed issue: The
- AI Rate Limiting, Limit Conn, Limit Req
- Fixed issue:
$env://and$secret://references in Redis host configuration were passed as literal strings instead of being resolved to their actual values, causing Redis connection failures.
- Fixed issue:
- Fixed issue: API keys, authentication tokens, OAuth credentials, and full plugin configuration payloads were logged in plaintext across multiple plugin and agent log outputs. Sensitive data is now redacted.
Control Plane
- Fixed issue: Updating service runtime configuration (e.g., toggling service status) via PATCH failed with a schema validation error when the service had no upstream configured.
- Fixed issue: HTTP and stream subsystem plugins sharing the same name used a single cache entry, causing the wrong plugin schema to be used for validation when both subsystems were active.
- Fixed issue: Subscriptions could be deleted across API products without validating that the subscription belonged to the target product.
- Fixed issue: Services without upstream configuration showed phantom empty upstream records in the upstream list API.
- Fixed issue: Control Plane crashed with a nil pointer dereference during upgrade migration when processing services with no upstream configured.
- Fixed issue: Multiple API Products within the same Developer Portal could link to the same gateway service (same service ID and gateway group), causing configuration conflicts.
- Fixed issue: Updating an SSL certificate allowed SNI collisions when adding new domains that conflicted with existing certificates.
- Fixed issue: Deleting an API Product that shared a gateway service with another product incorrectly removed all system plugins from the shared service, breaking the other product's authentication configuration.
- Fixed issue: DCR provider authentication headers (such as Bearer tokens) were stored in the database without encryption.
- Fixed issue: Consumer credential secrets were not masked in audit logs due to a value/pointer receiver mismatch.
- Fixed issue: Approval handlers (accept/reject subscription) continued execution after returning a 403 status, bypassing the permission check and processing the request.
- Fixed issue: Read-only Developer Portal users could cancel API Product subscriptions because the endpoint used a read permission check instead of write.
- Fixed issue: PATCH operations on route and stream route runtime configurations used read-only or view-only permission checks, allowing users without write access to modify configurations.
- Fixed issue: Upstream resources were not validated against the requested service, allowing access to upstreams belonging to other services.
- Fixed issue: The CAS SSLVerify configuration flag was inverted, causing TLS certificate verification to be disabled when it was configured as enabled. This could expose CAS authentication connections to man-in-the-middle attacks.
- Fixed issue: Concurrent requests from ADC caused a fatal crash (
concurrent map writes) in the route validator due to unsynchronized access to lazy-initialized schema cache maps. - Fixed issue: API call statistics flush held a database lock during IO operations, causing performance degradation under high traffic. The flush mechanism now uses swap-and-release with batch writes.
Console (Dashboard)
- Fixed issue: The Service Hub page and related modals crashed when a service had an empty or missing name.
- Fixed issue: Adding the same service published to different gateway groups as linked services, was incorrectly blocked by frontend validation.
Data Plane
- Fixed issue: DNS resolution intermittently returned incorrect IP addresses. When the gateway operated in cache-only mode, DNS Additional section records (nameserver glue records) were incorrectly included in resolution results and their domain names overwritten with the queried domain. This caused random upstream connection failures, as the gateway occasionally selected a nameserver IP instead of the actual service IP.
- Fixed issue: Stream routes with
service_idsilently failed if the referenced service arrived after the route via etcd sync. Service status changes (enable/disable) and deletions also did not trigger stream router rebuild.
Developer Portal
- Fixed issue: Every unauthenticated request to the Developer Portal generated a "No developer ID in session" log entry, flooding production logs and obscuring real errors.
- Fixed issue: The "Regenerate Secret" option was shown (as disabled) for OIDC provider credentials, instead of being hidden. It is now only visible for HTTP Bridge credentials.
- Fixed issue: After re-signing in without logging out, the owner role was not properly restored, causing role-gated UI buttons to appear disabled until a manual page refresh.
3.9.7
Release Date: 2026-03-25
Upgrade Notes
This version adds encrypt_fields to the CSRF plugin (key) and the Kafka Proxy plugin (sasl.password). When the Control Plane is upgraded to 3.9.7 but Data Planes remain on 3.9.6 or earlier, the Control Plane encrypts the newly declared encrypt_fields for CSRF and Kafka Proxy when publishing configurations to etcd. Older Data Planes do not recognize these fields and will skip decryption, causing the AES ciphertext to be used as the actual configuration value. This results in silent failures — for example, CSRF token validation will fail because the key is garbled, and Kafka Proxy will fail to authenticate with the broker.
Recommended upgrade path: Follow the standard upgrade sequence — upgrade the Control Plane first, then the Data Planes. However, after upgrading the Control Plane, do not modify CSRF or Kafka Proxy plugin configurations until all Data Planes have been upgraded to 3.9.7. Upgrade Data Planes as soon as possible after the Control Plane upgrade.
Features
Plugins
- AI Proxy
- Added bidirectional protocol conversion between Anthropic and OpenAI formats. Users can send requests in Anthropic SDK format to OpenAI-compatible backends (such as DeepSeek or OpenRouter), with the gateway automatically converting request and response formats, including SSE streaming.
- OpenAPI to MCP
- Added MCP Tool Annotations support. Tools generated from OpenAPI specs can now carry behavioral metadata (read-only, destructive, idempotent) via the
x-mcp-annotationsvendor extension, enabling AI agents to better understand and invoke APIs.
- Added MCP Tool Annotations support. Tools generated from OpenAPI specs can now carry behavioral metadata (read-only, destructive, idempotent) via the
Control Plane
- Added a form-based UI for the Limit Count plugin in Dashboard, supporting visual configuration of Local, Redis, and Redis Cluster policies without manually editing JSON/YAML.
- Added custom menu groups in the Dashboard sidebar. External links such as internal documentation or wiki pages can be configured via a YAML config file.
- Improved performance under high API traffic by reducing database write frequency for hot-path operations (such as token last-used timestamps and gateway heartbeat timestamps) through write debouncing and in-memory caching. Also optimized distributed lock acquisition latency.
Data Plane
- Added port range support for
stream_proxyTCP and UDP listeners (e.g.,2000-2100), eliminating the need to list each port individually when configuring a large number of proxy ports. - Added
encrypt_fieldsto the CSRF plugin (key) and the Kafka Proxy plugin (sasl.password).
Fixes
Plugins
- AI Proxy
- Fixed issue: AI request token usage statistics (
prompt_tokens,completion_tokens) were inaccurate when HTTP chunk boundaries did not align with SSE event boundaries in upstream responses.
- Fixed issue: AI request token usage statistics (
- Prometheus
- Fixed issue:
apisix_llm_*metrics were exported for all API routes, even those without AI plugins enabled, causing unnecessary metric cardinality and storage overhead. Also addeddisabled_labelssupport for LLM metrics, allowing operators to selectively disable high-cardinality labels.
- Fixed issue:
Control Plane
- Fixed issue: When multiple concurrent API requests modified Global Rules simultaneously, only the last write took effect in the gateway, even though Dashboard showed all modifications as successful.
- Fixed issue: Syncing service configurations with non-HTTPS active health checks via ADC failed with the error
Unrecognized key: "https_verify_certificate". - Updated the default worker count to 1 when adding Kubernetes gateway instances in Dashboard.
Data Plane
- Fixed issue: API call count statistics became inaccurate after a gateway worker process restart (e.g., an unexpected crash).
3.9.6
Release Date: 2026-03-09
Features
Plugins
- Error Log Collect
- Added a new plugin to support centralized error log collection.
- Oas Validator
- Added a new parameter
reject_if_not_match. When set tofalse, it allows requests to pass to upstream services even if they fail OAS validation.
- Added a new parameter
- Limit Count Advanced
- Added more log information for easier debugging.
Control Plane
- Supported published Services and Routes in Resource name APIs.
- Added support for Services and Routes as alert conditions in alert policies.
- Supports dynamic rotation of Postgres credentials via Vault.
Data Plane
- Added the
rate-limiting-infovariable to retrieve detailed status information of rate-limiting plugins. - Enhanced Docker images: switched to distroless base images and upgraded busybox to fix security vulnerabilities.
Fixes
Plugins
- Limit Count Advanced
- Fixed issue: A panic in the synchronization function could cause the shared dictionary lock to not be released, leading to synchronization interruptions.
3.9.5
Release Date: 2026-02-14
Features
Plugins
- Feishu Auth
- Added a new Feishu authentication plugin based on the OAuth 2.0 Authorization Code flow, supporting integration with internal business services in the workbench.
- Dingtalk Auth
- Added a new Dingtalk authentication plugin that logs key information during the authentication process for easier tracking.
Control Plane
-
Daily License Information Logging: The control plane now records daily license information, including CPU limits, expiration time, and current core usage. It starts logging reminders 3 months before the license expires. Users can directly view CPU usage through the logs.
-
OpenTelemetry Data Collection and Visualization: The control plane can now dispatch debug and sampling tasks to data planes, receive reported data, and support data export via API along with frontend visualization.
NoteThis feature introduces Jaeger as an additional component. If deploying with Helm, note that the control plane's values file enables Jaeger by default. The official Helm chart is available at https://charts.api7.ai.
Fixes
Data Plane
- Fixed issue: When plugins with
encrypt_fieldshad schema fields withmaxLengthconstraints (e.g.,hmac-authsecret_keymax 32 chars), the encrypted ciphertext exceeded the length limit because schema validation ran before decryption.
3.9.4
Release Date: 2026-02-03
Features
Control Plane
- After disabling SCIM, users can delete historical SCIM accounts synchronized from the IdP in API7.
- Supports uploading OpenAPI 3.1.0 and 3.1.1 files.
Fixes
Plugins
- Limit Count
- Fixed issue: The counter data could be inaccurate if the Gateway crashed unexpectedly.
Data Plane
- Fixed issue: The heartbeat and metrics reporting would only use the first control plane address when multiple addresses were configured.
Control Plane
- Fixed issue: A route URL not starting with
/would cause the conflict detection API to return a500error. - Fixed issue: The code hints in the plugin configuration editor would sometimes stop working.
3.9.3
Release Date: 2026-01-26
Features
Plugins
- AI Request Rewrite
- Supported two new providers: Gemini, Vertex AI.
- SAML Auth
- Added
auth_protocol_binding_methodparameter to support configuring SAML protocol binding methods, includingHTTP-POSTandHTTP-Redirect. The default value isHTTP-Redirect(backward compatible with previous versions).HTTP-POSTmust be used when Azure AD is the identity provider.
- Added
Fixes
Plugins
- SAML Auth
-
Fixed issue: SAML sessions could not be shared across multiple gateway instances. Added the mandatory
secretfield for configuring the key to encrypt session data.Upgrade noteThe
saml-authplugin upgraded from older versions can work normally but cannot share sessions across multiple gateway instances. This issue can be resolved by configuring thesecretfield. -
Fixed issue: Missing
NameIDfield in the SAML request when processing logout requests. The absence of theNameIDfield will cause logout failure when Azure AD is the identity provider.
-
3.9.2
Release Date: 2026-01-19
Features
Plugins
- AI Proxy/AI Proxy Multi
- Supported four new providers: Gemini, Vertex AI, OpenRouter, and Anthropic.
- Basic Auth/JWT Auth/Key Auth/HMAC Auth/LDAP Auth
- Added a
realmconfiguration option to set the Realm value in theWWW-Authenticateresponse header for 401 authentication failures.
- Added a
- OpenID Connect
- Supported validating claims by configuring
claim_schema.
- Supported validating claims by configuring
Control Plane
- Rejected gateway nodes with a version higher than the Control Plane.
- Supported querying node health status in multi-upstream scenarios.