v0.12.0
Released November 11, 2026. Supported until May 11, 2027.
v0.12.0 ships 30 behavior changes, 11 security updates, 35 new features, 15 bug fixes, and 1 deprecation. Request logs now record the caller kind and authentication method of each call, with filters and usage statistics on both, and carry policy decision records. The security updates include the fix for MCP session IDs that could be forged with a publicly known seed (GHSA-953h-535j-jg2v): each data plane now encrypts them with its own seed, so open MCP sessions end once at the upgrade and clients reconnect. On self-hosted installs, an oauth MCP profile now takes its sign-in settings from its project's gateway auth policy, and MCP_OAUTH_STRICT_PROFILES turns on by default in 0.13. Several changes take effect only once the data plane is on 0.12.0 or later.
A fully detailed version of these release notes (including artifact versions) is included in the Admin Console.
The full release notes are opened from the Admin Console, as described in Check the management plane version.
Upgrade and rollback
- The release carries no breaking change. 43 changes name operator steps of their own, given with each change in the full release notes in the Admin Console.
- The upgrade rolls through without dropping traffic.
- Rollback to v0.11.1 is conditional. See the note below.
After a rollback of the management plane to a release before 0.12.0, the usage that the older release rolls up has no caller kind or authentication method, and GET /v1/usage/stats and GET /v1/usage/caller-adoption count it as unknown until the usage-rollup backfill that this release describes runs over that window on 0.12.0. Before rolling a data plane back to 0.11, set controller.config.mcpOAuthStrictProfiles: true on the 0.11 release.
Behavior changes
Management plane API
Developer request-log responses add ordered policy decision records and fallback status for unavailable-model fallback chains and budget exhaustion reroutes, and no longer expose policy IDs, names, rule details, or policy identity keys in llm_parameters. Policy identities are read from the management API.
A guardrail trigger whose rules ran only in monitor mode now reports its verdict as WOULD_HAVE_BLOCKED or WOULD_HAVE_REDACTED instead of WOULD_HAVE. WOULD_HAVE still works as a filter for both, and verdict_counts keeps its WOULD_HAVE entry as their sum.
GetGuardrailTriggerStats now covers the last 24 hours by default instead of every event ever recorded, and refuses a range longer than 30 days. Its totals, top lists and time distribution count only that range, which date_from and date_to set. A client that needs totals over more than 30 days sums several ranges.
On a self-hosted install, an oauth MCP profile takes its issuer, keys, audiences and required scopes from its project's gateway auth policy. Creating an oauth profile, switching a profile to oauth, or changing an oauth profile's settings in a project with no gateway auth policy returns failed_precondition with "set up a gateway auth policy for the project first". On SaaS a profile keeps its own issuer and key set.
On a self-hosted install, creating an oauth MCP profile, switching one to oauth or changing an oauth profile's settings returns failed_precondition, instead of saving a profile that is never served, in a project that accepts only API keys on every gateway where it has a gateway auth policy. A rename or a description edit still works. accepted_credentials is set to token or both first, on the project gateway with UpdateProjectGatewayProject.
Super Admin now also holds principals.read, principals.edit, passthrough_settings.read, passthrough_settings.edit, project.mcp_profile.read, project.mcp_profile.edit and idp_registrations.read, .create, .edit and .delete, and the admin management key holds the two principals permissions. The upgrade gives all ten to each custom role, group and person whose permissions covered every earlier Super Admin permission, so each organization admin stays one. Others keep what they had.
Creating a project with the name of a deleted project hides the revoked API keys that the deleted project still listed. A project deleted before 0.11.0 left them listed, and the new project showed them as its own. ListApiKeys reports these keys as API_KEY_STATUS_DELETED; each keeps its revocation stamp and stays on the data plane's revocation list. A project that already took the name of a deleted project before this release still lists the old revoked keys. A script that finds the keys of a deleted project with the REVOKED status filters on API_KEY_STATUS_DELETED as well.
The management plane API's /v1/billing/stripe/webhook now handles every Stripe event, and the Developer Console's /api/webhooks/stripe forwards each Stripe and low-balance event to it unchanged. If the Developer Console upgrades before the management plane API, an event gets 404 and Stripe sends it again. The Stripe endpoint stays as it is, and a low-balance webhook URL set by hand points to /v1/billing/stripe/webhook on the management plane API host.
ListApiKeys called with a management key bound to an organization now lists only the keys of that organization that match the filters, when the request names no customer_id, including a request filtered by project_id or application_keys_only. When another organization uses the same project_id, the request returns the key's own organization's keys for that project_id. A key that is not bound to an organization, such as the platform admin key, still lists every organization's keys, so a script that lists API keys across organizations uses such a key.
Request-log lists cap total_count at 10,000 and set total_count_capped when more matches exist.
Fallback and traffic-splitting policy lists without a key filter, and policy Gets, now show a key's policies only to its owner, its project's owners and admins. Other users, read-only ones included, and management keys or service accounts without the admin scope, even the key owner's, no longer see them, and a Get returns NOT_FOUND. The Admin Console uses the signed-in user's access. Project, tag and organization policies do not change. A user who must see the policies of keys they do not own is made an owner of the key's project or an admin, and a management key or service account that reads key policies needs the admin scope.
Management plane
The upgrade runs database migrations 0220, 0221, 0222, 0232 and 0233, which add the caller kind to principals, a default caller kind to identity mapping rules and project OIDC contracts, and the caller kind and authentication method to request logs and usage rollups. Every existing principal of type human is set to person. A migration that stops on its lock timeout is retried. Until the usage rollups that precede the upgrade are rebuilt, as described under New features, the usage pages count earlier requests as unknown.
Data plane
The AI Gateway controller serves Prometheus metrics on port 8080 of the ai-gateway-controller Service (http-metrics), where it actually listens; the Service exposed 9090 before, which answered nothing. A scrape config or NetworkPolicy that targets port 9090 moves to 8080. The controller also runs as non-root user 65532 with all capabilities dropped and the RuntimeDefault seccomp profile, and a startup probe gives it up to 150 seconds to sync its cache before the liveness probe applies.
Gateway
MCP_OAUTH_STRICT_PROFILES is off by default in 0.12, so an existing self-hosted oauth MCP profile with its own issuer and key set keeps working, with any audience and a warning, when its project has no gateway auth policy. An oauth profile with no issuer or no key set is never served. Setting it to true serves only profiles backed by a project policy and leaves out servers with an empty tool list. It turns on by default in 0.13, so before then each self-hosted project with oauth profiles needs a gateway auth policy, and each MCP server's tools are selected by name or as regex:*. On SaaS, the management plane is upgraded before the data planes. Available once the data plane is on 0.12.0 or later.
On a self-hosted install, an oauth MCP profile backed by the project's gateway auth policy refuses a token issued for another audience, or missing one of the policy's required scopes, with 403, and the request never reaches the MCP server, so the tokens that MCP clients send carry an audience and the scopes the policy requires. A data plane older than 0.12.0 receives no oauth MCP profiles from a 0.12 management plane, so the data planes that serve them are upgraded to 0.12.0. Available once the data plane is on 0.12.0 or later.
On a self-hosted install, an oauth MCP profile backed by a gateway auth policy is served on a project gateway only while its project accepts IdP tokens there (accepted credentials token or both). A project that accepts API keys alone, the default, gets no MCP route for those profiles. Changing the setting takes the route down or brings it back within seconds, so accepted credentials are set to token or both on each such project gateway before or right after the upgrade. The metric to check is valet_mcp_oauth_profile_policy_refusals_total{reason="none"}. Available once the data plane is on 0.12.0 or later.
On a self-hosted install, an oauth MCP profile is never sent to a gateway with more than one gateway auth policy for its project, or one it cannot use, such as a policy with no audience, so each such project needs exactly one usable gateway auth policy on that gateway. The management plane counts these refusals in valet_mcp_oauth_profile_policy_refusals_total{reason} (none, ambiguous or old_data_plane), and the data plane counts them in liaison_mcp_oauth_profile_rule_violations_total{rule="policy",mode="refused"}. Neither metric names profiles; the management plane logs a warning for each refused profile with its profile_id, project_id and reason.
A request to an endpoint its provider cannot serve, such as /v1/responses to a Vertex AI or Vertex Anthropic provider, now returns 422 instead of 500. router_errors_total counts it as upstream_client_error, not internal_server_error, so an alert or dashboard that counted these requests as 5xx needs updating.
A request that carries an identity-provider token in Authorization: Bearer and the same token once in X-API-Key is now served as a token call, which is how Claude Code sends the output of its apiKeyHelper. A single whitespace-only X-API-Key beside such a token is now treated as absent. Every other X-API-Key beside a token gets the same answer as in 0.11.0. Available once the data plane is on 0.12.0 or later.
Helm charts
A secure controller.mcp.sessionEncryption.seed that is already set is kept by the upgrade. Removing default-insecure-seed switches to a generated seed. To move to a managed secret, controller.mcp.sessionEncryption.existingSecret is set and seed is removed.
Request-log archival now runs one job at a time (concurrencyPolicy: Forbid) and starts no new batch in the last 3 minutes of LOG_ARCHIVAL_RUN_BUDGET (default 50m), so its archive pass ends within that budget. It reads pending rows in pages and fills each batch up to an estimated LOG_ARCHIVAL_MAX_BATCH_BYTES of row data (a larger row goes alone), so a large backlog no longer runs it out of memory, and GOMEMLIMIT now follows the container memory limit. Where archival runs more often than hourly, archival.env.LOG_ARCHIVAL_RUN_BUDGET is set below the schedule interval.
Consoles
The Developer Console saves the Usage picked for a provider's first key together with the key. While the management plane is still upgrading from a version before 0.11.0, adding a provider's first key says its Usage was not saved, and the key gets "Exclusive". Its Usage is then set from Manage.
The Admin Console's user edit API (PATCH /api/admin/users/{id}) no longer changes a user's role, and refuses a request that sends a role with 422. A role set there bypassed role bindings and wrote no Access page audit record. Status and team changes work as before. Roles are changed under Directory → Access, and a script that sends a role to this API needs updating.
Banning, unbanning, or changing the team of a user on the Admin Console's Users page now leaves only the management plane's audit records (BAN_USER, UNBAN_USER, ADD_USER_GROUP_MEMBERS and REMOVE_USER_GROUP_MEMBERS). The Admin Console's own BAN, ACTIVATE and UPDATE records for users stop, except for a request the Admin Console refuses before it reaches the management plane, so saved audit log searches and alerts that match those records need updating.
A user's automatic join to the organization's default project is now recorded in the audit log as AUTO_JOIN_DEFAULT_PROJECT instead of project_member.auto_join. The new record names the joining user as its subject and in its resource ID, not as its actor, so searches and alerts on project_member.auto_join use the new value.
Auto top-up counts a payment method as set only when the user has a default card. Saving auto top-up settings fails until adding a card or a payment has been started.
In a time zone with a half-hour offset, the days and comparison periods on the Usage page start on the hour. Model names there can take up to an hour to follow a change to the model catalog. The Usage page breaks usage down by at most 1,000 API keys or models, while the totals still count all of them, and selecting more than 1,000 API keys as a filter fails.
The bonus credit card on the Developer Console Home page no longer shows when ENABLE_CORPORATE_LOGIN is on, even with ENABLE_BONUS_CLAIM set.
In the Admin Console, a project's page no longer has the API Keys, Providers, MCP Servers, Routing and Requests tabs. The pages are in the project menu: Access → API Keys, Catalog → Providers and MCP Servers, Policies → Attribute-Based Routing, and Usage → Requests. The same people can open them, a project owner can now manage the project's API keys without an organization role, and old tab links open the new pages. Routing no longer counts the keys its policy routes.
The Admin Console's Audit Logs page opens on the last 24 hours instead of all events, and pages through a fixed time window, so rows no longer repeat or go missing while new events arrive. Older events are shown by picking a longer range or All time from the Date filter. See Audit Agent Router activity.
Security updates
Consoles
Fetching an MCP server's tools in the Admin Console now checks the server's URL and each redirect before the call. Loopback, link-local and cloud metadata addresses are always refused, and private network addresses are refused by default. Setting ALLOW_PRIVATE_MCP_SERVER_URLS to "true" in the Admin Console's env Helm values admits private network addresses, such as a server inside the cluster, and nothing else.
An MCP server sign-in in the Developer Console now connects an account only for the user who started it, in the browser that started it. A sign-in link sent to another person no longer connects their account to the sender. A management plane on this release refuses every Developer Console MCP server sign-in until the Developer Console is on this release too, so the Developer Console is upgraded no later than the management plane, and a sign-in that was open during the upgrade is started again.
An MCP server sign-in that an app starts with a delegated token now returns to the app, and the app's server finishes it. The account is connected only when the user signed in to the app is the user who started the sign-in. The app passes an absolute returnUrl on an allowed app origin to /api/oauth/{provider}/authorize, then POSTs the oauth_state and oauth_code it receives to /api/oauth/{provider}/complete with a delegated token for the user signed in to the app.
A project owner can no longer add the Goose sign-in tags to their own API key to claim the Goose bonus. Only a Goose sign-in sets these tags, and they no longer show in an API key's tags. A user who signed in with Goose before the upgrade signs in with Goose again before claiming the Goose bonus or sending a claim again.
Playground tool calls on an MCP profile now go through the profile's MCP address on the data plane, so the profile's authentication applies as it does for any MCP client. An API key or OAuth profile asks for its API key or sign-in token in the configuration panel, and an API key profile accepts only its creator's key, so other users in the project get a 403 on it.
Data plane
MCP session IDs can no longer be forged with the publicly known seed that every data plane used to encrypt them (GHSA-953h-535j-jg2v). Each data plane now encrypts them with its own random seed, created once in the tars-gateway-mcp-session-seed Secret in the system namespace and kept across upgrades and re-renders. The old seed is not accepted, so MCP sessions opened before the upgrade end and clients reconnect once. The Secret is kept when a data plane's system namespace is restored or recreated, or open MCP sessions end.
Agent Router components built with Go 1.27.4 include the net/http security fix.
Management plane API
Building the Go SDK requires Go 1.27.4 or later, which includes the net/http security fix.
Granting or revoking super_admin changes nothing for a user who is not in the caller's organization, which returns NOT_FOUND, or who is also in another organization, which returns FAILED_PRECONDITION. A user is in an organization through a project membership or a role binding there. A caller can revoke their own super_admin role even when in no organization, but not while in another one. On an auth database declared as holding one organization (RBAC_AUTH_DB_MODE=single), every user is in it. A newly invited user is added to a project or given a role before super_admin is granted, and a user in more than one organization is first removed from all but one.
Adding a user to a project, or to the default project, returns NOT_FOUND and changes nothing for a user who is not in the caller's organization. A user is in an organization when they are a user of one of its projects or hold a role there. The Developer Console still adds a user who signs in for the first time to the default project. On an auth database declared as holding one organization (RBAC_AUTH_DB_MODE=single), every user is in it. A user is asked to sign in to the organization once before being added to a project by ID, or is invited by email when no account exists yet. The invite-by-email path is not checked yet, so an existing account of another organization is not invited that way.
A Project Owner can no longer create, change, turn off or delete traffic-splitting policies outside their project. A traffic-splitting policy request that names a project must target that project or an API key in it, or it returns PERMISSION_DENIED, even for an organization administrator. Tag-targeted traffic-splitting policies, and those of other projects, are managed through the organization-level API without a project_id.
New features
Management plane API
GuardrailTriggersService.ListGuardrailTriggers sorts by page.order_by (triggered_at or execution_duration_ms, with an optional asc or desc), and filters on the new WOULD_HAVE_BLOCKED and WOULD_HAVE_REDACTED verdicts.
GetGuardrailTriggerStats takes a date range, a time zone and guardrail type filters.
GetGuardrailStats takes types and exclude_types, so its counts can leave out evaluators or any other guardrail type.
Each request log carries authentication_method, which is how the data plane verified the caller: api_key for an Agent Router API key, idp_token for an identity-provider token, including a caller admitted through a project's OIDC contract, or unknown. It is empty for request logs stored before 0.12.0 and for requests that a data plane older than 0.12.0 served, and the management plane never fills it in later. Available once the data plane is on 0.12.0 or later.
Each request log carries app_id, end_user_id and agent_name. app_id is the azp, appid, client_id or cid claim of a verified identity-provider token, and it is empty for an API key call. The caller chooses end_user_id and agent_name, so no policy reads them. A request that an older data plane serves carries none of the three. Available once the data plane is on 0.12.0 or later.
The management plane stamps caller_kind on each request log when it stores it and never changes it: person or application when the API key is linked to a principal of that kind, otherwise person when a user owns the key, including an agent or CI job that runs with that user's key, and otherwise unknown.
QueryRequestLogs, GetRequestLogStats and GetCustomerRequestLogStats take caller_kind and authentication_method filters, and the two stats calls group by caller_kind and by authentication_method. An earlier management plane ignores the new filters and returns every request, so they are sent only once the management plane is on 0.12.0. Requests served by a data plane older than 0.12.0 carry no authentication method and count as unknown. Available once the data plane is on 0.12.0 or later.
An identity mapping rule takes caller_kind_default (person, application or unknown), which the management plane copies into each principal that the rule creates. A rule created without it holds unknown, and a rule cannot be edited, so a new default means deleting the rule and creating it again, which leaves the principals it already created as they were.
A project's OIDC contract takes caller_kind_default (person, application or unknown), which the management plane copies into each principal that the contract creates.
GET /v1/usage/stats takes caller_kind (person, application or unknown) and authentication_method (api_key, idp_token or unknown) as filters, group_by and subgroup_by values, and groups add up to the totals. Available once the data plane is on 0.12.0 or later.
GET /v1/usage/caller-adoption counts, from the usage rollups, the distinct users recorded as people, as applications and as unknown in a time range of up to 400 days.
ListPrincipals, GetPrincipal and UpdatePrincipalCallerKind let an admin list an organization's principals, read one, and correct whether it is a person or an application with a required reason, which the audit log records as UPDATE_PRINCIPAL_CALLER_KIND with the old and the new kind. The upgrade sets every existing principal of type human to person and leaves every other principal unknown. A rule's or a contract's default applies only to principals created after it, so the kind of an existing principal is corrected here. The management plane stamps the corrected kind on the request logs it stores from about 30 seconds after the correction, and never changes a kind it already stamped.
The SCIM server stores the userType attribute of a user, trimmed and at most 256 bytes, returns it on GET and in lists, and lists it in the User schema. The management plane reads it nowhere yet, so it changes no permission and no caller kind. Every management plane replica is upgraded before the identity provider relies on userType: while a replica of an earlier release still runs, and after a rollback to an earlier release, each write of a user by such a replica drops the stored userType until the identity provider sends it again.
Request logs persist policy summaries and QueryRequestLogs filters by policy (policy_filter, policy_type) across attribute_routing, rate_limit, budget, fallback_chain and traffic_split. Available once the data plane is on 0.12.0 or later.
Admins can count requests attributed to a policy over a required time window and filter request logs to that policy.
GuardrailsService.ListGuardrails sorts by page.order_by (name, type, severity, created_at or updated_at, with an optional asc or desc), and with include_rules returns each guardrail's rules in Guardrail.rules.
MeService.ListMyProjects accepts include_member_summary to return project user counts and permission-controlled previews of up to three users per project.
Signed-in users can read their own built-in role without user-directory access.
Users with project.mcp_profile.read list and use every MCP profile in the project; users with project.mcp_profile.edit (Project Owner and org Admins by default, or a custom role) edit and delete them, and a creator always edits their own.
CatalogService.AssignModelsToProject grants a project up to 100 catalog models in one call.
Signed-in users can see their bonus claim state, claim a bonus and start its card verification through the API.
A new organization setting, Count passthrough in budgets, makes passthrough usage count toward every budget at list price. The default is No, which keeps the current behavior. The setting is in the Admin Console under Settings → Passthrough, and a Super Admin changes it. See Budgets.
GET /v1/request-logs filters by status class with status_class: ERROR keeps the requests with status code 400 or above, CLIENT_ERROR 400 to 499, and SERVER_ERROR 500 to 599, the same rule the usage rollups count errors by.
GET /v1/request-logs filters by several users with user_ids and by team with team_ids, with the same rule GetUsageStats filters teams by: a team ID keeps the requests of its current members, and Untagged the requests with no user or of a user with no team, a deleted team, or a team of another organization than the request's.
GetModelStats and GetClientStats read request, error, latency, token and cost figures for each model and each client application, with user, team and name filters, ordering and pages. They need an organization-wide management key with the metrics_reader scope and the usage.read permission, and a project key is refused.
Developers can read MCP call logs and call statistics for their own MCP profiles through GET /v1/me/mcp-operations and GET /v1/me/mcp-operations/stats.
Gateway
The data plane now runs Envoy Gateway v1.9.3, and every gateway pod restarts once during the upgrade.
The data plane now runs Envoy AI Gateway v1.2.0, and every gateway pod restarts once during the upgrade.
Helm charts
GET /v1/usage/stats and GET /v1/usage/caller-adoption read the usage rollups, where usage recorded before 0.12.0 stays under unknown until the rollups of that window are rebuilt once. The rebuild gives each such request whose API key still exists the kind that the same rule gives from that key's current principal and owner, and it changes no request log. It runs after every management plane replica and the usage-rollup CronJob are on 0.12.0: the CronJob is suspended, a Job is created from it as "Backfill via CLI (kubectl)" in the usage-rollup chart README describes, with BUCKETS_BACK reaching back to the oldest day reported on and RETENTION_HOURS at least that many hours, and the CronJob is resumed when the Job ends, whether or not it succeeded. The suspension stops the CronJob's retention cleanup from deleting hourly rows that the Job is still summing into daily rows. Where the bootstrapper pre-upgrade hook is off, usage-rollup Jobs can fail during the upgrade until the management plane migrations finish, and the next Job catches up.
tare CLI
tetrate agentrouter idp login signs a person in to the organization's identity provider in a browser or with a device code, and tetrate agentrouter idp token prints a current access token for Claude Code's apiKeyHelper, refreshing it before it expires. The identity provider needs a public client that issues refresh tokens. The refresh token is kept in the operating system's credential store, with a fallback to a file only the user can read on Linux and macOS and none on Windows. Claude Code sends the token in Authorization and X-API-Key, which the data plane accepts from 0.12.0. Available once the data plane is on 0.12.0 or later.
Request logs
Request logs include structured policy-decision steps for attribute routing, budget policies, rate-limit policies, fallback policies and traffic-splitting policies, and indicate whether a fallback served the request. Available once the data plane is on 0.12.0 or later.
Consoles
The Developer Console lists a project's MCP profiles, each marked Mine or Shared, with an All, Mine or Shared filter.
The Admin Console's Request Logs page shows every policy that acted on a request in the order it ran, now including budget, fallback and traffic-splitting policies, and filters requests by any of these policy types. Available once the data plane is on 0.12.0 or later.
In the Playground, model reasoning and tool calls show as collapsible lines, with failed tool calls labeled "Tool failed".
The Developer Console adds a Logs page to each MCP profile, with that profile's calls, filters, grouped statistics and call details.
Bug fixes
tare CLI
tare upgrade, tare precheck and remote upgrades from the Admin Console accept data planes installed from release charts again.
tetrate agentrouter api help shows a flag's value type where it showed a word from its description instead, for example --search string for --search x-request-id.
Data plane
The AI Gateway pod-mutating webhook now ships with the CA of its certificate in the same render, so a data plane installed from rendered manifests, such as with Argo CD, no longer applies a webhook and certificate that disagree.
Management plane API
Archiving an organization removes its private-address settings, so a new organization created with the same ID cannot inherit the old settings.
Usage statistics grouped or split by API key now return the key's current name in apiKeyName, where they returned an empty name.
A management key with the Read, Write or Admin scope can now list and get MCP profiles, where it was refused before. A project key reads its own project; an organization-wide key reads the projects its owner belongs to. The management plane applies the change on its next start, and where it runs with RBAC_AUTO_BOOTSTRAP=false, an operator reseeds the built-in roles.
Consoles
Request Logs no longer shows the previous filter's log count while the list reloads.
The Developer Console Home page and the MCP sign-in user info now show only the endpoint URL that the signed-in user can see, no longer show an empty URL that another user caused, and show a newly attached data plane's URL straight away.
A bulk ban on the Admin Console's Users page that the management plane partly refuses is now recorded as a failure.
Where low-balance events go to the Developer Console's /api/webhooks/stripe, auto top-up no longer charges the card after it is turned off, or a second time when the same low-balance event is delivered again.
Cancelling a top-up that Stripe is already processing now fails.
The Playground MCP picker lists every MCP profile of the project that the signed-in user can read, with a Shared badge on profiles other members created.
On the Admin Console's Audit Logs page, a day picked in the Date filter now covers that day in the viewer's time zone (west of UTC it started on the day before), and events with no HTTP status no longer show "HTTP 0".
The Admin Console's Usage charts no longer freeze when the range includes the day daylight saving time starts in Chile or Cuba.
When the management plane refuses an API key the Admin Console asked for and records the refusal as an ISSUE_MY_KEY failure, the Admin Console no longer adds a second failure record.
Deprecations
Gateway
Sending X-API-Key more than once beside an identity-provider token is deprecated. When the first X-API-Key value is empty, the data plane still serves the request as a token call and ignores the later values. A later release refuses such a request with 400 credentials_conflict. At most one X-API-Key is sent beside an identity-provider token: the same token as in Authorization, or none.