API changelog

The API operations each release changed, from the affects lists in the release notes. Each operation links to its section in the reference. Regenerate with make api.reference.generate.

v0.12.0

This release is not published yet. The operations below changed on main.

MeService

OperationKindChange
GetMenew featuresSigned-in users can read their own built-in role without user-directory access.

v0.11.0

AdminService

OperationKindChange
GetUserTokenbehaviour changesA disabled user token now shows the new DISABLED status, and the active filter no longer returns it. It was shown as active even though the data plane does not route it. A token that is both disabled and revoked or expired still shows REVOKED or EXPIRED. ListUserTokens takes a new disabled status filter that returns disabled tokens that are neither revoked nor expired; filter by revoked or expired to find the others.
ListUserTokensbehaviour changesA disabled user token now shows the new DISABLED status, and the active filter no longer returns it. It was shown as active even though the data plane does not route it. A token that is both disabled and revoked or expired still shows REVOKED or EXPIRED. ListUserTokens takes a new disabled status filter that returns disabled tokens that are neither revoked nor expired; filter by revoked or expired to find the others.
DeleteProjectbehaviour changesDeleting or archiving a project now also hides the API keys that were revoked before it, so a new project with the same name does not list them as its own. ListApiKeys reports these keys as API_KEY_STATUS_DELETED, not API_KEY_STATUS_REVOKED; each keeps its revocation stamp and stays on the data plane's revocation list.
UpsertProjectOIDCConfigsecurity updatesA disabled project OIDC contract no longer reserves its issuer and audience, so another organization can enable a contract for that pair. Enabling a contract is still refused while another organization's enabled contract names the same issuer and audience, and the refusal now tells you to ask a platform administrator to release the pair. The refusal's audit entry names the holding organization and project, and the delete audit entry records the issuer and audience it released.
GetProjectDeletionImpactnew featuresGetProjectDeletionImpact previews what deleting a live project removes: the project's id, and the number of users, model assignments, API keys, revoked API keys, settings, fallback policies, provider grants, MCP server grants, MCP profiles, OIDC contracts and role bindings granted directly at the project's scope. All counts except users and model assignments use the delete's own rules, and all twelve fields are empty after the delete.
EnsureDefaultProjectMembershipnew featuresEnsureDefaultProjectMembership adds a user to the Users of their organization's default project when they are not in it yet, and reports whether they joined. It never changes an existing role, skips a banned user or one SCIM blocks from signing in, and writes an AUTO_JOIN_DEFAULT_PROJECT audit record when the user joins. It needs the admin management key or the project.members.add permission.
UpsertSystemSettingnew featuresAn admin can now change two management plane address checks without restarting valet. The system settings oidc.discovery_allow_private_addresses and gateway_auth.jwks_allow_private_addresses override OIDC_DISCOVERY_ALLOW_PRIVATE_ADDRESSES and GATEWAY_AUTH_JWKS_ALLOW_PRIVATE_ADDRESSES. Each takes true, false or inherit, and UpsertSystemSetting refuses any other value for them.
SetDataplaneConfigOverridebug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
AttachProjectGatewayProjectbug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
AddDataplaneProjectbug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
CreateProjectGatewaybug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
SetProjectGatewayWorkspacebug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
DeleteProjectGatewaybug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
UpsertProjectOIDCConfigbug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
ListDataplanesbug fixesListing data planes now returns next_page_token when more remain, and passing it as page_token returns the next page. A token that is malformed or from a listing for another customer is refused with INVALID_ARGUMENT. Configuration changes now reach every data plane of a customer with more than 1,000 of them.
ListWorkspacesbug fixesListing data planes now returns next_page_token when more remain, and passing it as page_token returns the next page. A token that is malformed or from a listing for another customer is refused with INVALID_ARGUMENT. Configuration changes now reach every data plane of a customer with more than 1,000 of them.
QueryPlatformAuditLogsbug fixesA request with a NUL character in a name, description or filter field now returns 400 invalid_argument. It returned 500 internal before, which clients retry and which counted as a server failure. This applies when the management plane uses the extended query protocol, which is the default. A deployment that sets global.useSimpleProtocol (USE_QUERY_EXEC_MODE_SIMPLE_PROTOCOL=true, used with pgbouncer) still returns 500 for these requests.
ListProjectMcpServersbug fixesA request with a NUL character in a name, description or filter field now returns 400 invalid_argument. It returned 500 internal before, which clients retry and which counted as a server failure. This applies when the management plane uses the extended query protocol, which is the default. A deployment that sets global.useSimpleProtocol (USE_QUERY_EXEC_MODE_SIMPLE_PROTOCOL=true, used with pgbouncer) still returns 500 for these requests.
AddProjectProviderbug fixesA request with a NUL character in a name, description or filter field now returns 400 invalid_argument. It returned 500 internal before, which clients retry and which counted as a server failure. This applies when the management plane uses the extended query protocol, which is the default. A deployment that sets global.useSimpleProtocol (USE_QUERY_EXEC_MODE_SIMPLE_PROTOCOL=true, used with pgbouncer) still returns 500 for these requests.
UpdateProjectbug fixesA request with a NUL character in a name, description or filter field now returns 400 invalid_argument. It returned 500 internal before, which clients retry and which counted as a server failure. This applies when the management plane uses the extended query protocol, which is the default. A deployment that sets global.useSimpleProtocol (USE_QUERY_EXEC_MODE_SIMPLE_PROTOCOL=true, used with pgbouncer) still returns 500 for these requests.

AiKeysService

OperationKindChange
Registersecurity updatesOn a management plane that serves more than one organization, provider key changes no longer reach another organization's data planes. A change in an organization's default project now reaches only its own data planes that serve the default project.
Revokesecurity updatesOn a management plane that serves more than one organization, provider key changes no longer reach another organization's data planes. A change in an organization's default project now reaches only its own data planes that serve the default project.
UpdateTrafficSettingssecurity updatesOn a management plane that serves more than one organization, provider key changes no longer reach another organization's data planes. A change in an organization's default project now reaches only its own data planes that serve the default project.
Revokenew featuresRevoke with legacy revokes one of your own provider keys from before keys belonged to a project. It writes an audit entry, deletes the stored key and stops it routing in the projects you use.
Registernew featuresRegister takes an optional preference ("always", "primary" or "fallback") for a provider's first key in a project, and tetrate agentrouter api byok add takes it as --preference. A key added after it keeps the existing keys' preference, which Register returns in key.traffic_preference. Two keys added at once for the same provider in a project no longer split traffic: the second goes behind the first, with the same preference.

AlertDestinationService

OperationKindChange
CreateAlertDestinationbehaviour changesCreating, changing or deleting an alert destination from the Admin Console, the Developer Console or the API now writes one alert_destinations audit record naming the signed-in user, with success set to false when the change is refused after the sign-in and permission checks; no record holds a credential. Until the Admin Console stops writing its own record, a change made there writes two.
UpdateAlertDestinationbehaviour changesCreating, changing or deleting an alert destination from the Admin Console, the Developer Console or the API now writes one alert_destinations audit record naming the signed-in user, with success set to false when the change is refused after the sign-in and permission checks; no record holds a credential. Until the Admin Console stops writing its own record, a change made there writes two.
DeleteAlertDestinationbehaviour changesCreating, changing or deleting an alert destination from the Admin Console, the Developer Console or the API now writes one alert_destinations audit record naming the signed-in user, with success set to false when the change is refused after the sign-in and permission checks; no record holds a credential. Until the Admin Console stops writing its own record, a change made there writes two.

ApiKeysService

OperationKindChange
ListApiKeysbehaviour changesProject Owners can list, disable and delete the API keys of their project. Super Admins can list the keys of their organization. Listing uses the new permission api_key_directory.read, which Project Owner, Super Admin, Viewer, User Admin and the admin management key hold. A User Admin bound to a project lists the keys of that project. The read and write management keys do not get it, so they cannot list other users' keys.
UpdateApiKeybehaviour changesProject Owners can list, disable and delete the API keys of their project. Super Admins can list the keys of their organization. Listing uses the new permission api_key_directory.read, which Project Owner, Super Admin, Viewer, User Admin and the admin management key hold. A User Admin bound to a project lists the keys of that project. The read and write management keys do not get it, so they cannot list other users' keys.
DeleteApiKeybehaviour changesProject Owners can list, disable and delete the API keys of their project. Super Admins can list the keys of their organization. Listing uses the new permission api_key_directory.read, which Project Owner, Super Admin, Viewer, User Admin and the admin management key hold. A User Admin bound to a project lists the keys of that project. The read and write management keys do not get it, so they cannot list other users' keys.
UpdateApiKeybehaviour changesEnabling, disabling, renaming or deleting an API key, from either console or the API, now writes one UPDATE_API_KEY or DELETE_API_KEY audit record per call, in the same transaction, naming the signed-in user. The Developer Console saves a status and name edit as two calls. A refused change writes one record with success set to false. The Admin Console's ENABLE, DISABLE, UPDATE, DELETE and BULK_ records for API keys stop, except for a change it refuses before the management plane sees it.
DeleteApiKeybehaviour changesEnabling, disabling, renaming or deleting an API key, from either console or the API, now writes one UPDATE_API_KEY or DELETE_API_KEY audit record per call, in the same transaction, naming the signed-in user. The Developer Console saves a status and name edit as two calls. A refused change writes one record with success set to false. The Admin Console's ENABLE, DISABLE, UPDATE, DELETE and BULK_ records for API keys stop, except for a change it refuses before the management plane sees it.
ListApiKeysbehaviour changesAn API key with no stored key type, from before key types were stored, now reports API_KEY_TYPE_MANAGEMENT, the type it works as. It reported API_KEY_TYPE_PROMPT before.
ListApiKeysbehaviour changesDeleting or archiving a project now also hides the API keys that were revoked before it, so a new project with the same name does not list them as its own. ListApiKeys reports these keys as API_KEY_STATUS_DELETED, not API_KEY_STATUS_REVOKED; each keeps its revocation stamp and stays on the data plane's revocation list.
ListApiKeyssecurity updatesAn Admin Console user with only an organization role can no longer list the API keys of every organization. Listing every organization needs the platform admin scope or api_key_directory.read at platform level.
UpdateApiKeysecurity updatesAn Admin Console user who holds admin only through an organization role can change or delete only the API keys where that role grants API key edit or delete, and a management key only the keys of its own organization. Other keys return NOT_FOUND. Enabling a revoked key returns FAILED_PRECONDITION except for a platform admin that names no customer_id, so the Developer Console can no longer re-enable a key an admin revoked. Enabling a destroyed key always returns FAILED_PRECONDITION.
DeleteApiKeysecurity updatesAn Admin Console user who holds admin only through an organization role can change or delete only the API keys where that role grants API key edit or delete, and a management key only the keys of its own organization. Other keys return NOT_FOUND. Enabling a revoked key returns FAILED_PRECONDITION except for a platform admin that names no customer_id, so the Developer Console can no longer re-enable a key an admin revoked. Enabling a destroyed key always returns FAILED_PRECONDITION.
ListApiKeysnew featuresListApiKeys lists the keys of one organization or project, with status, owner, text and ID filters, a filter for the keys that can hold their own fallback policy (override_targetable_only), sorting, counts and the key owners. Keys show their client, disabled state and deletion time. A fallback policy that targets a key shows the project of that key. A management key bound to an organization gets PERMISSION_DENIED for another organization's keys.
UpdateApiKeynew featuresUpdateApiKey and DeleteApiKey take an optional customer_id and project_id, so an organization admin or project owner can change the keys of their scope. UpdateApiKey can refuse a revoked key and record who disabled a key.
DeleteApiKeynew featuresUpdateApiKey and DeleteApiKey take an optional customer_id and project_id, so an organization admin or project owner can change the keys of their scope. UpdateApiKey can refuse a revoked key and record who disabled a key.

BillingAdminService

OperationKindChange
SearchBillingUsersnew featuresAdministrators read their organization's balances and top-ups; operators adjust credits.
GetUserBalancenew featuresAdministrators read their organization's balances and top-ups; operators adjust credits.
ListUserTransactionsnew featuresAdministrators read their organization's balances and top-ups; operators adjust credits.
ListUserTopupsnew featuresAdministrators read their organization's balances and top-ups; operators adjust credits.
ListTopupActivitiesnew featuresAdministrators read their organization's balances and top-ups; operators adjust credits.
CreateCreditAdjustmentnew featuresAdministrators read their organization's balances and top-ups; operators adjust credits.

BillingService

OperationKindChange
GetMyBalancenew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
ListMyTransactionsnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
ListMyTopupsnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
GetMyReceiptUrlnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
GetMyAutoTopupSettingsnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
ListMyPaymentMethodsnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
StartTopupnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
CancelPendingTopupnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
UpdateMyAutoTopupSettingsnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
CreateMySetupIntentnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
SetMyDefaultPaymentMethodnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.
DeleteMyPaymentMethodnew featuresSelf-service balance, top-ups, auto top-up and cards through the API.

BonusClaimAdminService

OperationKindChange
ListBonusClaimsnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
GetBonusClaimStatsnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
GetBonusClaimnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
ListReviewQueuenew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
GetReviewQueueCountsnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
GetBonusClaimAbuseSummarynew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
ApproveBonusClaimnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
RejectBonusClaimnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
CancelBonusClaimnew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.
RevealBonusClaimPiinew featuresAdministrators can review, approve, reject and cancel bonus claims, and reveal contact details, through the API.

CatalogService

OperationKindChange
AssignModelToProjectnew featuresAssignModelToProject and UnassignModelFromProject now accept a caller who holds the project.model.edit permission for the project, also when the caller is not one of the project's users. The permission can come from an organization role, a role on the project, or a management key's own role. An organization admin no longer has to be added to a project to manage its models. A management key uses only its own roles, not the roles of the user who owns it.
UnassignModelFromProjectnew featuresAssignModelToProject and UnassignModelFromProject now accept a caller who holds the project.model.edit permission for the project, also when the caller is not one of the project's users. The permission can come from an organization role, a role on the project, or a management key's own role. An organization admin no longer has to be added to a project to manage its models. A management key uses only its own roles, not the roles of the user who owns it.
UpsertProviderbug fixesUpsertProvider refuses to create an enabled provider with no auth scheme, and refuses to enable a provider that has none. Such a provider made API key creation fail for every tenant until it was deleted. Send supported_auth_schemes, or keep the provider disabled.

ClientsService

OperationKindChange
DeleteClientnew featuresDevelopers can rename, enable, disable and delete their own keys, list their revoked and deleted keys, and delete a client that has no live key. Enabling a revoked or destroyed key returns FAILED_PRECONDITION.

CustomerRequestLogsService

OperationKindChange
ListCustomerRequestLogsbehaviour changesCustomerRequestLogsService.ListCustomerRequestLogs now matches only the full request ID, comparing the UUID part without regard to case.

GatewayAuthPolicyService

OperationKindChange
CreateGatewayAuthPolicysecurity updatesA jwt gateway auth policy must now name at least one audience, and a jit identity mapping rule must set claim_value_template or set match_every_claim_value to true. A policy stored with no audience can still be updated without one. A jit rule without jit_principal_cap now creates no principal once its project holds 100 external principals.
UpdateGatewayAuthPolicysecurity updatesA jwt gateway auth policy must now name at least one audience, and a jit identity mapping rule must set claim_value_template or set match_every_claim_value to true. A policy stored with no audience can still be updated without one. A jit rule without jit_principal_cap now creates no principal once its project holds 100 external principals.
CreateIdentityMappingRulesecurity updatesA jwt gateway auth policy must now name at least one audience, and a jit identity mapping rule must set claim_value_template or set match_every_claim_value to true. A policy stored with no audience can still be updated without one. A jit rule without jit_principal_cap now creates no principal once its project holds 100 external principals.
GetPrivateAddressSettingsnew featuresAn Organization's super_admin can now let the management plane accept an identity provider on a private network for that Organization alone, for gateway auth policy keys and for project OIDC contracts, without asking the deployment's operator. Each setting takes ALLOW, DENY or INHERIT, and the Organization's choice wins over the deployment's own setting. An admin API key cannot change either one.
SetPrivateAddressSettingsnew featuresAn Organization's super_admin can now let the management plane accept an identity provider on a private network for that Organization alone, for gateway auth policy keys and for project OIDC contracts, without asking the deployment's operator. Each setting takes ALLOW, DENY or INHERIT, and the Organization's choice wins over the deployment's own setting. An admin API key cannot change either one.

GuardrailProvidersService

OperationKindChange
SetGuardrailProviderSecretnew featuresGuardrail providers can be Amazon Bedrock Guardrails (kind bedrockguardrails): set region, optional endpoint and timeout, store a static AWS key pair with aws_credentials, and bind each rule to a guardrail ID and version. A rule bound to DRAFT returns a warning. Rule writes are refused while a data plane serving the rule's project, or for an organization-scope rule any data plane in the organization, runs a build older than 0.11.0 or has not reported a readable build.

GuardrailsService

OperationKindChange
CreateGuardrailRulenew featuresGuardrail providers can be Amazon Bedrock Guardrails (kind bedrockguardrails): set region, optional endpoint and timeout, store a static AWS key pair with aws_credentials, and bind each rule to a guardrail ID and version. A rule bound to DRAFT returns a warning. Rule writes are refused while a data plane serving the rule's project, or for an organization-scope rule any data plane in the organization, runs a build older than 0.11.0 or has not reported a readable build.
UpdateGuardrailRulenew featuresGuardrail providers can be Amazon Bedrock Guardrails (kind bedrockguardrails): set region, optional endpoint and timeout, store a static AWS key pair with aws_credentials, and bind each rule to a guardrail ID and version. A rule bound to DRAFT returns a warning. Rule writes are refused while a data plane serving the rule's project, or for an organization-scope rule any data plane in the organization, runs a build older than 0.11.0 or has not reported a readable build.

IdentityService

OperationKindChange
SetUserPasswordnew featuresSetUserPassword (POST /v1/users/{user_id}/password) lets a Super Admin set another user's password. It signs that user out everywhere and is recorded in the audit log as SET_USER_PASSWORD.

MCPCatalogService

OperationKindChange
SetCatalogServerToolsnew featuresMCP catalog servers now return their tools, last tool fetch time and error, install examples and metadata, and SetCatalogServerTools saves a server's tools. The list organization admins see leaves out metadata and the fetch error.
GetCatalogServernew featuresMCP catalog servers now return their tools, last tool fetch time and error, install examples and metadata, and SetCatalogServerTools saves a server's tools. The list organization admins see leaves out metadata and the fetch error.
ListCatalogServersnew featuresMCP catalog servers now return their tools, last tool fetch time and error, install examples and metadata, and SetCatalogServerTools saves a server's tools. The list organization admins see leaves out metadata and the fetch error.
ListCustomerCatalogServersnew featuresMCP catalog servers now return their tools, last tool fetch time and error, install examples and metadata, and SetCatalogServerTools saves a server's tools. The list organization admins see leaves out metadata and the fetch error.
CreateCatalogServernew featuresCreateCatalogServer adds an MCP catalog server and returns ALREADY_EXISTS for an id in use. UpdateCatalogServer edits one and returns NOT_FOUND for an id that does not exist, so an edit never brings back a deleted server. UpsertCatalogServer is unchanged.
UpdateCatalogServernew featuresCreateCatalogServer adds an MCP catalog server and returns ALREADY_EXISTS for an id in use. UpdateCatalogServer edits one and returns NOT_FOUND for an id that does not exist, so an edit never brings back a deleted server. UpsertCatalogServer is unchanged.

MCPProfilesService

OperationKindChange
AddMCPProfileServerbehaviour changesAttaching an MCP server to an oauth MCP profile returns invalid_argument unless the request lists 1 to 32 distinct tool names or regex: patterns, with regex:* for every tool. An empty list and blank, padded or repeated entries are refused. A request that repeats the MCP server's current tools on that profile is accepted, so the token of an MCP server attached before this rule can still be rotated. Profiles of type none and api_key keep the empty list meaning every tool.
SetMCPProfileServerToolsbehaviour changesSetting the tools of a server attached to an oauth MCP profile returns invalid_argument unless the request lists 1 to 32 distinct tool names or regex: patterns, with regex:* for every tool. An empty list and blank, padded or repeated entries are refused, and the stored list stays as it was. Profiles of type none and api_key keep the empty list meaning every tool.
UpdateMCPProfilebehaviour changesUpdating an MCP profile of type none or api_key to type oauth returns failed_precondition and names the MCP server when an attached MCP server has a tool list an oauth profile refuses, such as an empty list. The profile keeps its type. Tool names and regex: patterns, including regex:*, do not block the update. A profile that is already oauth is not checked by this rule.
CreateMCPProfilebehaviour changesCreating an MCP profile with a security type other than oauth, api_key or none returns invalid_argument, and so does an update that changes the type to such a value. Spellings such as OAuth and oauth2 were accepted before and served with no token check. An update that leaves the type unset, or sends the type the profile already has, is accepted, so a profile stored with another type can still be renamed.
UpdateMCPProfilebehaviour changesCreating an MCP profile with a security type other than oauth, api_key or none returns invalid_argument, and so does an update that changes the type to such a value. Spellings such as OAuth and oauth2 were accepted before and served with no token check. An update that leaves the type unset, or sends the type the profile already has, is accepted, so a profile stored with another type can still be renamed.
CreateMCPProfilebehaviour changesCreating an MCP profile of type oauth returns invalid_argument unless security_policy_value sets issuer and remote_jwks, an absolute http or https URL. An update returns the same error when it changes the type to oauth, the issuer or the key set URL and leaves either missing or invalid. An update that changes none of them is accepted, so a profile saved without them can still be renamed.
UpdateMCPProfilebehaviour changesCreating an MCP profile of type oauth returns invalid_argument unless security_policy_value sets issuer and remote_jwks, an absolute http or https URL. An update returns the same error when it changes the type to oauth, the issuer or the key set URL and leaves either missing or invalid. An update that changes none of them is accepted, so a profile saved without them can still be renamed.
UpdateMCPProfilebug fixesA request with a NUL character in a name, description or filter field now returns 400 invalid_argument. It returned 500 internal before, which clients retry and which counted as a server failure. This applies when the management plane uses the extended query protocol, which is the default. A deployment that sets global.useSimpleProtocol (USE_QUERY_EXEC_MODE_SIMPLE_PROTOCOL=true, used with pgbouncer) still returns 500 for these requests.

MeService

OperationKindChange
ListMyKeysbehaviour changesYour API keys with no stored key type, from before key types were stored, now report API_KEY_TYPE_MANAGEMENT, the type they work as. They reported API_KEY_TYPE_PROMPT before.
UpdateMyKeybehaviour changesYour API keys with no stored key type, from before key types were stored, now report API_KEY_TYPE_MANAGEMENT, the type they work as. They reported API_KEY_TYPE_PROMPT before.
GetMenew featuresGetMe session claims carry platform_permissions, the permissions of the user's platform-level role bindings, held directly or through a group. A call that names no customer_id to a platform-wide method, such as GetModel or GetUsageStats, passes the permission check when the method's permission is in this set. The claim is left out when the set cannot be read.
UpdateMyKeynew featuresDevelopers can rename, enable, disable and delete their own keys, list their revoked and deleted keys, and delete a client that has no live key. Enabling a revoked or destroyed key returns FAILED_PRECONDITION.
RevokeMyKeynew featuresDevelopers can rename, enable, disable and delete their own keys, list their revoked and deleted keys, and delete a client that has no live key. Enabling a revoked or destroyed key returns FAILED_PRECONDITION.
ListMyKeysnew featuresDevelopers can rename, enable, disable and delete their own keys, list their revoked and deleted keys, and delete a client that has no live key. Enabling a revoked or destroyed key returns FAILED_PRECONDITION.
ListMyKeysnew featuresListed API keys show the title of their client.
ListMyKeysnew featuresListed API keys carry standalone, true for a key with no client of its own.
ListAssignableKeyScopesnew featuresListAssignableKeyScopes takes an optional project_id and answers for a management key in that project, with the permission check IssueMyKey applies there. The Developer Console scope picker uses it for the project of the key. The Developer Console now renames, enables, disables and deletes a key as the signed-in user, through MeService.UpdateMyKey and MeService.RevokeMyKey.

PolicyService

OperationKindChange
ListFallbackChainPoliciesnew featuresListApiKeys lists the keys of one organization or project, with status, owner, text and ID filters, a filter for the keys that can hold their own fallback policy (override_targetable_only), sorting, counts and the key owners. Keys show their client, disabled state and deletion time. A fallback policy that targets a key shows the project of that key. A management key bound to an organization gets PERMISSION_DENIED for another organization's keys.
CreateBudgetPolicynew featuresAn organization admin can now create a project budget, which applies to every API key in the project. With the BLOCK action the budget stops traffic at its limit, and with the default MONITOR action it records spend and alerts without stopping traffic. A project admin cannot create one or move another budget onto project scope, and can still edit, enable, disable and delete their own project's budget.
UpdateBudgetPolicynew featuresAn organization admin can now create a project budget, which applies to every API key in the project. With the BLOCK action the budget stops traffic at its limit, and with the default MONITOR action it records spend and alerts without stopping traffic. A project admin cannot create one or move another budget onto project scope, and can still edit, enable, disable and delete their own project's budget.
CreateRateLimitPolicybug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
UpdateRateLimitPolicybug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.
SetRateLimitPolicyStatusbug fixesChanges that check a data plane's version, such as provider overrides, shared and catch-all hostnames, OIDC contracts and the newer rate-limit dimensions, no longer refuse a data plane on 0.11.0 or newer that was just upgraded or has had no configuration change for a day, because it now reports its version on every poll. A data plane silent for 24 hours is refused as down, disconnected or older than 0.11.0, with a prompt to check its connection and build.

ProjectsService

OperationKindChange
ArchiveProjectbehaviour changesDeleting or archiving a project now also hides the API keys that were revoked before it, so a new project with the same name does not list them as its own. ListApiKeys reports these keys as API_KEY_STATUS_DELETED, not API_KEY_STATUS_REVOKED; each keeps its revocation stamp and stays on the data plane's revocation list.
CreateProjectbug fixesA request with a NUL character in a name, description or filter field now returns 400 invalid_argument. It returned 500 internal before, which clients retry and which counted as a server failure. This applies when the management plane uses the extended query protocol, which is the default. A deployment that sets global.useSimpleProtocol (USE_QUERY_EXEC_MODE_SIMPLE_PROTOCOL=true, used with pgbouncer) still returns 500 for these requests.

RequestLogsService

OperationKindChange
QueryRequestLogsbehaviour changesRequestLogsService.QueryRequestLogs now matches only the full request ID, comparing the UUID part without regard to case.
QueryRequestLogsnew featuresRequest logs show the project, provider, and the attribute routing rule that picked the model or the rate limit that refused it, and flag unexplained model changes. QueryRequestLogs filters by policy (policy_filter, policy_type), except for requests in long-term storage (GetRequestLog still shows their policies). Credential headers (authorization, cookie, x-tars-api-key) are masked on every request log read.
GetRequestLognew featuresRequest logs show the project, provider, and the attribute routing rule that picked the model or the rate limit that refused it, and flag unexplained model changes. QueryRequestLogs filters by policy (policy_filter, policy_type), except for requests in long-term storage (GetRequestLog still shows their policies). Credential headers (authorization, cookie, x-tars-api-key) are masked on every request log read.
GetUsageStatsnew featuresGET /v1/usage/stats takes group_keys, which keeps only the named groups, and subgroup_by, which splits each group by model, user, api_key or usage_mode. Each split group carries its subgroup_keys and no series, and ordering, paging and total_groups count the split groups.

SecretService

OperationKindChange
CreateSecretbug fixesA secret keeps the tags it was created with. CreateSecret, GetSecret, ListSecrets and RotateSecret return them, and creating the secret again replaces them. Tags sent before this release were not stored, so those secrets have none until they are created again.
GetSecretbug fixesA secret keeps the tags it was created with. CreateSecret, GetSecret, ListSecrets and RotateSecret return them, and creating the secret again replaces them. Tags sent before this release were not stored, so those secrets have none until they are created again.
ListSecretsbug fixesA secret keeps the tags it was created with. CreateSecret, GetSecret, ListSecrets and RotateSecret return them, and creating the secret again replaces them. Tags sent before this release were not stored, so those secrets have none until they are created again.
RotateSecretbug fixesA secret keeps the tags it was created with. CreateSecret, GetSecret, ListSecrets and RotateSecret return them, and creating the secret again replaces them. Tags sent before this release were not stored, so those secrets have none until they are created again.

v0.10.1

No API operations changed in this release.

v0.10.0

AdminService

OperationKindChange
QueryAuditLogsbehaviour changesFleet audit reads require explicit platform permissions; organization admin and audit reader scopes no longer grant fleet access. An organization admin who called these methods before keeps working, but sees only their own organization's records, and only records written from 0.10 on, because earlier records have no organization owner.
GetAuditLogbehaviour changesFleet audit reads require explicit platform permissions; organization admin and audit reader scopes no longer grant fleet access. An organization admin who called these methods before keeps working, but sees only their own organization's records, and only records written from 0.10 on, because earlier records have no organization owner.
QueryPlatformAuditLogsbehaviour changesFleet audit reads require explicit platform permissions; organization admin and audit reader scopes no longer grant fleet access. An organization admin who called these methods before keeps working, but sees only their own organization's records, and only records written from 0.10 on, because earlier records have no organization owner.
AddProjectMemberbehaviour changesRemoving users from a project or demoting them protects assignments of the built-in Project Owner role held by users who have not been deleted. Admin memberships, custom roles and directly granted permissions do not count as Project Owner assignments.
UpdateProjectMemberbehaviour changesRemoving users from a project or demoting them protects assignments of the built-in Project Owner role held by users who have not been deleted. Admin memberships, custom roles and directly granted permissions do not count as Project Owner assignments.
RemoveProjectMemberbehaviour changesRemoving users from a project or demoting them protects assignments of the built-in Project Owner role held by users who have not been deleted. Admin memberships, custom roles and directly granted permissions do not count as Project Owner assignments.
UpsertProjectOIDCConfigbehaviour changesWriting a project's OIDC contract is refused on Agent Router Service (SaaS). Enabling a contract is refused while a data plane serving the project runs a build older than 0.10.0 or has not reported its build, and so is attaching a project whose contract is enabled to such a data plane. Each refusal names the data plane.
AttachProjectGatewayProjectbehaviour changesWriting a project's OIDC contract is refused on Agent Router Service (SaaS). Enabling a contract is refused while a data plane serving the project runs a build older than 0.10.0 or has not reported its build, and so is attaching a project whose contract is enabled to such a data plane. Each refusal names the data plane.
AddDataplaneProjectbehaviour changesWriting a project's OIDC contract is refused on Agent Router Service (SaaS). Enabling a contract is refused while a data plane serving the project runs a build older than 0.10.0 or has not reported its build, and so is attaching a project whose contract is enabled to such a data plane. Each refusal names the data plane.
QueryAuditLogssecurity updatesOrganization-scoped audit reads show records with trusted ownership stamps; fleet-wide reads require an explicit platform audit grant.
GetAuditLogsecurity updatesOrganization-scoped audit reads show records with trusted ownership stamps; fleet-wide reads require an explicit platform audit grant.
QueryPlatformAuditLogssecurity updatesOrganization-scoped audit reads show records with trusted ownership stamps; fleet-wide reads require an explicit platform audit grant.
QueryCustomerAuditLogssecurity updatesOrganization-scoped audit reads show records with trusted ownership stamps; fleet-wide reads require an explicit platform audit grant.
GetCustomerAuditLogsecurity updatesOrganization-scoped audit reads show records with trusted ownership stamps; fleet-wide reads require an explicit platform audit grant.
QueryAuditLogssecurity updatesProvisioned admin-scoped secrets also gain QueryAuditLogs and GetAuditLog, with the same fleet visibility already available through QueryPlatformAuditLogs.
GetAuditLogsecurity updatesProvisioned admin-scoped secrets also gain QueryAuditLogs and GetAuditLog, with the same fleet visibility already available through QueryPlatformAuditLogs.
RemoveProjectMcpServersecurity updatesRemoving a catalog MCP server from a project now also detaches it from the legacy MCP profiles of users in the project, and editing the tools of a server that the project no longer grants is refused with PERMISSION_DENIED. Before, a legacy profile kept serving a server after its grant was removed.
UpsertCatalogModelnew featuresUpsertModel takes clear_fields, to clear stored values such as a price, the context window or the backend URLs, and remove_metadata_keys, to remove metadata keys. A request that sets neither works as before.
QueryCustomerAuditLogsnew featuresOrganization audit log reads now include customer update and archive, project, project member, AI key, model assignment, MCP profile, MCP profile act-as, MCP OAuth client, API key, budget alert, data plane and project gateway changes, and on a single-organization deployment user role and SSO provider changes. Refused requests and fleet-wide actions stay out, and so do records written before the upgrade. That is because no earlier release writes an organization owner on an audit record.
GetCustomerAuditLognew featuresOrganization audit log reads now include customer update and archive, project, project member, AI key, model assignment, MCP profile, MCP profile act-as, MCP OAuth client, API key, budget alert, data plane and project gateway changes, and on a single-organization deployment user role and SSO provider changes. Refused requests and fleet-wide actions stay out, and so do records written before the upgrade. That is because no earlier release writes an organization owner on an audit record.
GetProjectOIDCConfignew featuresA project's OIDC contract now names the token claim that identifies one caller, identity_claim, which is sub unless you name another, and how many callers the project may hold, principal_cap, which is 100 unless you set one at least 1. On a 0.10.0 data plane each caller gets its own API key, so budgets and rate limits apply per caller. The cap is enforced when a data plane resolves a contract caller. Existing contracts get both defaults. Omitting either field on a write keeps the stored value.
UpsertProjectOIDCConfignew featuresA project's OIDC contract now names the token claim that identifies one caller, identity_claim, which is sub unless you name another, and how many callers the project may hold, principal_cap, which is 100 unless you set one at least 1. On a 0.10.0 data plane each caller gets its own API key, so budgets and rate limits apply per caller. The cap is enforced when a data plane resolves a contract caller. Existing contracts get both defaults. Omitting either field on a write keeps the stored value.
QueryAuditLogsdeprecationsCalling the fleet audit methods as an organization admin, without a platform audit grant, is deprecated and will be refused in a later release. In 0.10 these calls return only the caller's own organization's records, and only records written from 0.10 on, because records written before the upgrade have no organization owner. The management plane logs a deprecation warning on each such call. Use QueryCustomerAuditLogs and GetCustomerAuditLog for organization reads.
GetAuditLogdeprecationsCalling the fleet audit methods as an organization admin, without a platform audit grant, is deprecated and will be refused in a later release. In 0.10 these calls return only the caller's own organization's records, and only records written from 0.10 on, because records written before the upgrade have no organization owner. The management plane logs a deprecation warning on each such call. Use QueryCustomerAuditLogs and GetCustomerAuditLog for organization reads.
QueryPlatformAuditLogsdeprecationsCalling the fleet audit methods as an organization admin, without a platform audit grant, is deprecated and will be refused in a later release. In 0.10 these calls return only the caller's own organization's records, and only records written from 0.10 on, because records written before the upgrade have no organization owner. The management plane logs a deprecation warning on each such call. Use QueryCustomerAuditLogs and GetCustomerAuditLog for organization reads.

CatalogService

OperationKindChange
DeleteModelbehaviour changesDeleting a model now also removes its project assignments, in the same change. The audit record counts them in metadata.project_assignments_removed.
CreateModelbehaviour changesIn single-organization installs, a Model Admin can now create, edit and delete models through the API with their own session. A user who holds the Platform Model Admin role can do the same in any install. GetModel now also accepts a platform grant of models.read, as ListModels does.
UpsertModelbehaviour changesIn single-organization installs, a Model Admin can now create, edit and delete models through the API with their own session. A user who holds the Platform Model Admin role can do the same in any install. GetModel now also accepts a platform grant of models.read, as ListModels does.
DeleteModelbehaviour changesIn single-organization installs, a Model Admin can now create, edit and delete models through the API with their own session. A user who holds the Platform Model Admin role can do the same in any install. GetModel now also accepts a platform grant of models.read, as ListModels does.
ListModelsbehaviour changesIn single-organization installs, a Model Admin can now create, edit and delete models through the API with their own session. A user who holds the Platform Model Admin role can do the same in any install. GetModel now also accepts a platform grant of models.read, as ListModels does.
GetModelbehaviour changesIn single-organization installs, a Model Admin can now create, edit and delete models through the API with their own session. A user who holds the Platform Model Admin role can do the same in any install. GetModel now also accepts a platform grant of models.read, as ListModels does.
ListModelsnew featuresListModels and GetModel take an optional customer_id and project_id, so a user with an organization role that can read models, such as a Viewer, can read the model catalog. A read that names customer_id leaves out the aigw-headers metadata key. New REST paths: GET /v1/customers/{customer_id}/catalog/models and GET /v1/customers/{customer_id}/catalog/models/{id}.
GetModelnew featuresListModels and GetModel take an optional customer_id and project_id, so a user with an organization role that can read models, such as a Viewer, can read the model catalog. A read that names customer_id leaves out the aigw-headers metadata key. New REST paths: GET /v1/customers/{customer_id}/catalog/models and GET /v1/customers/{customer_id}/catalog/models/{id}.
CreateModelnew featuresCreateModel adds a model and returns ALREADY_EXISTS when the provider already has a model of that name. The provider rules run first: a create under a disabled provider that leaves is_enabled unset returns FAILED_PRECONDITION, also when the model exists. REST: POST /v1/catalog/models:create. CLI: tetrate agentrouter api catalog models create.
UpsertModelnew featuresUpsertModel takes clear_fields, to clear stored values such as a price, the context window or the backend URLs, and remove_metadata_keys, to remove metadata keys. A request that sets neither works as before.

GatewayAuthPolicyService

OperationKindChange
CreateGatewayAuthPolicybehaviour changesCreating a GatewayAuthPolicy, or changing its extraction_header, is now refused when the header is x-tars-project or x-tars-project-id, because the data plane reads either one as the request's project. A policy already stored with one of them keeps it, and a data plane on 0.10.0 refuses the token calls it verifies with extraction_header_conflict, including calls that send the token in Authorization.
UpdateGatewayAuthPolicybehaviour changesCreating a GatewayAuthPolicy, or changing its extraction_header, is now refused when the header is x-tars-project or x-tars-project-id, because the data plane reads either one as the request's project. A policy already stored with one of them keeps it, and a data plane on 0.10.0 refuses the token calls it verifies with extraction_header_conflict, including calls that send the token in Authorization.
CreateClaimProjectBindingnew featuresAn application can leave out x-tars-project when its GatewayAuthPolicy binds a claim value to a project, and the data plane acts in that project. Calls matching no binding, bindings for two projects, or a bound project that is unserved or rejects tokens are refused with 403. When the data plane auth config passes its size cap and a policy's bindings are left out, such calls answer 503 bindings_unavailable until the bindings shrink or the caller sends x-tars-project.
ListClaimProjectBindingsnew featuresAn application can leave out x-tars-project when its GatewayAuthPolicy binds a claim value to a project, and the data plane acts in that project. Calls matching no binding, bindings for two projects, or a bound project that is unserved or rejects tokens are refused with 403. When the data plane auth config passes its size cap and a policy's bindings are left out, such calls answer 503 bindings_unavailable until the bindings shrink or the caller sends x-tars-project.
DeleteClaimProjectBindingnew featuresAn application can leave out x-tars-project when its GatewayAuthPolicy binds a claim value to a project, and the data plane acts in that project. Calls matching no binding, bindings for two projects, or a bound project that is unserved or rejects tokens are refused with 403. When the data plane auth config passes its size cap and a policy's bindings are left out, such calls answer 503 bindings_unavailable until the bindings shrink or the caller sends x-tars-project.

IdentityService

OperationKindChange
BanUsersecurity updatesBanning or deleting a user now revokes their MCP OAuth refresh tokens and unredeemed authorization codes, and /oauth/token refuses every grant for a banned or deleted user with invalid_grant. A token exchange no longer creates an account for a deleted email address, and an authorization code can no longer be redeemed twice. Unbanning a deleted user fails with FAILED_PRECONDITION; restore it instead. An MCP access token already issued stays valid until it expires, 24 hours by default.
DeleteUsersecurity updatesBanning or deleting a user now revokes their MCP OAuth refresh tokens and unredeemed authorization codes, and /oauth/token refuses every grant for a banned or deleted user with invalid_grant. A token exchange no longer creates an account for a deleted email address, and an authorization code can no longer be redeemed twice. Unbanning a deleted user fails with FAILED_PRECONDITION; restore it instead. An MCP access token already issued stays valid until it expires, 24 hours by default.
UnbanUsersecurity updatesBanning or deleting a user now revokes their MCP OAuth refresh tokens and unredeemed authorization codes, and /oauth/token refuses every grant for a banned or deleted user with invalid_grant. A token exchange no longer creates an account for a deleted email address, and an authorization code can no longer be redeemed twice. Unbanning a deleted user fails with FAILED_PRECONDITION; restore it instead. An MCP access token already issued stays valid until it expires, 24 hours by default.

MCPProfilesService

OperationKindChange
CreateMCPProfilebehaviour changesMCP profile audit entries name the person who acted. When an API key makes the call, the key is in metadata.via_key; when an admin acts for another user, that user is in metadata.subject_user_id.
UpdateMCPProfilebehaviour changesMCP profile audit entries name the person who acted. When an API key makes the call, the key is in metadata.via_key; when an admin acts for another user, that user is in metadata.subject_user_id.
DeleteMCPProfilebehaviour changesMCP profile audit entries name the person who acted. When an API key makes the call, the key is in metadata.via_key; when an admin acts for another user, that user is in metadata.subject_user_id.
AddMCPProfileServerbehaviour changesMCP profile audit entries name the person who acted. When an API key makes the call, the key is in metadata.via_key; when an admin acts for another user, that user is in metadata.subject_user_id.
RemoveMCPProfileServerbehaviour changesMCP profile audit entries name the person who acted. When an API key makes the call, the key is in metadata.via_key; when an admin acts for another user, that user is in metadata.subject_user_id.
SetMCPProfileServerToolsbehaviour changesMCP profile audit entries name the person who acted. When an API key makes the call, the key is in metadata.via_key; when an admin acts for another user, that user is in metadata.subject_user_id.
SetMCPProfileServerToolssecurity updatesRemoving a catalog MCP server from a project now also detaches it from the legacy MCP profiles of users in the project, and editing the tools of a server that the project no longer grants is refused with PERMISSION_DENIED. Before, a legacy profile kept serving a server after its grant was removed.
ListMCPProfilesnew featuresMCP profile reads can span every project you belong to (all_projects, CLI --all-projects) and can include each attached server's name, icon and tools (include_tools).
GetMCPProfilenew featuresMCP profile reads can span every project you belong to (all_projects, CLI --all-projects) and can include each attached server's name, icon and tools (include_tools).
UpdateMCPProfilebug fixesUpdateMCPProfile clears a profile's description when the request sends a blank description, as the API reference says. Before, the blank was stored.
AddMCPProfileServerbug fixesA server attached to an MCP profile through the API reaches every data plane at once. A failed attach keeps the server's previous token.

MeService

OperationKindChange
ListAssignableKeyScopesnew featuresGET /v1/me/assignable-key-scopes lists the scopes an organization API key can carry and which of them you can grant, to anyone who can create the key, including the User Admin role.
GetMenew featuresGetMe session claims carry can_open_admin_console, which says whether the Developer Console should offer the Admin Console: true when the user holds any org-level permission, or a project admin row or project binding that can add, edit or remove users in the project. It is not an access check; false does not stop someone with a narrower project grant from entering, and the claim is left out when the answer is unknown.
ListMyProjectsbug fixesListing your projects no longer shows the admin role on every project for a custom organization role that can add, remove or edit users in the project. It was listed as admin everywhere, and the Developer Console let it try changes it was then refused. Organization admins, platform admins and organization-wide API keys with owner access still show admin on every project.
ListMyReachableProjectsbug fixesListing your reachable projects now includes every project you or one of your groups in the organization hold a project binding on with any project permission, whether it comes from a custom project role or a permission granted on the binding itself. Before, a project bound without a settings or members read permission was missing from the Admin Console project switcher even though you could act in it.

PolicyService

OperationKindChange
UpdateFallbackChainPolicybehaviour changesUpdating a fallback policy is refused with INVALID_ARGUMENT when a changed chain is sent alone for a policy with several entries, or when chain and entries are both changed so they disagree. Before, the first merged the entries into one and the second saved entries.
CreateFallbackChainPolicybehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
UpdateFallbackChainPolicybehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
UpsertFallbackPolicybehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
SetFallbackChainPolicyStatusbehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
CreateTrafficSplitPolicybehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
UpdateTrafficSplitPolicybehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
SetTrafficSplitPolicyStatusbehaviour changesSaving a project's fallback or traffic split policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the project, matching what the data plane serves. Before, traffic split checked neither and fallback did not check providers. A tag policy is also refused when it names a disabled model.
ListFallbackChainPoliciesbehaviour changesListing fallback or traffic-split policies for one API key now returns them only to the key's owner, the owners of its project, organization admins and admin keys. Other users and non-admin keys get a permission error.
ListTrafficSplitPoliciesbehaviour changesListing fallback or traffic-split policies for one API key now returns them only to the key's owner, the owners of its project, organization admins and admin keys. Other users and non-admin keys get a permission error.
GetEffectivePolicybehaviour changesActive admin-scoped admin secrets gain the admin_console machine role at management-plane startup, so the Admin Console can read the effective attribute-routing policy of a key or a tag preview, and a policy's coverage. The role is not assignable to users or groups.
GetPolicyCoveragebehaviour changesActive admin-scoped admin secrets gain the admin_console machine role at management-plane startup, so the Admin Console can read the effective attribute-routing policy of a key or a tag preview, and a policy's coverage. The role is not assignable to users or groups.
CreateBudgetPolicysecurity updatesProject admins can now create budgets only for their own project's API keys, and edit, enable, disable or delete only the budgets of their own project and its API keys. Team, user, tag and organization-wide budgets, and other projects' budgets, need an organization admin.
UpdateBudgetPolicysecurity updatesProject admins can now create budgets only for their own project's API keys, and edit, enable, disable or delete only the budgets of their own project and its API keys. Team, user, tag and organization-wide budgets, and other projects' budgets, need an organization admin.
SetBudgetPolicyStatussecurity updatesProject admins can now create budgets only for their own project's API keys, and edit, enable, disable or delete only the budgets of their own project and its API keys. Team, user, tag and organization-wide budgets, and other projects' budgets, need an organization admin.
DeleteBudgetPolicysecurity updatesProject admins can now create budgets only for their own project's API keys, and edit, enable, disable or delete only the budgets of their own project and its API keys. Team, user, tag and organization-wide budgets, and other projects' budgets, need an organization admin.
CreateUserGroupsecurity updatesCreating, renaming or deleting a team, and adding or removing its users, through the API now needs an organization admin. Project admins can no longer change teams, which apply across every project. Users whose role lets them manage teams can still do so in the Admin Console.
UpdateUserGroupsecurity updatesCreating, renaming or deleting a team, and adding or removing its users, through the API now needs an organization admin. Project admins can no longer change teams, which apply across every project. Users whose role lets them manage teams can still do so in the Admin Console.
DeleteUserGroupsecurity updatesCreating, renaming or deleting a team, and adding or removing its users, through the API now needs an organization admin. Project admins can no longer change teams, which apply across every project. Users whose role lets them manage teams can still do so in the Admin Console.
AddUserGroupMemberssecurity updatesCreating, renaming or deleting a team, and adding or removing its users, through the API now needs an organization admin. Project admins can no longer change teams, which apply across every project. Users whose role lets them manage teams can still do so in the Admin Console.
RemoveUserGroupMemberssecurity updatesCreating, renaming or deleting a team, and adding or removing its users, through the API now needs an organization admin. Project admins can no longer change teams, which apply across every project. Users whose role lets them manage teams can still do so in the Admin Console.
UpdateFallbackChainPolicybug fixesEditing chain in a fallback policy you read back now saves; before, the entries sent with it won and the edit was ignored.

ProjectsService

OperationKindChange
AddProjectMemberbehaviour changesRemoving users from a project or demoting them protects assignments of the built-in Project Owner role held by users who have not been deleted. Admin memberships, custom roles and directly granted permissions do not count as Project Owner assignments.
UpdateProjectMemberbehaviour changesRemoving users from a project or demoting them protects assignments of the built-in Project Owner role held by users who have not been deleted. Admin memberships, custom roles and directly granted permissions do not count as Project Owner assignments.
RemoveProjectMemberbehaviour changesRemoving users from a project or demoting them protects assignments of the built-in Project Owner role held by users who have not been deleted. Admin memberships, custom roles and directly granted permissions do not count as Project Owner assignments.

RequestLogsService

OperationKindChange
ListMcpOperationsbehaviour changesExisting metrics_reader keys can read their organization's individual MCP calls. Client addresses and error messages stay hidden unless the key also has the admin or request_logs_reader scope.
GetMcpOperationStatsnew featuresGET /v1/mcp-operations and GET /v1/mcp-operations/stats list and summarize an organization's MCP calls by session, profile, backend, tool, client or method. Calls recorded before the upgrade belong to no organization, so these reads leave them out until they age out after 30 days; only platform readers see them.
ListMcpOperationsnew featuresGET /v1/mcp-operations and GET /v1/mcp-operations/stats list and summarize an organization's MCP calls by session, profile, backend, tool, client or method. Calls recorded before the upgrade belong to no organization, so these reads leave them out until they age out after 30 days; only platform readers see them.
GetUsageStatsnew featuresGET /v1/usage/stats takes a caller_type filter: idp keeps the usage of identity-provider applications and api_key keeps every other caller's. Totals, the series, distinct counts and groups all count the kept usage only.

v0.9.2

No API operations changed in this release.

v0.9.1

No API operations changed in this release.

v0.9.0

AdminService

OperationKindChange
QueryAuditLogsbehaviour changesAudit records for changes made through the Developer Console now name the signed-in user and their email instead of the console's service key. The key ID moves to metadata.via_key. Admin Console calls that already send X-Acting-Session-Token change the same way: user_id changes from the key to the person, and metadata.via_key is added. Audit records of a user or management-key caller now also carry the caller's email.
QueryPlatformAuditLogsbehaviour changesAudit records for changes made through the Developer Console now name the signed-in user and their email instead of the console's service key. The key ID moves to metadata.via_key. Admin Console calls that already send X-Acting-Session-Token change the same way: user_id changes from the key to the person, and metadata.via_key is added. Audit records of a user or management-key caller now also carry the caller's email.
QueryAuditLogsbehaviour changesAn audit record is now written in the same transaction as the change it records. A change that fails or is refused leaves one record with success set to false. Changes made through the workspace API are now audited too.
QueryPlatformAuditLogsbehaviour changesAn audit record is now written in the same transaction as the change it records. A change that fails or is refused leaves one record with success set to false. Changes made through the workspace API are now audited too.
QueryAuditLogsbehaviour changesThe Developer Console no longer writes its own audit records for key rotation, management-key create and delete, and project telemetry changes; the server's ROTATE_CLIENT_KEY, ISSUE_MY_KEY, REVOKE_MY_KEY and CREATE_ or UPDATE_TELEMETRY_CONFIG records cover them. A legacy key rotation (no client) keeps the console record until a later release. A data plane upgrade outcome is now one FINISH_DATAPLANE_UPGRADE record with the final phase in metadata.phase; only Completed has success set to true.
QueryPlatformAuditLogsbehaviour changesThe Developer Console no longer writes its own audit records for key rotation, management-key create and delete, and project telemetry changes; the server's ROTATE_CLIENT_KEY, ISSUE_MY_KEY, REVOKE_MY_KEY and CREATE_ or UPDATE_TELEMETRY_CONFIG records cover them. A legacy key rotation (no client) keeps the console record until a later release. A data plane upgrade outcome is now one FINISH_DATAPLANE_UPGRADE record with the final phase in metadata.phase; only Completed has success set to true.
QueryAuditLogsbehaviour changesUntil a later release removes the Admin Console's own audit records, an Admin Console change that the server audits leaves two records, and both now name the signed-in user: the console's and the server's. For example, a data plane update writes UPDATE from the console, and UPDATE_DATAPLANE with metadata.via_key from the server.
QueryPlatformAuditLogsbehaviour changesUntil a later release removes the Admin Console's own audit records, an Admin Console change that the server audits leaves two records, and both now name the signed-in user: the console's and the server's. For example, a data plane update writes UPDATE from the console, and UPDATE_DATAPLANE with metadata.via_key from the server.
QueryAuditLogsbehaviour changesAudit records of Developer Console calls now carry the browser's user_agent, and the X-Forwarded-For chain that the console received in metadata.forwarded_for. source_ip stays the address of the console.
QueryPlatformAuditLogsbehaviour changesAudit records of Developer Console calls now carry the browser's user_agent, and the X-Forwarded-For chain that the console received in metadata.forwarded_for. source_ip stays the address of the console.
RemoveProjectProviderbehaviour changesRemoving a provider from a project's allow-list fails with FAILED_PRECONDITION while the project still has models from that provider.
AddProjectProviderbehaviour changesAdding or removing a provider on a project's allow-list through the API now needs the project provider permission, which Project Owner and Super Admin hold, as the Admin Console already did. Provider Admin and Model Admin no longer give it, and neither does a custom role with only the providers permissions.
RemoveProjectProviderbehaviour changesAdding or removing a provider on a project's allow-list through the API now needs the project provider permission, which Project Owner and Super Admin hold, as the Admin Console already did. Provider Admin and Model Admin no longer give it, and neither does a custom role with only the providers permissions.
AddProjectProvidernew featuresProject admins can add and remove the providers on their own project's allow-list.
RemoveProjectProvidernew featuresProject admins can add and remove the providers on their own project's allow-list.
GetSystemSettingnew featuresGetSystemSetting takes an optional include_config_event flag for guardrails.enabled. It returns the status of the latest push of that setting to your data planes in the last 24 hours.
QueryAuditLogsnew featuresAudit log queries accept search, a case-insensitive match over the actor's email, user ID and type, the action, the resource type and ID, the correlation ID, the endpoint, the source IP and the error message. They also accept order_by, which sorts by actor, action, resource, source or outcome. A search that sets no start_time covers the 30 days before the end time (or now), from the start of that UTC day.
QueryPlatformAuditLogsnew featuresAudit log queries accept search, a case-insensitive match over the actor's email, user ID and type, the action, the resource type and ID, the correlation ID, the endpoint, the source IP and the error message. They also accept order_by, which sorts by actor, action, resource, source or outcome. A search that sets no start_time covers the 30 days before the end time (or now), from the start of that UTC day.
ClearSystemSettingnew featuresData planes now carry stored_url, the URL stored for the data plane. When another organization uses the same data plane ID, stored_url is the first hostname your data plane declares, or empty. The new ClearSystemSetting unsets the proxy URL setting or the stored URL of one data plane.
GetDataplanenew featuresData planes now carry stored_url, the URL stored for the data plane. When another organization uses the same data plane ID, stored_url is the first hostname your data plane declares, or empty. The new ClearSystemSetting unsets the proxy URL setting or the stored URL of one data plane.
ListDataplanesnew featuresData planes now carry stored_url, the URL stored for the data plane. When another organization uses the same data plane ID, stored_url is the first hostname your data plane declares, or empty. The new ClearSystemSetting unsets the proxy URL setting or the stored URL of one data plane.
EnsureDefaultProjectnew featuresEnsureDefaultProject creates an organization's default project when it does not exist yet, with the enabled providers, MCP servers and models, and returns it. An existing default project is returned as it is, so an allow-list that you emptied stays empty.
GetProjectnew featuresProjects now carry preferred_endpoint_url, the address a project owner starred, as tenancy.v1 projects do.
ListProjectsnew featuresProjects now carry preferred_endpoint_url, the address a project owner starred, as tenancy.v1 projects do.
EnsureDefaultProjectnew featuresProjects now carry preferred_endpoint_url, the address a project owner starred, as tenancy.v1 projects do.
CreateWorkspacebug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
UpdateWorkspacebug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
SetWorkspaceProjectbug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
SetWorkspaceURLbug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
DeleteWorkspacebug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
AttachProjectGatewayProjectbug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
AttachProjectGatewayProjectbug fixesThe warning for a gateway with no URL no longer says the gateway serves nothing. It now says the gateway serves through the catch-all while it is the only gateway on its data plane, and stops serving once another gateway joins.
SetProjectGatewayWorkspacebug fixesThe warning for a gateway with no URL no longer says the gateway serves nothing. It now says the gateway serves through the catch-all while it is the only gateway on its data plane, and stops serving once another gateway joins.
QueryAuditLogsbug fixesThe Audit Logs page now loads quickly on a management plane with millions of audit records. It used to read the whole audit table on every load and could time out with "Couldn't load this page".
QueryPlatformAuditLogsbug fixesThe Audit Logs page now loads quickly on a management plane with millions of audit records. It used to read the whole audit table on every load and could time out with "Couldn't load this page".
ClearSystemSettingdeprecationsstored_url on data planes and ClearSystemSetting are deprecated. They go with the stored data plane URL in a later release.
GetDataplanedeprecationsstored_url on data planes and ClearSystemSetting are deprecated. They go with the stored data plane URL in a later release.
ListDataplanesdeprecationsstored_url on data planes and ClearSystemSetting are deprecated. They go with the stored data plane URL in a later release.

AiKeysService

OperationKindChange
Revokesecurity updatesRevoking a BYOK key now attempts to remove its stored provider secret; a cleanup failure does not prevent the key from being revoked.
Listnew featuresListing AI keys can include your legacy per-user keys, which route in every project you use, with include_legacy. Each key now reports its traffic preference and whether it is a legacy key. Without include_legacy the list is unchanged.

ApiKeysService

OperationKindChange
UpdateApiKeybehaviour changesUpdateApiKey called without user_id for a key that does not exist now returns NotFound or a field error, where it returned InvalidArgument with the message user_id is required.
ListApiKeysnew featuresGET /v1/api-keys takes project_id and application_keys_only filters, and each key now says whether it serves an application, so you can find an application's key and disable it to stop that application.
UpdateApiKeynew featuresAn administrator can disable or re-enable one application's API key by sending the key id alone to UpdateApiKey. An admin key bound to an organization reaches only that organization's application keys. A request that sets name on this path is refused with InvalidArgument.

ClientsService

OperationKindChange
ListClientsbehaviour changesAn API key's client that was created without a project now belongs to its key's project once a fallback or traffic split policy of the key is saved, so it is then listed only in that project, not in every project.
GetClientbehaviour changesAn API key's client that was created without a project now belongs to its key's project once a fallback or traffic split policy of the key is saved, so it is then listed only in that project, not in every project.
GetApiKeySettingsnew featuresYou can read and change your own API key's global fallback and token rate limit through the API. The settings apply to every key of the key's client, and each change is recorded in the audit log.
UpdateApiKeySettingsnew featuresYou can read and change your own API key's global fallback and token rate limit through the API. The settings apply to every key of the key's client, and each change is recorded in the audit log.

ContentService

OperationKindChange
ListContentVersionsnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
GetContentVersionnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
CreateContentVersionnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
UpdateContentVersionnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
PublishContentVersionnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
UnpublishContentVersionnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
DeleteContentVersionnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.
GetPublishedContentnew featuresAnnouncements and sign-in page content can be managed through the API, and the published content can be read without signing in. Reading the versions and changing them need the admin scope or a new Platform Content Creator, Editor or Deleter role. A newly published version can take up to 30 seconds to show. A sign-in page file (CSS, JS or an image) can take up to five and a half minutes, because browsers and shared caches keep it for five minutes.

CustomerRequestLogsService

OperationKindChange
GetMyUsageStatsnew featuresGET /v1/me/usage/stats reads your own usage over time, per API key, filtered by key or project.
GetCustomerRequestLogStatsnew featuresRequest log statistics can be grouped by caller_type, which separates identity-provider callers from API key callers, and by application, which shows the usage of each application under its key's current name. GetCustomerRequestLogStats lists only the caller's own requests, so application usage appears in GetRequestLogStats.
ListCustomerRequestLogsnew featuresEach request log carries caller_type, idp for an identity-provider application and api_key for any other caller, and QueryRequestLogs and GetRequestLogStats take a caller_type filter with the same values.
GetCustomerRequestLognew featuresEach request log carries caller_type, idp for an identity-provider application and api_key for any other caller, and QueryRequestLogs and GetRequestLogStats take a caller_type filter with the same values.

EmailDomainPolicyAdminService

OperationKindChange
ListEmailDomainPoliciesnew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.
GetEmailDomainPolicynew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.
ExportEmailDomainPoliciesnew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.
CreateEmailDomainPolicynew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.
UpdateEmailDomainPolicynew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.
DeactivateEmailDomainPolicynew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.
ImportEmailDomainPoliciesnew featuresAdministrators can list, export, create, edit, deactivate and import email domain policies through the API. One import takes at most 100000 rows. The API answers only where bonus claims are on: ENABLE_BONUS_CLAIM is "true" on the management plane API and corporate login is off. Otherwise every call returns FAILED_PRECONDITION.

IdentityService

OperationKindChange
GetUsernew featuresUser directory responses include the team name alongside its ID, without a separate team lookup.
ListUsersnew featuresUser directory responses include the team name alongside its ID, without a separate team lookup.
SearchUsersnew featuresUser directory responses include the team name alongside its ID, without a separate team lookup.
GetSSOProvidernew featuresSSO providers now carry scopes, attribute mapping, the discovery URL and the organization name and slug. Writes can rename the organization, reset the OIDC endpoints, clear the admin emails and lift role-sync bans, and RegisterSSOProvider creates a provider without overwriting one. With customer_id set, an organization administrator of a single-customer deployment can manage SSO. CreateOrUpdateSSOProvider with customer_id only updates a provider; create one with RegisterSSOProvider.
ListSSOProvidersnew featuresSSO providers now carry scopes, attribute mapping, the discovery URL and the organization name and slug. Writes can rename the organization, reset the OIDC endpoints, clear the admin emails and lift role-sync bans, and RegisterSSOProvider creates a provider without overwriting one. With customer_id set, an organization administrator of a single-customer deployment can manage SSO. CreateOrUpdateSSOProvider with customer_id only updates a provider; create one with RegisterSSOProvider.
CreateOrUpdateSSOProvidernew featuresSSO providers now carry scopes, attribute mapping, the discovery URL and the organization name and slug. Writes can rename the organization, reset the OIDC endpoints, clear the admin emails and lift role-sync bans, and RegisterSSOProvider creates a provider without overwriting one. With customer_id set, an organization administrator of a single-customer deployment can manage SSO. CreateOrUpdateSSOProvider with customer_id only updates a provider; create one with RegisterSSOProvider.
RegisterSSOProvidernew featuresSSO providers now carry scopes, attribute mapping, the discovery URL and the organization name and slug. Writes can rename the organization, reset the OIDC endpoints, clear the admin emails and lift role-sync bans, and RegisterSSOProvider creates a provider without overwriting one. With customer_id set, an organization administrator of a single-customer deployment can manage SSO. CreateOrUpdateSSOProvider with customer_id only updates a provider; create one with RegisterSSOProvider.
CreateOrUpdateSSOProvidernew featuresCreateOrUpdateSSOProvider takes validate_config. It refuses, and does not save, a role mapping with an unknown role, a SAML role sync that cannot work, or IdP client credentials that the IdP refuses. Only a save that creates the provider or changes the IdP connection contacts the IdP, over https. A token endpoint that the API cannot reach, or that answers with a server error, a rate limit or no OAuth error, refuses the save.
SetUserRolenew featuresAdmins can set a user's role with POST /v1/users/{user_id}/role. The user's access changes at once. Any change that is not a promotion to a higher level signs the user out, also a move between roles at the same level. The change is not saved when its audit record cannot be written.

InferenceIngressService

OperationKindChange
ListDataplaneURLsnew featuresListDataplaneURLs accepts project_id, customer_id and include_unaddressed. Each entry now lists every address it answers on and its source, whether the data plane has called home, the ID of the data plane or Project Gateway it is for, and the gateway's attachment state. A request for one project also returns the endpoint that its owner starred.

MCPCatalogService

OperationKindChange
UpsertCatalogServernew featuresThe MCP catalog operations accept a platform MCP role, so a platform admin can manage the catalog without full admin rights. A customer's admins can list the enabled catalog servers. Deleting or disabling a server can now be refused while profiles or projects still use it.
GetCatalogServernew featuresThe MCP catalog operations accept a platform MCP role, so a platform admin can manage the catalog without full admin rights. A customer's admins can list the enabled catalog servers. Deleting or disabling a server can now be refused while profiles or projects still use it.
SetCatalogServerEnablednew featuresThe MCP catalog operations accept a platform MCP role, so a platform admin can manage the catalog without full admin rights. A customer's admins can list the enabled catalog servers. Deleting or disabling a server can now be refused while profiles or projects still use it.
DeleteCatalogServernew featuresThe MCP catalog operations accept a platform MCP role, so a platform admin can manage the catalog without full admin rights. A customer's admins can list the enabled catalog servers. Deleting or disabling a server can now be refused while profiles or projects still use it.
ListCustomerCatalogServersnew featuresThe MCP catalog operations accept a platform MCP role, so a platform admin can manage the catalog without full admin rights. A customer's admins can list the enabled catalog servers. Deleting or disabling a server can now be refused while profiles or projects still use it.
GetCatalogServerOAuthClientnew featuresA new operation returns the OAuth client that signs a project in to an MCP catalog server: the project's own client, or else the shared one from the Admin Console. It never returns the client secret.

McpOAuthClientsService

OperationKindChange
GetMcpOAuthClientsecurity updatesThe project MCP OAuth client operations no longer read or change the OAuth clients set up in the Admin Console, which every project signs in through. Those clients are managed through the new shared-client operations only. Changing the token or authorization URL of an OAuth client that has a client secret now requires the secret in the same request; public clients are not affected.
ListMcpOAuthClientssecurity updatesThe project MCP OAuth client operations no longer read or change the OAuth clients set up in the Admin Console, which every project signs in through. Those clients are managed through the new shared-client operations only. Changing the token or authorization URL of an OAuth client that has a client secret now requires the secret in the same request; public clients are not affected.
CreateMcpOAuthClientsecurity updatesThe project MCP OAuth client operations no longer read or change the OAuth clients set up in the Admin Console, which every project signs in through. Those clients are managed through the new shared-client operations only. Changing the token or authorization URL of an OAuth client that has a client secret now requires the secret in the same request; public clients are not affected.
UpdateMcpOAuthClientsecurity updatesThe project MCP OAuth client operations no longer read or change the OAuth clients set up in the Admin Console, which every project signs in through. Those clients are managed through the new shared-client operations only. Changing the token or authorization URL of an OAuth client that has a client secret now requires the secret in the same request; public clients are not affected.
DeleteMcpOAuthClientsecurity updatesThe project MCP OAuth client operations no longer read or change the OAuth clients set up in the Admin Console, which every project signs in through. Those clients are managed through the new shared-client operations only. Changing the token or authorization URL of an OAuth client that has a client secret now requires the secret in the same request; public clients are not affected.
UpdateDeploymentMcpOAuthClientsecurity updatesThe project MCP OAuth client operations no longer read or change the OAuth clients set up in the Admin Console, which every project signs in through. Those clients are managed through the new shared-client operations only. Changing the token or authorization URL of an OAuth client that has a client secret now requires the secret in the same request; public clients are not affected.
ListDeploymentMcpOAuthClientsnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
GetDeploymentMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
CreateDeploymentMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
UpdateDeploymentMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
DeleteDeploymentMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
ExchangeDeploymentMcpOAuthCodenew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
CreateMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
GetMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
ListMcpOAuthClientsnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.
UpdateMcpOAuthClientnew featuresPlatform admins can manage the Admin Console's shared MCP OAuth clients through the API, and complete a sign-in through one, which returns only an access token. Its token endpoint must use https on a public address unless MCP_OAUTH_TOKEN_ALLOW_PRIVATE_ADDRESSES is set. A project client can no longer share a provider with a shared client. OAuth clients return their full metadata in metadata_json.

MeService

OperationKindChange
ListMyProjectsnew featuresGET /v1/me/projects now returns member_role on each project: your own role as a member of that project. It is empty when you see the project without being a member. The role field does not change.

PatternsService

OperationKindChange
CreatePatternbug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
UpdatePatternbug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.
DeletePatternbug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.

PolicyService

OperationKindChange
CreateFallbackChainPolicybehaviour changesSaving fallback chain entries requires enabled models and providers. Project and API-key policies restrict models only when their effective project has assignments; projects without assignments allow all enabled models. API-key policies require a live project on their client group. Organization-wide policies need no assignments. BOUND model allow-lists are not validated.
UpdateFallbackChainPolicybehaviour changesSaving fallback chain entries requires enabled models and providers. Project and API-key policies restrict models only when their effective project has assignments; projects without assignments allow all enabled models. API-key policies require a live project on their client group. Organization-wide policies need no assignments. BOUND model allow-lists are not validated.
UpsertFallbackPolicybehaviour changesSaving fallback chain entries requires enabled models and providers. Project and API-key policies restrict models only when their effective project has assignments; projects without assignments allow all enabled models. API-key policies require a live project on their client group. Organization-wide policies need no assignments. BOUND model allow-lists are not validated.
GetFallbackChainPolicybehaviour changesA fallback policy saved before retry conditions were configurable reads back the five conditions the gateway applies to it, timeout,rate-limit,server-error,connect-failure,overloaded, instead of its stored retry_on. Saving that value back keeps the same retries, and changing retry_on now takes effect for such a policy.
ListFallbackChainPoliciesbehaviour changesA fallback policy saved before retry conditions were configurable reads back the five conditions the gateway applies to it, timeout,rate-limit,server-error,connect-failure,overloaded, instead of its stored retry_on. Saving that value back keeps the same retries, and changing retry_on now takes effect for such a policy.
UpdateFallbackChainPolicybehaviour changesA fallback policy saved before retry conditions were configurable reads back the five conditions the gateway applies to it, timeout,rate-limit,server-error,connect-failure,overloaded, instead of its stored retry_on. Saving that value back keeps the same retries, and changing retry_on now takes effect for such a policy.
GetTrafficSplitPolicybehaviour changesTraffic split policies now read back with entries as well as split. An update that sends both keeps whichever differs from the saved policy, so editing only split in a read-back still works; changing both so they disagree is refused.
ListTrafficSplitPoliciesbehaviour changesTraffic split policies now read back with entries as well as split. An update that sends both keeps whichever differs from the saved policy, so editing only split in a read-back still works; changing both so they disagree is refused.
UpdateTrafficSplitPolicybehaviour changesTraffic split policies now read back with entries as well as split. An update that sends both keeps whichever differs from the saved policy, so editing only split in a read-back still works; changing both so they disagree is refused.
ListFallbackChainPoliciesbehaviour changesListing fallback or traffic split policies without a target now also returns the per-key policies saved in the Developer Console, so the Admin Console's Fallback Policies page shows them too. That page does not load when there are more than 5,000 fallback policies.
ListTrafficSplitPoliciesbehaviour changesListing fallback or traffic split policies without a target now also returns the per-key policies saved in the Developer Console, so the Admin Console's Fallback Policies page shows them too. That page does not load when there are more than 5,000 fallback policies.
UpsertFallbackPolicybehaviour changesSaving a per-key fallback policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the key's project. Keys in the default project are not limited this way.
UpdateFallbackChainPolicybehaviour changesSaving a per-key fallback policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the key's project. Keys in the default project are not limited this way.
SetFallbackChainPolicyStatusbehaviour changesSaving a per-key fallback policy, or turning one back on, is refused when one of its models, or that model's provider, is not available to the key's project. Keys in the default project are not limited this way.
UpdateTagSchemaEntrynew featuresAdministrators can edit or clear a tag's description from the Tags tab. Its key and value stay fixed, so API keys and policies using the tag are unaffected.
ListApiKeyIdsByTagnew featuresGET /v1/policy/api-key-ids lists the IDs of API keys that carry a tag, or of keys with no tags (untagged=true). POST /v1/policy/api-key-tags/lookup returns the tags on up to 200 keys in one call.
BatchListApiKeyTagsnew featuresGET /v1/policy/api-key-ids lists the IDs of API keys that carry a tag, or of keys with no tags (untagged=true). POST /v1/policy/api-key-tags/lookup returns the tags on up to 200 keys in one call.
UpsertFallbackPolicynew featuresThe owner of an API key can set and turn off the fallback and traffic split policies of that key, without a project role.
SetFallbackChainPolicyStatusnew featuresThe owner of an API key can set and turn off the fallback and traffic split policies of that key, without a project role.
CreateTrafficSplitPolicynew featuresThe owner of an API key can set and turn off the fallback and traffic split policies of that key, without a project role.
UpdateTrafficSplitPolicynew featuresThe owner of an API key can set and turn off the fallback and traffic split policies of that key, without a project role.
SetTrafficSplitPolicyStatusnew featuresThe owner of an API key can set and turn off the fallback and traffic split policies of that key, without a project role.
CreateTrafficSplitPolicynew featuresTraffic split policies can target one API key, and hold one weighted split for each primary model in the new entries field. Each entry needs a different primary model name. Create, update and status calls also work on a path without a project. A per-key split is refused when a model or its provider is not available to the key's project, except in the default project. A model can have weight 0 if another has more.
UpdateTrafficSplitPolicynew featuresTraffic split policies can target one API key, and hold one weighted split for each primary model in the new entries field. Each entry needs a different primary model name. Create, update and status calls also work on a path without a project. A per-key split is refused when a model or its provider is not available to the key's project, except in the default project. A model can have weight 0 if another has more.
GetTrafficSplitPolicynew featuresTraffic split policies can target one API key, and hold one weighted split for each primary model in the new entries field. Each entry needs a different primary model name. Create, update and status calls also work on a path without a project. A per-key split is refused when a model or its provider is not available to the key's project, except in the default project. A model can have weight 0 if another has more.
ListTrafficSplitPoliciesnew featuresTraffic split policies can target one API key, and hold one weighted split for each primary model in the new entries field. Each entry needs a different primary model name. Create, update and status calls also work on a path without a project. A per-key split is refused when a model or its provider is not available to the key's project, except in the default project. A model can have weight 0 if another has more.
SetTrafficSplitPolicyStatusnew featuresTraffic split policies can target one API key, and hold one weighted split for each primary model in the new entries field. Each entry needs a different primary model name. Create, update and status calls also work on a path without a project. A per-key split is refused when a model or its provider is not available to the key's project, except in the default project. A model can have weight 0 if another has more.
ListFallbackChainPoliciesbug fixesListing policies by target_key_id finds the per-key fallback and traffic split policies saved in the Developer Console, and those of a disabled key. The first per-key fallback policy saved through the API no longer fails for a key that never had one.
ListTrafficSplitPoliciesbug fixesListing policies by target_key_id finds the per-key fallback and traffic split policies saved in the Developer Console, and those of a disabled key. The first per-key fallback policy saved through the API no longer fails for a key that never had one.
UpsertFallbackPolicybug fixesListing policies by target_key_id finds the per-key fallback and traffic split policies saved in the Developer Console, and those of a disabled key. The first per-key fallback policy saved through the API no longer fails for a key that never had one.
UpsertFallbackPolicybug fixesThese changes are now audited: data plane changes made through the workspace API, guardrail pattern and fallback-policy changes, refused gateway attaches, data plane upgrade outcomes, and the data plane URL, token revocations and MCP catalog entries a data plane writes.

ProjectsService

OperationKindChange
GetProjectnew featuresProject owners can choose the endpoint the consoles show for a project with SetPreferredEndpoint. Projects now carry public_endpoint_url and preferred_endpoint_url.
SetPreferredEndpointnew featuresProject owners can choose the endpoint the consoles show for a project with SetPreferredEndpoint. Projects now carry public_endpoint_url and preferred_endpoint_url.

RbacService

OperationKindChange
GrantSuperAdminbehaviour changesGranting or revoking super_admin now fails with Internal, and changes nothing, when its audit record cannot be written.
RevokeSuperAdminbehaviour changesGranting or revoking super_admin now fails with Internal, and changes nothing, when its audit record cannot be written.

RequestLogsService

OperationKindChange
GetUsageStatsbehaviour changesExisting metrics_reader keys can read their organization's usage per user, team or API key.
GetUsageStatsnew featuresGET /v1/usage/stats reads an organization's usage over time, with distinct users, per user, team or API key. Groups sort by any token figure or by last use, and skip jumps straight to a page.
GetRequestLogStatsnew featuresRequest log statistics can be grouped by caller_type, which separates identity-provider callers from API key callers, and by application, which shows the usage of each application under its key's current name. GetCustomerRequestLogStats lists only the caller's own requests, so application usage appears in GetRequestLogStats.
QueryRequestLogsnew featuresEach request log carries caller_type, idp for an identity-provider application and api_key for any other caller, and QueryRequestLogs and GetRequestLogStats take a caller_type filter with the same values.
GetRequestLognew featuresEach request log carries caller_type, idp for an identity-provider application and api_key for any other caller, and QueryRequestLogs and GetRequestLogStats take a caller_type filter with the same values.
GetRequestLogStatsnew featuresEach request log carries caller_type, idp for an identity-provider application and api_key for any other caller, and QueryRequestLogs and GetRequestLogStats take a caller_type filter with the same values.

v0.8.1

No API operations changed in this release.

v0.8.0

AdminService

OperationKindChange
ListProjectMcpServersbehaviour changesListing, adding and removing a project's MCP servers now needs the project MCP permission. The MCP Admin role doesn't include it, so its holders need Project Owner or Super Admin for all three.
AddProjectMcpServerbehaviour changesListing, adding and removing a project's MCP servers now needs the project MCP permission. The MCP Admin role doesn't include it, so its holders need Project Owner or Super Admin for all three.
RemoveProjectMcpServerbehaviour changesListing, adding and removing a project's MCP servers now needs the project MCP permission. The MCP Admin role doesn't include it, so its holders need Project Owner or Super Admin for all three.
CreateServiceAccountsecurity updatesSetWorkspaceURL and SetDataplaneURL refuse to set or clear a data plane URL with FailedPrecondition when another organization uses the same data plane ID. The URL was stored under the ID alone, so the write also changed the other organization's data plane. CreateServiceAccount with a serve URL for such an ID is refused too when no URL is stored for that ID yet. The Admin Console's System Settings save does not check this yet; it moves onto SetDataplaneURL in a later release.
SetDataplaneURLsecurity updatesSetWorkspaceURL and SetDataplaneURL refuse to set or clear a data plane URL with FailedPrecondition when another organization uses the same data plane ID. The URL was stored under the ID alone, so the write also changed the other organization's data plane. CreateServiceAccount with a serve URL for such an ID is refused too when no URL is stored for that ID yet. The Admin Console's System Settings save does not check this yet; it moves onto SetDataplaneURL in a later release.
SetWorkspaceURLsecurity updatesSetWorkspaceURL and SetDataplaneURL refuse to set or clear a data plane URL with FailedPrecondition when another organization uses the same data plane ID. The URL was stored under the ID alone, so the write also changed the other organization's data plane. CreateServiceAccount with a serve URL for such an ID is refused too when no URL is stored for that ID yet. The Admin Console's System Settings save does not check this yet; it moves onto SetDataplaneURL in a later release.
ListProjectMcpServerCandidatesnew featuresProject owners can list the enabled MCP servers their project doesn't have yet, searched by name and paged, to pick which ones to add.
AddProjectMcpServernew featuresProject owners can add and remove their project's MCP servers, and Viewers can list them. The list shows each server's name, description, icon, enabled state and last update, including servers disabled since, and can be paged, searched by name, filtered by enabled state and sorted.
ListProjectMcpServersnew featuresProject owners can add and remove their project's MCP servers, and Viewers can list them. The list shows each server's name, description, icon, enabled state and last update, including servers disabled since, and can be paged, searched by name, filtered by enabled state and sorted.
RemoveProjectMcpServernew featuresProject owners can add and remove their project's MCP servers, and Viewers can list them. The list shows each server's name, description, icon, enabled state and last update, including servers disabled since, and can be paged, searched by name, filtered by enabled state and sorted.
GetModelLifecyclesnew featuresAdmins can read whether a model in the catalog is retired, deprecated, new or in preview, with the reason and any retirement date. A model the catalog does not contain is left out of the result.
GetModelUsagenew featuresAdmins can see which models their organization uses retire soon, and which projects and API keys still call them. A model whose retirement date has passed is included, flagged as retired, while the organization still calls it. Results cover only your organization.
ListRetiringModelsnew featuresAdmins can see which models their organization uses retire soon, and which projects and API keys still call them. A model whose retirement date has passed is included, flagged as retired, while the organization still calls it. Results cover only your organization.
PlanCatalogSyncnew featuresThe model catalog can be synced through the admin API: preview what a sync would change, apply it in the background pinned to the exact documents previewed, and poll the run's progress. One sync runs at a time.
ApplyCatalogSyncnew featuresThe model catalog can be synced through the admin API: preview what a sync would change, apply it in the background pinned to the exact documents previewed, and poll the run's progress. One sync runs at a time.
GetCatalogSyncRunnew featuresThe model catalog can be synced through the admin API: preview what a sync would change, apply it in the background pinned to the exact documents previewed, and poll the run's progress. One sync runs at a time.
GetProjectSettingsbug fixesGetting, setting or deleting a project setting now returns NOT_FOUND when the project is missing or deleted. Deleting a project now deletes its settings, so a new project with the same name starts with none. The default project is still created on demand.
UpsertProjectSettingbug fixesGetting, setting or deleting a project setting now returns NOT_FOUND when the project is missing or deleted. Deleting a project now deletes its settings, so a new project with the same name starts with none. The default project is still created on demand.
DeleteProjectbug fixesGetting, setting or deleting a project setting now returns NOT_FOUND when the project is missing or deleted. Deleting a project now deletes its settings, so a new project with the same name starts with none. The default project is still created on demand.
DeleteProjectSettingbug fixesGetting, setting or deleting a project setting now returns NOT_FOUND when the project is missing or deleted. Deleting a project now deletes its settings, so a new project with the same name starts with none. The default project is still created on demand.
AddProjectModelbug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.
RemoveProjectModelbug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.
CreateUserTokenbug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.
UpsertProjectSettingbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.
DeleteProjectSettingbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.
AddProjectMemberbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.
RemoveProjectMemberbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.
UpsertSystemSettingbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.

ApiKeysService

OperationKindChange
CreateApiKeybug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.

CatalogService

OperationKindChange
AssignModelToProjectbug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.
UnassignModelFromProjectbug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.

IdentityService

OperationKindChange
CreateOrUpdateSSOProviderbug fixesMoving the corporate OIDC SSO provider to a different identity provider no longer keeps the previous provider's endpoints. Before, sign-in could keep going to the old identity provider with the new client ID, which locked out everyone not already signed in. Same-provider edits keep any explicitly configured endpoints.

InferenceIngressService

OperationKindChange
GetDataplaneURLsecurity updatesThe inference API no longer returns another organization's data plane URL, and Prompt sends only to your own data planes. When another organization uses the same data plane ID, the URL returned is the first hostname your data plane declares; if it declares none, the URL lookups return nothing and Prompt is refused. Prompt with no project mapping now uses your organization's only data plane.
ListDataplaneURLssecurity updatesThe inference API no longer returns another organization's data plane URL, and Prompt sends only to your own data planes. When another organization uses the same data plane ID, the URL returned is the first hostname your data plane declares; if it declares none, the URL lookups return nothing and Prompt is refused. Prompt with no project mapping now uses your organization's only data plane.
Promptsecurity updatesThe inference API no longer returns another organization's data plane URL, and Prompt sends only to your own data planes. When another organization uses the same data plane ID, the URL returned is the first hostname your data plane declares; if it declares none, the URL lookups return nothing and Prompt is refused. Prompt with no project mapping now uses your organization's only data plane.

MCPCatalogService

OperationKindChange
UpsertCatalogServerbug fixesChanges to an MCP catalog server now reach data planes that host no project gateway, so a re-pointed server stops serving its old URL and a disabled or deleted one stops being reachable at /mcp/s/<server>. Archiving a project through the tenancy API now also clears the project's gateway setup, as deleting it already did.
SetCatalogServerEnabledbug fixesChanges to an MCP catalog server now reach data planes that host no project gateway, so a re-pointed server stops serving its old URL and a disabled or deleted one stops being reachable at /mcp/s/<server>. Archiving a project through the tenancy API now also clears the project's gateway setup, as deleting it already did.
DeleteCatalogServerbug fixesChanges to an MCP catalog server now reach data planes that host no project gateway, so a re-pointed server stops serving its old URL and a disabled or deleted one stops being reachable at /mcp/s/<server>. Archiving a project through the tenancy API now also clears the project's gateway setup, as deleting it already did.

MCPProfilesService

OperationKindChange
CreateMCPProfilebug fixesDeleting an MCP profile frees its name for a new or renamed profile.
UpdateMCPProfilebug fixesDeleting an MCP profile frees its name for a new or renamed profile.
DeleteMCPProfilebug fixesDeleting an MCP profile frees its name for a new or renamed profile.

McpOAuthClientsService

OperationKindChange
CreateMcpOAuthClientbug fixesMCP servers whose OAuth client was created through the API now get their sign-in applied on gateways. Their servers were recorded in a form the gateway configuration did not read, so those servers were treated as needing no sign-in. Sign-in details are also now looked up within the project that owns them, so two projects using the same provider name no longer stop each other's MCP servers from signing in.
UpdateMcpOAuthClientbug fixesMCP servers whose OAuth client was created through the API now get their sign-in applied on gateways. Their servers were recorded in a form the gateway configuration did not read, so those servers were treated as needing no sign-in. Sign-in details are also now looked up within the project that owns them, so two projects using the same provider name no longer stop each other's MCP servers from signing in.

MeService

OperationKindChange
IssueMyKeybug fixesAdding or removing a model from a project now updates keys that carry their own settings (BYOK, fallback, traffic split, or a rate limit), so they no longer keep routing against the old model list. A key created with CreateApiKey or IssueMyKey now gets its own routes instead of waiting on an unrelated change. Both updates are sent in the background, so the call returns without waiting for them.

PolicyService

OperationKindChange
GetEffectivePolicybehaviour changesAttribute-based routing has two scopes, project and API key: a key's own routing policy replaces its project's. A tag preview returns the project's policy only when project_id is supplied, and no policy otherwise. Organization and tag policies are no longer resolved.
GetPolicyCoveragebehaviour changesAttribute-based routing has two scopes, project and API key: a key's own routing policy replaces its project's. A tag preview returns the project's policy only when project_id is supplied, and no policy otherwise. Organization and tag policies are no longer resolved.
CreateRateLimitPolicynew featuresA project or API key rate-limit policy can now limit requests per minute, requests per hour and tokens per minute beside tokens per hour, in any mix. Existing per-hour values stay. A refused request gets a 429 naming the policy and its window when the data plane can tell which policy set the limit. UpdateRateLimitPolicy removes one limit through clear_dimensions, GetEffectivePolicy names the dimension of each entry, and period has no effect. count_tokens calls count against no rate limit.
UpdateRateLimitPolicynew featuresA project or API key rate-limit policy can now limit requests per minute, requests per hour and tokens per minute beside tokens per hour, in any mix. Existing per-hour values stay. A refused request gets a 429 naming the policy and its window when the data plane can tell which policy set the limit. UpdateRateLimitPolicy removes one limit through clear_dimensions, GetEffectivePolicy names the dimension of each entry, and period has no effect. count_tokens calls count against no rate limit.
GetRateLimitPolicynew featuresA project or API key rate-limit policy can now limit requests per minute, requests per hour and tokens per minute beside tokens per hour, in any mix. Existing per-hour values stay. A refused request gets a 429 naming the policy and its window when the data plane can tell which policy set the limit. UpdateRateLimitPolicy removes one limit through clear_dimensions, GetEffectivePolicy names the dimension of each entry, and period has no effect. count_tokens calls count against no rate limit.
ListRateLimitPoliciesnew featuresA project or API key rate-limit policy can now limit requests per minute, requests per hour and tokens per minute beside tokens per hour, in any mix. Existing per-hour values stay. A refused request gets a 429 naming the policy and its window when the data plane can tell which policy set the limit. UpdateRateLimitPolicy removes one limit through clear_dimensions, GetEffectivePolicy names the dimension of each entry, and period has no effect. count_tokens calls count against no rate limit.
GetEffectivePolicynew featuresA project or API key rate-limit policy can now limit requests per minute, requests per hour and tokens per minute beside tokens per hour, in any mix. Existing per-hour values stay. A refused request gets a 429 naming the policy and its window when the data plane can tell which policy set the limit. UpdateRateLimitPolicy removes one limit through clear_dimensions, GetEffectivePolicy names the dimension of each entry, and period has no effect. count_tokens calls count against no rate limit.
UpdateRateLimitPolicybug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.

ProjectsService

OperationKindChange
ArchiveProjectbug fixesChanges to an MCP catalog server now reach data planes that host no project gateway, so a re-pointed server stops serving its old URL and a disabled or deleted one stops being reachable at /mcp/s/<server>. Archiving a project through the tenancy API now also clears the project's gateway setup, as deleting it already did.
AddProjectMemberbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.
RemoveProjectMemberbug fixesProject default settings, project membership changes, the request-log mode, and rate-limit policies moved to another target now reach your gateways within the usual update cycle. They were previously saved but not pushed, so keys kept an old rate limit or fallback, a removed member kept the project's shared provider keys, and a moved policy kept limiting its old keys. A project-wide rate limit is also now enforced on keys with no settings of their own.

v0.7.2

No API operations changed in this release.

v0.7.1

No API operations changed in this release.

v0.7.0

AdminService

OperationKindChange
ListDataplaneConfigOverridesbehaviour changesA provider endpoint or key override now applies to one project on a data plane and names that project, so another project the same data plane serves keeps calling the provider with the bundle endpoint and credential. An override written before this release named no project and is removed, with its stored credential, the first time the management plane starts after the upgrade.
SetDataplaneConfigOverridebehaviour changesA provider endpoint or key override now applies to one project on a data plane and names that project, so another project the same data plane serves keeps calling the provider with the bundle endpoint and credential. An override written before this release named no project and is removed, with its stored credential, the first time the management plane starts after the upgrade.
ClearDataplaneConfigOverridebehaviour changesA provider endpoint or key override now applies to one project on a data plane and names that project, so another project the same data plane serves keeps calling the provider with the bundle endpoint and credential. An override written before this release named no project and is removed, with its stored credential, the first time the management plane starts after the upgrade.
CreateProjectGatewaybehaviour changesOnce a data plane declares hostnames in its chart, these three calls accept only a hostname that data plane declared, and refuse anything else with FailedPrecondition naming the chart key. A data plane that has declared nothing keeps today's behaviour, so each one crosses over as its own chart lists a name. SetDataplaneURL no longer stamps a data plane's address onto its default gateway once that data plane declares its own hostnames; it still records the address itself, which is unchanged.
SetProjectGatewayURLbehaviour changesOnce a data plane declares hostnames in its chart, these three calls accept only a hostname that data plane declared, and refuse anything else with FailedPrecondition naming the chart key. A data plane that has declared nothing keeps today's behaviour, so each one crosses over as its own chart lists a name. SetDataplaneURL no longer stamps a data plane's address onto its default gateway once that data plane declares its own hostnames; it still records the address itself, which is unchanged.
UpdateProjectGatewaybehaviour changesOnce a data plane declares hostnames in its chart, these three calls accept only a hostname that data plane declared, and refuse anything else with FailedPrecondition naming the chart key. A data plane that has declared nothing keeps today's behaviour, so each one crosses over as its own chart lists a name. SetDataplaneURL no longer stamps a data plane's address onto its default gateway once that data plane declares its own hostnames; it still records the address itself, which is unchanged.
DeleteProjectbehaviour changesDeleting a project now revokes the API keys scoped to it, rather than refusing while any of them is live. Previously an administrator revoked each key by hand and only then deleted the project. The revoked keys stop being accepted at once, and each data plane drops the routes they carried at its next configuration update.
AttachProjectGatewayProjectbehaviour changesA project gateway now holds several projects. Attaching a second, different project used to be rejected with FailedPrecondition and a "detach the current project first" message; it now succeeds wherever the data plane can enforce the per-project boundary, so one hostname serves every project attached to its gateway and each request resolves to its own project by its own credential. Two concurrent attaches of the same project leave one of them with ABORTED, which the caller retries.
DeleteDataplanebehaviour changesDeleting a data plane now refuses while it is the only one serving a project, and the refusal names up to ten of those projects and reports how many there are in all. A data plane whose projects are all served by another one is deleted as before. Detaching a project from its last data plane is still allowed and now writes a PROJECT_SERVED_NOWHERE audit entry naming the project and that data plane, so the audit log carries a new action type from this release on.
DeleteWorkspacebehaviour changesDeleting a data plane now refuses while it is the only one serving a project, and the refusal names up to ten of those projects and reports how many there are in all. A data plane whose projects are all served by another one is deleted as before. Detaching a project from its last data plane is still allowed and now writes a PROJECT_SERVED_NOWHERE audit entry naming the project and that data plane, so the audit log carries a new action type from this release on.
DetachProjectGatewayProjectbehaviour changesDeleting a data plane now refuses while it is the only one serving a project, and the refusal names up to ten of those projects and reports how many there are in all. A data plane whose projects are all served by another one is deleted as before. Detaching a project from its last data plane is still allowed and now writes a PROJECT_SERVED_NOWHERE audit entry naming the project and that data plane, so the audit log carries a new action type from this release on.
ListCatalogModelsnew featuresCatalog model lists can be paged with page, and support search, mode, modality, context-window and price filters, sorting and snapshot grouping. Paged lists leave out models whose provider is disabled unless include_disabled is set.
ListDataplaneConfigDifferencesnew featuresA data plane now reports each whitelisted field on which it serves something other than the bundle the management plane sent, with both values, and a project reports the fields its data planes disagree on. The management plane labels each difference as an intended override, as a data plane that has not pulled yet, or as one nothing explains. An administrator or the project's owner acknowledges a difference, and one that clears stays on record until then.
ListProjectConfigDifferencesnew featuresA data plane now reports each whitelisted field on which it serves something other than the bundle the management plane sent, with both values, and a project reports the fields its data planes disagree on. The management plane labels each difference as an intended override, as a data plane that has not pulled yet, or as one nothing explains. An administrator or the project's owner acknowledges a difference, and one that clears stays on record until then.
AcknowledgeConfigDifferencenew featuresA data plane now reports each whitelisted field on which it serves something other than the bundle the management plane sent, with both values, and a project reports the fields its data planes disagree on. The management plane labels each difference as an intended override, as a data plane that has not pulled yet, or as one nothing explains. An administrator or the project's owner acknowledges a difference, and one that clears stays on record until then.
ListProjectGatewayMembersnew featuresA data plane now reports each whitelisted field on which it serves something other than the bundle the management plane sent, with both values, and a project reports the fields its data planes disagree on. The management plane labels each difference as an intended override, as a data plane that has not pulled yet, or as one nothing explains. An administrator or the project's owner acknowledges a difference, and one that clears stays on record until then.
ListDataplanesnew featuresA data plane now reports each whitelisted field on which it serves something other than the bundle the management plane sent, with both values, and a project reports the fields its data planes disagree on. The management plane labels each difference as an intended override, as a data plane that has not pulled yet, or as one nothing explains. An administrator or the project's owner acknowledges a difference, and one that clears stays on record until then.
GetDataplanenew featuresA data plane now reports each whitelisted field on which it serves something other than the bundle the management plane sent, with both values, and a project reports the fields its data planes disagree on. The management plane labels each difference as an intended override, as a data plane that has not pulled yet, or as one nothing explains. An administrator or the project's owner acknowledges a difference, and one that clears stays on record until then.
GetProjectDeletionImpactnew featuresGetProjectDeletionImpact reads what deleting a project costs, and how far a delete under way has got. Before the delete it names every data plane serving the project. After it, each reads CLEARING until every gateway it hosted for the project acknowledged the zeroized configuration, then CLEARED with the time the last did. One still hosting a gateway joined to the project stays CLEARING; one carrying neither a membership nor a joined gateway is absent.
DeleteProjectnew featuresDeleteProject now answers with the data planes whose label for the project it removed, so a caller confirming a delete reads the affected fleet out of the delete's own response rather than a follow-up call. Each of them serves the configuration it last pulled until its next pull lands, so the list names what is now clearing rather than what has cleared, and GetProjectDeletionImpact reports how far each has got.
ListProjectDataplanesnew featuresYou can now ask which data planes serve a project. ListProjectDataplanes answers with the data planes carrying the project's label and where each one stands in serving it, and a project no data plane serves answers an empty list rather than an error. It answers on every deployment, unlike ListProjectGatewayMembers beside it, which stays Enterprise-only and keyed on gateways.
ListDataplaneProjectsnew featuresA data plane can now be labelled with the projects it serves, naming a data plane and a project rather than a gateway. The data plane picks that project's configuration up on its next config update, and drops it on the next one after the label is removed. Removing the last label serving a project is refused, because its keys would then admit nowhere, unless the call sets acknowledge_last_endpoint to remove it anyway; the response then reports served_nowhere so the caller can tell its owners.
AddDataplaneProjectnew featuresA data plane can now be labelled with the projects it serves, naming a data plane and a project rather than a gateway. The data plane picks that project's configuration up on its next config update, and drops it on the next one after the label is removed. Removing the last label serving a project is refused, because its keys would then admit nowhere, unless the call sets acknowledge_last_endpoint to remove it anyway; the response then reports served_nowhere so the caller can tell its owners.
RemoveDataplaneProjectnew featuresA data plane can now be labelled with the projects it serves, naming a data plane and a project rather than a gateway. The data plane picks that project's configuration up on its next config update, and drops it on the next one after the label is removed. Removing the last label serving a project is refused, because its keys would then admit nowhere, unless the call sets acknowledge_last_endpoint to remove it anyway; the response then reports served_nowhere so the caller can tell its owners.
ListDataplaneProjectsnew featuresEach project label now says when that data plane first answered a request for the project successfully, in a new verified_at field. It is per project and data plane, so another project's traffic on the same data plane never sets it, and applying a label again clears it until the next success. Each label also reports the config pull before it, as target_revision, held_revision and config_current.
ListProjectDataplanesnew featuresEach project label now says when that data plane first answered a request for the project successfully, in a new verified_at field. It is per project and data plane, so another project's traffic on the same data plane never sets it, and applying a label again clears it until the next success. Each label also reports the config pull before it, as target_revision, held_revision and config_current.
ListDataplaneConfigOverridesnew featuresAn administrator can now give one project on one data plane its own endpoint or its own key for one provider, and every other project that data plane serves goes on calling the provider with the bundle endpoint and credential. A key is write-only and reaches only the project it was written for; clearing an override restores the bundle value and destroys the key.
SetDataplaneConfigOverridenew featuresAn administrator can now give one project on one data plane its own endpoint or its own key for one provider, and every other project that data plane serves goes on calling the provider with the bundle endpoint and credential. A key is write-only and reaches only the project it was written for; clearing an override restores the bundle value and destroys the key.
ClearDataplaneConfigOverridenew featuresAn administrator can now give one project on one data plane its own endpoint or its own key for one provider, and every other project that data plane serves goes on calling the provider with the bundle endpoint and credential. A key is write-only and reaches only the project it was written for; clearing an override restores the bundle value and destroys the key.
ListDataplaneRolloutnew featuresRollout progress now reads per data plane as a fraction of its labelled projects, and rolls up to a fleet figure such as 7 of 9 that counts a data plane only when every project on it holds its current revision. Projects with no revision yet are left out of both, so a data plane serving only those reads 0 of 0. Each data plane also reports whether its guardrails union is current, beside those counts rather than folded into them.
ListProjectsServedFromnew featuresYou can now resolve a set of data planes to the projects served from them, so a region-bound rule attaches to those projects rather than to the infrastructure. Each project also reports the data planes outside your selection that serve it, because a project labelled in several regions is served from all of them. Nothing verifies that a data plane named for a region runs in it.
ListProjectGatewayMembersnew featuresA project's gateway members now come back with where the project stands across the data planes serving it: the revision last minted for its configuration, how many labelled data planes have confirmed that revision, and how many carry the label at all. A member is one ingress endpoint and one data plane hosts several of them, so the two readings answer different questions and the rollup is the one that says whether the project is covered.
DeleteDataplanenew featuresForgetting a data plane now leaves a zeroize directive waiting for it and soft-deletes its credential. The directive travels only on the data plane's own next configuration poll, which the record shows as a call home, and the data plane acknowledges it like any configuration revision. A data plane that never calls keeps serving what it holds, and the forget can be undone until the directive lands. A data plane that was issued a new credential before it was forgotten collects its directive too.
GetProjectOIDCConfignew featuresA project can now publish an OIDC contract, naming the issuer that mints its tokens, the audience and scope they must carry and an optional entitlement. The issuer's discovery document is read as you write it, so an unreachable issuer is refused then. A contract naming an issuer and audience another organization's project already names is refused. A data plane on 0.7.0 or later admits callers against the contract; one below it answers them with a 401.
UpsertProjectOIDCConfignew featuresA project can now publish an OIDC contract, naming the issuer that mints its tokens, the audience and scope they must carry and an optional entitlement. The issuer's discovery document is read as you write it, so an unreachable issuer is refused then. A contract naming an issuer and audience another organization's project already names is refused. A data plane on 0.7.0 or later admits callers against the contract; one below it answers them with a 401.
DeleteProjectOIDCConfignew featuresA project can now publish an OIDC contract, naming the issuer that mints its tokens, the audience and scope they must carry and an optional entitlement. The issuer's discovery document is read as you write it, so an unreachable issuer is refused then. A contract naming an issuer and audience another organization's project already names is refused. A data plane on 0.7.0 or later admits callers against the contract; one below it answers them with a 401.
UpsertProjectOIDCConfignew featuresThe management plane refuses to fetch an OIDC issuer's discovery document from a non-public address: loopback, link-local, private, carrier-grade NAT, unique-local, unspecified, or another range reserved from public routing, such as benchmarking. It checks the address it connects to, redirects included, and the refusal names the setting that lifts it. A redirect is followed only to https on the issuer's own host and port.
UpdateWorkspacenew featuresA data plane can now repair itself when its doctor reports RBAC objects or CRDs its chart declares as missing or changed, writing back what the chart says. Turn it on per data plane with auto_repair. A run makes at most two attempts, and the data plane's health then shows a SelfRepairHealthy issue carrying the error. A run that escalates also keeps a doctor bundle, which happens when both attempts fail on the same step or the data plane reports on neither.
UpdateDataplanenew featuresA data plane can now repair itself when its doctor reports RBAC objects or CRDs its chart declares as missing or changed, writing back what the chart says. Turn it on per data plane with auto_repair. A run makes at most two attempts, and the data plane's health then shows a SelfRepairHealthy issue carrying the error. A run that escalates also keeps a doctor bundle, which happens when both attempts fail on the same step or the data plane reports on neither.
UpdateProjectGatewaynew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.
GetProjectGatewaynew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.
ListProjectGatewaysnew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.
UpdateProjectGatewayProjectnew featuresA project's membership of a project gateway now accepts ACCEPTED_CREDENTIALS_TOKEN on Enterprise, so the gateway refuses API keys for that project and accepts only IdP tokens. ACCEPTED_CREDENTIALS_BOTH no longer returns a warning. A data plane older than 0.7.0 keeps accepting API keys whatever the membership declares.
RemoveDataplaneProjectbug fixesRemoving the last project from a data plane that has a single gateway now takes the project's label off, reports served_nowhere and records PROJECT_SERVED_NOWHERE in the audit log. Before, the call answered removed=true while the label stayed on the data plane, and neither was recorded.
DetachProjectGatewayProjectbug fixesRemoving the last project from a data plane that has a single gateway now takes the project's label off, reports served_nowhere and records PROJECT_SERVED_NOWHERE in the audit log. Before, the call answered removed=true while the label stayed on the data plane, and neither was recorded.
RemoveDataplaneProjectbug fixesRemoving a project from a data plane now takes the label off even when the data plane's configuration update fails, so a response with removed=true no longer lists the label it removed. Removing a label left behind by an earlier removal records PROJECT_SERVED_NOWHERE when it was the project's last one.
DeleteProjectbug fixesDeleting a project that shares a gateway with another project no longer stops that gateway serving the other project, and the deletion receipt now reports the data plane as cleared as soon as the data plane acknowledges configuration that no longer carries the deleted project. Before, that data plane stayed clearing indefinitely.
GetProjectDeletionImpactbug fixesDeleting a project that shares a gateway with another project no longer stops that gateway serving the other project, and the deletion receipt now reports the data plane as cleared as soon as the data plane acknowledges configuration that no longer carries the deleted project. Before, that data plane stayed clearing indefinitely.
AttachProjectGatewayProjectdeprecationsA project owner attaching a project to a gateway, detaching one or deleting a gateway is deprecated, and 0.9.0 requires a platform administrator for all three. Until then a project owner can make these changes while the gateway serves only projects they own. Once a gateway serves another owner's project, only a platform administrator can change it, and a project-owner credential answers 403.
DetachProjectGatewayProjectdeprecationsA project owner attaching a project to a gateway, detaching one or deleting a gateway is deprecated, and 0.9.0 requires a platform administrator for all three. Until then a project owner can make these changes while the gateway serves only projects they own. Once a gateway serves another owner's project, only a platform administrator can change it, and a project-owner credential answers 403.
DeleteProjectGatewaydeprecationsA project owner attaching a project to a gateway, detaching one or deleting a gateway is deprecated, and 0.9.0 requires a platform administrator for all three. Until then a project owner can make these changes while the gateway serves only projects they own. Once a gateway serves another owner's project, only a platform administrator can change it, and a project-owner credential answers 403.
SetDataplaneURLdeprecationsSetting a data plane's or a project gateway's address through the admin API is deprecated. A 0.7 data plane reports its own address from global.gateway.hostnames in its serve-helm values. SetDataplaneURL, its SetWorkspaceURL alias, SetProjectGatewayURL and the url field of CreateProjectGateway and UpdateProjectGateway keep working. A data plane before 0.7 cannot declare hostnames, so these calls stay until no supported data plane predates 0.7.
SetWorkspaceURLdeprecationsSetting a data plane's or a project gateway's address through the admin API is deprecated. A 0.7 data plane reports its own address from global.gateway.hostnames in its serve-helm values. SetDataplaneURL, its SetWorkspaceURL alias, SetProjectGatewayURL and the url field of CreateProjectGateway and UpdateProjectGateway keep working. A data plane before 0.7 cannot declare hostnames, so these calls stay until no supported data plane predates 0.7.
SetProjectGatewayURLdeprecationsSetting a data plane's or a project gateway's address through the admin API is deprecated. A 0.7 data plane reports its own address from global.gateway.hostnames in its serve-helm values. SetDataplaneURL, its SetWorkspaceURL alias, SetProjectGatewayURL and the url field of CreateProjectGateway and UpdateProjectGateway keep working. A data plane before 0.7 cannot declare hostnames, so these calls stay until no supported data plane predates 0.7.
CreateProjectGatewaydeprecationsSetting a data plane's or a project gateway's address through the admin API is deprecated. A 0.7 data plane reports its own address from global.gateway.hostnames in its serve-helm values. SetDataplaneURL, its SetWorkspaceURL alias, SetProjectGatewayURL and the url field of CreateProjectGateway and UpdateProjectGateway keep working. A data plane before 0.7 cannot declare hostnames, so these calls stay until no supported data plane predates 0.7.
UpdateProjectGatewaydeprecationsSetting a data plane's or a project gateway's address through the admin API is deprecated. A 0.7 data plane reports its own address from global.gateway.hostnames in its serve-helm values. SetDataplaneURL, its SetWorkspaceURL alias, SetProjectGatewayURL and the url field of CreateProjectGateway and UpdateProjectGateway keep working. A data plane before 0.7 cannot declare hostnames, so these calls stay until no supported data plane predates 0.7.
ListCatalogModelsdeprecationsA catalog model list that sets only provider_id or include_disabled still returns the full catalog, but is deprecated and will return one page in a later release. Setting any other field returns one page.

GatewayAuthPolicyService

OperationKindChange
CreateGatewayAuthPolicybehaviour changesCreating a gateway auth policy, or changing its jwks_uri, is now refused when the jwks_uri carries a user name or password, writes an IPv4 address as anything other than a dotted quad, or names or resolves to a carrier-grade NAT, multicast, reserved or other internal address. Existing policies keep working, and an update that leaves jwks_uri as it is still succeeds.
UpdateGatewayAuthPolicybehaviour changesCreating a gateway auth policy, or changing its jwks_uri, is now refused when the jwks_uri carries a user name or password, writes an IPv4 address as anything other than a dotted quad, or names or resolves to a carrier-grade NAT, multicast, reserved or other internal address. Existing policies keep working, and an update that leaves jwks_uri as it is still succeeds.
CreateGatewayAuthPolicybehaviour changesCreating a gateway auth policy, or changing its jwks_inline key set, is now refused when the key set holds more than 32 keys or more than 16 KiB. Existing policies keep their key sets, and an update that leaves jwks_inline as it is still succeeds.
UpdateGatewayAuthPolicybehaviour changesCreating a gateway auth policy, or changing its jwks_inline key set, is now refused when the key set holds more than 32 keys or more than 16 KiB. Existing policies keep their key sets, and an update that leaves jwks_inline as it is still succeeds.
CreateIdentityMappingRulebehaviour changesCreating an identity mapping rule now refuses a jit_project_id that is not a project of the policy's customer or is not attached to the policy's gateway, a jit_principal_cap on a pre_registered rule, and a jit rule whose principal_type is not external.
CreateGatewayAuthPolicybehaviour changesCreating a gateway auth policy, or changing its extraction_header, is now refused unless the gateway can remove that header after verifying the token, which rules out the identity headers the gateway sets and credential headers such as x-api-key, cookie and proxy-authorization. Existing policies keep their header, and the data plane and management plane log a warning for each enabled policy that reads such a header.
UpdateGatewayAuthPolicybehaviour changesCreating a gateway auth policy, or changing its extraction_header, is now refused unless the gateway can remove that header after verifying the token, which rules out the identity headers the gateway sets and credential headers such as x-api-key, cookie and proxy-authorization. Existing policies keep their header, and the data plane and management plane log a warning for each enabled policy that reads such a header.
CreateGatewayAuthPolicynew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.
UpdateGatewayAuthPolicynew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.
GetGatewayAuthPolicynew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.
ListGatewayAuthPoliciesnew featuresA project gateway can now declare the environment it serves in environment, and a gateway auth policy can name the token claim carrying a token's environment in environment_claim. Only a platform administrator can set or clear a gateway's environment, and an enabled policy with environment_claim is refused on a gateway that declares none. The gateway refuses an IdP token whose environment claim does not name the gateway's environment.

GuardrailProvidersService

OperationKindChange
CreateGuardrailProvidernew featuresYou can now author a guardrail, a guardrail rule, a guardrail provider and a pattern for a whole organization rather than one project at a time. Send scope GUARDRAIL_SCOPE_ORGANIZATION with no project_id, and every project of that customer is served the rule. A request that names a project behaves exactly as it did, and a request that names both is refused, so a caller that forgot the project cannot write into every project by accident.

GuardrailTriggersService

OperationKindChange
ListGuardrailTriggersnew featuresEvery guardrail rule now carries a reference, a short read-only id such as GR-0142 that the database mints once and never rewrites. The guardrail rule APIs and each trigger evaluation return it beside the display_name, and the data plane receives it in its runtime configuration, so a platform operator reading a trigger has one id to quote. Existing rules were numbered in creation order, and a blocked caller's refusal body does not carry the reference yet.
GetGuardrailTriggernew featuresEvery guardrail rule now carries a reference, a short read-only id such as GR-0142 that the database mints once and never rewrites. The guardrail rule APIs and each trigger evaluation return it beside the display_name, and the data plane receives it in its runtime configuration, so a platform operator reading a trigger has one id to quote. Existing rules were numbered in creation order, and a blocked caller's refusal body does not carry the reference yet.
ListGuardrailTriggersnew featuresA guardrail trigger now reports one verdict for the whole event, which is blocked, redacted or would-have, resolved from its rule evaluations so an enforced block outranks an enforced redact and either outranks a monitor-mode hit that changed nothing. ListGuardrailTriggers filters on verdicts and returns a count for each one. The counts answer every filter on the request except verdicts itself, so a console showing the three as peers keeps all three counts on screen after a reader picks one.
GetGuardrailTriggernew featuresA guardrail trigger now reports one verdict for the whole event, which is blocked, redacted or would-have, resolved from its rule evaluations so an enforced block outranks an enforced redact and either outranks a monitor-mode hit that changed nothing. ListGuardrailTriggers filters on verdicts and returns a count for each one. The counts answer every filter on the request except verdicts itself, so a console showing the three as peers keeps all three counts on screen after a reader picks one.

GuardrailsService

OperationKindChange
CreateGuardrailbehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
UpdateGuardrailbehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
DeleteGuardrailbehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
SetGuardrailStatusbehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
CreateGuardrailFromTemplatebehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
CreateGuardrailRulebehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
UpdateGuardrailRulebehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
DeleteGuardrailRulebehaviour changesA project owner now creates, edits and deletes the guardrails and guardrail rules of a project they own, without an organization-wide guardrails credential. The shared pattern library and the external guardrail providers stay administrator-only, and a project owner still reaches no other project's guardrails.
CreateGuardrailnew featuresYou can now author a guardrail, a guardrail rule, a guardrail provider and a pattern for a whole organization rather than one project at a time. Send scope GUARDRAIL_SCOPE_ORGANIZATION with no project_id, and every project of that customer is served the rule. A request that names a project behaves exactly as it did, and a request that names both is refused, so a caller that forgot the project cannot write into every project by accident.
UpdateGuardrailnew featuresYou can now author a guardrail, a guardrail rule, a guardrail provider and a pattern for a whole organization rather than one project at a time. Send scope GUARDRAIL_SCOPE_ORGANIZATION with no project_id, and every project of that customer is served the rule. A request that names a project behaves exactly as it did, and a request that names both is refused, so a caller that forgot the project cannot write into every project by accident.
CreateGuardrailRulenew featuresYou can now author a guardrail, a guardrail rule, a guardrail provider and a pattern for a whole organization rather than one project at a time. Send scope GUARDRAIL_SCOPE_ORGANIZATION with no project_id, and every project of that customer is served the rule. A request that names a project behaves exactly as it did, and a request that names both is refused, so a caller that forgot the project cannot write into every project by accident.
UpdateGuardrailRulenew featuresYou can now author a guardrail, a guardrail rule, a guardrail provider and a pattern for a whole organization rather than one project at a time. Send scope GUARDRAIL_SCOPE_ORGANIZATION with no project_id, and every project of that customer is served the rule. A request that names a project behaves exactly as it did, and a request that names both is refused, so a caller that forgot the project cannot write into every project by accident.
ListGuardrailsnew featuresA project now reads the organization's guardrails alongside its own, and every guardrail, pattern and provider reports the level it sits at. The organization's rules are enforced on the project, so they belong in what it reads; a project still cannot edit them, and a write aimed at one is refused.
GetGuardrailnew featuresA project now reads the organization's guardrails alongside its own, and every guardrail, pattern and provider reports the level it sits at. The organization's rules are enforced on the project, so they belong in what it reads; a project still cannot edit them, and a write aimed at one is refused.
GetEffectiveStacknew featuresA project's effective guardrail stack now reads as one list carrying both levels. A rule set at the organization and a rule set at the project that check the same thing at the same stage are marked as duplicating each other rather than one being merged away, because the data plane evaluates both. Rules that are present and switched off stay on the list, marked unenforced.
GetBlastRadiusnew featuresA guardrail apply can now state what it reconverges before you confirm it: how many projects it changes, how many distinct data planes re-pull, and how many of those projects are served nowhere.
TestRuleAgainstStacknew featuresA candidate guardrail rule can now be tested against a project's stack before it takes traffic. The answer names the checks it duplicates, whether it blocks what another rule only redacts, whether its provider is one its scope may bind and is switched on, whether the patterns it names resolve, and whether a data plane would evaluate it at all. Nothing is stored and no traffic is sent.
ListGuardrailRulesnew featuresEvery guardrail rule now carries a reference, a short read-only id such as GR-0142 that the database mints once and never rewrites. The guardrail rule APIs and each trigger evaluation return it beside the display_name, and the data plane receives it in its runtime configuration, so a platform operator reading a trigger has one id to quote. Existing rules were numbered in creation order, and a blocked caller's refusal body does not carry the reference yet.
GetGuardrailRulenew featuresEvery guardrail rule now carries a reference, a short read-only id such as GR-0142 that the database mints once and never rewrites. The guardrail rule APIs and each trigger evaluation return it beside the display_name, and the data plane receives it in its runtime configuration, so a platform operator reading a trigger has one id to quote. Existing rules were numbered in creation order, and a blocked caller's refusal body does not carry the reference yet.
CreateGuardrailRulenew featuresEvery guardrail rule now carries a reference, a short read-only id such as GR-0142 that the database mints once and never rewrites. The guardrail rule APIs and each trigger evaluation return it beside the display_name, and the data plane receives it in its runtime configuration, so a platform operator reading a trigger has one id to quote. Existing rules were numbered in creation order, and a blocked caller's refusal body does not carry the reference yet.
UpdateGuardrailRulenew featuresEvery guardrail rule now carries a reference, a short read-only id such as GR-0142 that the database mints once and never rewrites. The guardrail rule APIs and each trigger evaluation return it beside the display_name, and the data plane receives it in its runtime configuration, so a platform operator reading a trigger has one id to quote. Existing rules were numbered in creation order, and a blocked caller's refusal body does not carry the reference yet.

IdentityService

OperationKindChange
CreateOrUpdateSSOProviderbehaviour changesSaving an SSO provider with role sync set to strict is refused when the provider is SAML, has no usable role mapping (a role claim path and at least one entry), or names no recovery administrator. In shared auth database mode a mapping whose only entries target super_admin does not count, nor do the provider's own admin emails. Stored providers keep working; the check runs on their next save.

InferenceIngressService

OperationKindChange
ListDataplaneURLsbehaviour changesListing data plane addresses with an inference key issued for a project other than default now returns only that project's addresses, where it used to return every address in the organization.
GetDataplaneURLbug fixesLooking up a data plane address with an inference key now returns the key's own project's address on a data plane serving several projects, where it used to answer 400. A key issued before July 2026 still gets the 400.

PatternsService

OperationKindChange
CreatePatternnew featuresYou can now author a guardrail, a guardrail rule, a guardrail provider and a pattern for a whole organization rather than one project at a time. Send scope GUARDRAIL_SCOPE_ORGANIZATION with no project_id, and every project of that customer is served the rule. A request that names a project behaves exactly as it did, and a request that names both is refused, so a caller that forgot the project cannot write into every project by accident.

PolicyService

OperationKindChange
GetAttributeRoutingPolicysecurity updatesProject-scoped attribute-routing reads now stay within the authorized project, so callers can no longer view another project's routing rules, condition values, or policy target identifiers such as target_api_key_id.
ListAttributeRoutingPoliciessecurity updatesProject-scoped attribute-routing reads now stay within the authorized project, so callers can no longer view another project's routing rules, condition values, or policy target identifiers such as target_api_key_id.
GetRequestAttributesecurity updatesProject-scoped attribute-routing reads now stay within the authorized project, so callers can no longer view another project's routing rules, condition values, or policy target identifiers such as target_api_key_id.
ListRequestAttributessecurity updatesProject-scoped attribute-routing reads now stay within the authorized project, so callers can no longer view another project's routing rules, condition values, or policy target identifiers such as target_api_key_id.
CreateRateLimitPolicynew featuresA rate-limit policy now carries a display_name, the public label a caller will see when that limit refuses a request. Existing policies take their name as the label, and a policy created without one does the same, so a platform operator only sets it when the name is not meant for callers. The label is stored and returned for now; the refusal body that prints it is still to come.
GetRateLimitPolicynew featuresA rate-limit policy now carries a display_name, the public label a caller will see when that limit refuses a request. Existing policies take their name as the label, and a policy created without one does the same, so a platform operator only sets it when the name is not meant for callers. The label is stored and returned for now; the refusal body that prints it is still to come.
ListRateLimitPoliciesnew featuresA rate-limit policy now carries a display_name, the public label a caller will see when that limit refuses a request. Existing policies take their name as the label, and a policy created without one does the same, so a platform operator only sets it when the name is not meant for callers. The label is stored and returned for now; the refusal body that prints it is still to come.
UpdateRateLimitPolicynew featuresA rate-limit policy now carries a display_name, the public label a caller will see when that limit refuses a request. Existing policies take their name as the label, and a policy created without one does the same, so a platform operator only sets it when the name is not meant for callers. The label is stored and returned for now; the refusal body that prints it is still to come.
GetBudgetConsumptionnew featuresGetBudgetConsumption reports what an Organization, or each project inside it, has consumed in the current period, in spend and in tokens, with the budget set at that scope when there is one. A scope with no budget is reported as having none rather than as zero, and the read states no enforcement behaviour: what happens when a budget is reached stays with the budget policy that defines it.
ListAttributeRoutingPoliciesbug fixesListing attribute routing policies now rejects a scope_types or statuses filter it cannot apply, instead of ignoring it and returning a broader list than requested. Only KEY and PROJECT scopes are accepted.

ProjectsService

OperationKindChange
ArchiveProjectbehaviour changesDeleting a project now revokes the API keys scoped to it, rather than refusing while any of them is live. Previously an administrator revoked each key by hand and only then deleted the project. The revoked keys stop being accepted at once, and each data plane drops the routes they carried at its next configuration update.
CreateProjectbehaviour changesCreating a project over the tenancy API now refuses, with InvalidArgument, a project_id longer than 253 characters or one using anything other than lowercase letters, digits, hyphens, underscores and dots, or not starting and ending with a letter or digit. The admin API has held the same field to that rule since it shipped, while the tenancy call accepted any non-empty value, including a slug with a slash or an uppercase letter. Projects that already exist are untouched.

RequestLogsService

OperationKindChange
CountProjectRequestsnew featuresA new call counts one project's requests on each of several data planes in one request, naming the project rather than every API key it holds. Reading these counts through the request-log list cost a discarded row and a scan of the whole data plane's window.

v0.6.2

No API operations changed in this release.

v0.6.1

No API operations changed in this release.

v0.6.0

AdminService

OperationKindChange
ListCatalogProvidersnew featuresProvider reads have a new field, has_credential: true when the provider's platform key is stored, false when it is not, and unset when the check could not run (the read still succeeds). ListProviders and GetProvider also accept a customer_id, and optionally a project_id within it, which returns the same providers without the key suffix or internal metadata.
UpsertCatalogProvidernew featuresCreateProvider adds a provider and returns AlreadyExists if the id is taken, and DeleteProviderCredential removes a provider's platform key. UpsertProvider now needs display_name, base_url and a canonical id only when it creates the provider, so {id, is_enabled} toggles an existing one.
UpsertCatalogProvidernew featuresUpsertProvider has a new field, remove_metadata_keys, that removes the named top-level keys from the provider's metadata. A null value in metadata is still stored as sent. credential and credential_suffix cannot be removed this way.
UpdateProjectGatewayProjectnew featuresProject gateway attachments now record accepted_credentials; existing attachments read API_KEY. Enterprise projects with an enabled jwt gateway auth policy can choose BOTH, which prevents disabling or deleting their last enabled policy. TOKEN is refused for now. The gateway does not yet enforce this setting: API keys still work, and an identity-provider token alone does not authenticate a caller.
ListProjectGatewayProjectsnew featuresProject gateway attachments now record accepted_credentials; existing attachments read API_KEY. Enterprise projects with an enabled jwt gateway auth policy can choose BOTH, which prevents disabling or deleting their last enabled policy. TOKEN is refused for now. The gateway does not yet enforce this setting: API keys still work, and an identity-provider token alone does not authenticate a caller.
ListProjectGatewayMembersnew featuresProject gateway attachments now record accepted_credentials; existing attachments read API_KEY. Enterprise projects with an enabled jwt gateway auth policy can choose BOTH, which prevents disabling or deleting their last enabled policy. TOKEN is refused for now. The gateway does not yet enforce this setting: API keys still work, and an identity-provider token alone does not authenticate a caller.
DeleteProjectbug fixesDeleting a project now also deletes its project fallback overrides, so a project created later with the same ID starts with none. The upgrade removes overrides left behind by projects deleted earlier, unless a new project already uses the same ID: that project keeps them, and an admin who doesn't want them removes them on the Fallback page.

CatalogService

OperationKindChange
GetProviderbehaviour changesGetProvider and the provider writes now also accept a platform role binding that grants the providers permission, such as platform_provider_admin. The admin scope still works as before.
UpsertProviderbehaviour changesGetProvider and the provider writes now also accept a platform role binding that grants the providers permission, such as platform_provider_admin. The admin scope still works as before.
SetProviderCredentialbehaviour changesGetProvider and the provider writes now also accept a platform role binding that grants the providers permission, such as platform_provider_admin. The admin scope still works as before.
DeleteProviderbehaviour changesGetProvider and the provider writes now also accept a platform role binding that grants the providers permission, such as platform_provider_admin. The admin scope still works as before.
ListProvidersnew featuresProvider reads have a new field, has_credential: true when the provider's platform key is stored, false when it is not, and unset when the check could not run (the read still succeeds). ListProviders and GetProvider also accept a customer_id, and optionally a project_id within it, which returns the same providers without the key suffix or internal metadata.
GetProvidernew featuresProvider reads have a new field, has_credential: true when the provider's platform key is stored, false when it is not, and unset when the check could not run (the read still succeeds). ListProviders and GetProvider also accept a customer_id, and optionally a project_id within it, which returns the same providers without the key suffix or internal metadata.
CreateProvidernew featuresCreateProvider adds a provider and returns AlreadyExists if the id is taken, and DeleteProviderCredential removes a provider's platform key. UpsertProvider now needs display_name, base_url and a canonical id only when it creates the provider, so {id, is_enabled} toggles an existing one.
DeleteProviderCredentialnew featuresCreateProvider adds a provider and returns AlreadyExists if the id is taken, and DeleteProviderCredential removes a provider's platform key. UpsertProvider now needs display_name, base_url and a canonical id only when it creates the provider, so {id, is_enabled} toggles an existing one.
UpsertProvidernew featuresCreateProvider adds a provider and returns AlreadyExists if the id is taken, and DeleteProviderCredential removes a provider's platform key. UpsertProvider now needs display_name, base_url and a canonical id only when it creates the provider, so {id, is_enabled} toggles an existing one.
UpsertProvidernew featuresUpsertProvider has a new field, remove_metadata_keys, that removes the named top-level keys from the provider's metadata. A null value in metadata is still stored as sent. credential and credential_suffix cannot be removed this way.

CustomerMetricsService

OperationKindChange
GetUserMetricbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.
GetApiKeyMetricbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.
GetProjectMetricbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.
GetMyMetricbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.
ListMetricsbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.

GatewayAuthPolicyService

OperationKindChange
CreateGatewayAuthPolicynew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
GetGatewayAuthPolicynew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
ListGatewayAuthPoliciesnew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
UpdateGatewayAuthPolicynew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
DeleteGatewayAuthPolicynew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
CreateIdentityMappingRulenew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
ListIdentityMappingRulesnew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.
DeleteIdentityMappingRulenew featuresThe management API can now store gateway authentication policies and the rules that map a verified identity onto a caller.

MetricsService

OperationKindChange
GetCustomerMetricbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.
GetMetricbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.
ListMetricsbehaviour changesLatency metrics (response_latency, ttft, tpot and the guardrail latency metrics) now return an empty summary, and the metric catalog reports an empty function for them: the per-window average they carried was not a true average and is no longer computed. Additive metrics keep their summary and total.

PolicyService

OperationKindChange
CreateFallbackChainPolicybehaviour changesA fallback-policy write sent with a project is now refused unless its target stays inside that project: the organization-wide default (a CUSTOMER target), tag-targeted legacy policies, and any key or project outside it are rejected, even for an organization administrator. Writes sent without a project keep working as before.
UpdateFallbackChainPolicybehaviour changesA fallback-policy write sent with a project is now refused unless its target stays inside that project: the organization-wide default (a CUSTOMER target), tag-targeted legacy policies, and any key or project outside it are rejected, even for an organization administrator. Writes sent without a project keep working as before.
DeleteFallbackChainPolicybehaviour changesA fallback-policy write sent with a project is now refused unless its target stays inside that project: the organization-wide default (a CUSTOMER target), tag-targeted legacy policies, and any key or project outside it are rejected, even for an organization administrator. Writes sent without a project keep working as before.
SetFallbackChainPolicyStatusbehaviour changesA fallback-policy write sent with a project is now refused unless its target stays inside that project: the organization-wide default (a CUSTOMER target), tag-targeted legacy policies, and any key or project outside it are rejected, even for an organization administrator. Writes sent without a project keep working as before.
UpsertFallbackPolicybehaviour changesA fallback-policy write sent with a project is now refused unless its target stays inside that project: the organization-wide default (a CUSTOMER target), tag-targeted legacy policies, and any key or project outside it are rejected, even for an organization administrator. Writes sent without a project keep working as before.
ListAttributeRoutingPoliciesbehaviour changesListing attribute-routing policies for a project now requires the user's own attribute_routing_policies.read grant on that project.
UpsertFallbackPolicybehaviour changesA fallback policy now rejects an unsupported retry_on value with a clear message instead of silently storing it. An existing value with an unknown token reads back empty, meaning the default retry set applies.
GetAttributeRoutingPolicyAnalyticsnew featuresAttribute-routing policies now report their routing decisions over a selected lookback period. The readout breaks requests down by the rule or default that matched, the destination provider and model, and monitor or enforce mode, counts requests that carried an attribute value outside its allowed set, and states the time through which routing data is available. Use it to review a policy in monitor mode before enforcing it. Reading it requires attribute_routing_policies.read on the project.
ListAttributeRoutingPoliciesnew featuresAttribute-routing policies can now be listed across the whole organization by leaving out project_id, with each policy naming the project it applies to. This needs organization-level read access.
ListAttributeRoutingPoliciesnew featuresAttribute-routing policies now report rule_count and distinct_destination_model_count on every read, including the list, so a list can show how many rules a policy has and how many models they route to without loading the rules.
GetAttributeRoutingPolicynew featuresAttribute-routing policies now report rule_count and distinct_destination_model_count on every read, including the list, so a list can show how many rules a policy has and how many models they route to without loading the rules.
CreateAttributeRoutingPolicynew featuresAttribute-routing policies now report rule_count and distinct_destination_model_count on every read, including the list, so a list can show how many rules a policy has and how many models they route to without loading the rules.
UpdateAttributeRoutingPolicynew featuresAttribute-routing policies now report rule_count and distinct_destination_model_count on every read, including the list, so a list can show how many rules a policy has and how many models they route to without loading the rules.
CreateFallbackChainPolicynew featuresProject owners can now manage fallback policies for their own project: creating, updating, deleting, activating and deactivating project- and API-key-scoped policies inside a project they own needs only the project owner's own grants. A request routed through a project may only target that project -- a key or project outside it, or the organization-wide default, is refused, and the organization-wide default keeps its organization-level administration.
UpdateFallbackChainPolicynew featuresProject owners can now manage fallback policies for their own project: creating, updating, deleting, activating and deactivating project- and API-key-scoped policies inside a project they own needs only the project owner's own grants. A request routed through a project may only target that project -- a key or project outside it, or the organization-wide default, is refused, and the organization-wide default keeps its organization-level administration.
DeleteFallbackChainPolicynew featuresProject owners can now manage fallback policies for their own project: creating, updating, deleting, activating and deactivating project- and API-key-scoped policies inside a project they own needs only the project owner's own grants. A request routed through a project may only target that project -- a key or project outside it, or the organization-wide default, is refused, and the organization-wide default keeps its organization-level administration.
SetFallbackChainPolicyStatusnew featuresProject owners can now manage fallback policies for their own project: creating, updating, deleting, activating and deactivating project- and API-key-scoped policies inside a project they own needs only the project owner's own grants. A request routed through a project may only target that project -- a key or project outside it, or the organization-wide default, is refused, and the organization-wide default keeps its organization-level administration.
UpsertFallbackPolicynew featuresProject owners can now manage fallback policies for their own project: creating, updating, deleting, activating and deactivating project- and API-key-scoped policies inside a project they own needs only the project owner's own grants. A request routed through a project may only target that project -- a key or project outside it, or the organization-wide default, is refused, and the organization-wide default keeps its organization-level administration.
GetBudgetSpendHistorynew featuresAdministrators can preview up to 12 UTC months of billable spend for a team, its highest-spending member, or an API key before creating a budget, with month/spend filters, sorting and pagination. History uses current team membership and rolled-up managed/BYOK usage, excludes passthrough, preserves decimal precision and fills missing months with zero; without filters or pagination it returns all requested months oldest first, and user sessions require tenant budget-read permission.
GetBudgetPolicynew featuresBudget policy reads now include the stored target client's name and, when spending is requested, the number of keys matching a tag budget. Integrations can display these details without separate database reads.
ListBudgetPoliciesnew featuresBudget policy reads now include the stored target client's name and, when spending is requested, the number of keys matching a tag budget. Integrations can display these details without separate database reads.
CreateTrafficSplitPolicybug fixesProject-scoped traffic-split, fallback-chain and attribute routing policies now create and update successfully when no tag selector is supplied.
UpdateTrafficSplitPolicybug fixesProject-scoped traffic-split, fallback-chain and attribute routing policies now create and update successfully when no tag selector is supplied.
CreateFallbackChainPolicybug fixesProject-scoped traffic-split, fallback-chain and attribute routing policies now create and update successfully when no tag selector is supplied.
UpdateFallbackChainPolicybug fixesProject-scoped traffic-split, fallback-chain and attribute routing policies now create and update successfully when no tag selector is supplied.
CreateAttributeRoutingPolicybug fixesProject-scoped traffic-split, fallback-chain and attribute routing policies now create and update successfully when no tag selector is supplied.
UpsertFallbackPolicybug fixesA fallback or traffic-split policy write with a missing or unrecognised target_scope_type now explains that unknown JSON names are ignored and names the target id fields to check. A project-routed PROJECT-scope write with no target_project_id now returns INVALID_ARGUMENT naming the field, instead of PERMISSION_DENIED.
CreateFallbackChainPolicybug fixesA fallback or traffic-split policy write with a missing or unrecognised target_scope_type now explains that unknown JSON names are ignored and names the target id fields to check. A project-routed PROJECT-scope write with no target_project_id now returns INVALID_ARGUMENT naming the field, instead of PERMISSION_DENIED.
UpdateFallbackChainPolicybug fixesA fallback or traffic-split policy write with a missing or unrecognised target_scope_type now explains that unknown JSON names are ignored and names the target id fields to check. A project-routed PROJECT-scope write with no target_project_id now returns INVALID_ARGUMENT naming the field, instead of PERMISSION_DENIED.
CreateTrafficSplitPolicybug fixesA fallback or traffic-split policy write with a missing or unrecognised target_scope_type now explains that unknown JSON names are ignored and names the target id fields to check. A project-routed PROJECT-scope write with no target_project_id now returns INVALID_ARGUMENT naming the field, instead of PERMISSION_DENIED.
UpdateTrafficSplitPolicybug fixesA fallback or traffic-split policy write with a missing or unrecognised target_scope_type now explains that unknown JSON names are ignored and names the target id fields to check. A project-routed PROJECT-scope write with no target_project_id now returns INVALID_ARGUMENT naming the field, instead of PERMISSION_DENIED.
GetEffectivePolicybug fixesThe effective fallback-policy view now merges fallback entries per protected model across scopes and folds bound allow-lists over the merged set, matching what the data plane enforces. A protected model inherited from a broader scope is no longer hidden when a bound policy exists, and each entry reports the policy that supplied it.
ListFallbackChainPoliciesbug fixesDeleting a project now also deletes its project fallback overrides, so a project created later with the same ID starts with none. The upgrade removes overrides left behind by projects deleted earlier, unless a new project already uses the same ID: that project keeps them, and an admin who doesn't want them removes them on the Fallback page.

RbacService

OperationKindChange
ListRolesbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
CreateRolebehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
UpdateRolebehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
DeleteRolebehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
ListBindingsbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
CreateBindingbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
UpdateBindingbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
DeleteBindingbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
ListGroupsbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
CreateGroupbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
ListGroupMembersbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
AddGroupMemberbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
RemoveGroupMemberbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
GetTeamAccessGroupbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
EnsureTeamAccessGroupbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
DeleteTeamAccessGroupbehaviour changesOrganization API keys can now manage roles, role assignments, groups and Team access groups through the management API, and existing admin keys get this without being reissued. A key can grant only permissions it holds, only in its own organization; keys limited to one project, and granting or revoking super administrators, still need a signed-in user.
ListRolesbug fixesGET /api/rbac/roles?includeApiScope=true also lists the roles an API key can hold, such as api_audit_logs_reader, so an administrator can see which scopes exist. A key gets one of these roles through its scopes, not through a role binding.

v0.5.1

No API operations changed in this release.

v0.5.0

AdminService

OperationKindChange
QueryAuditLogsbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
GetAuditLogbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
QueryAuditLogsbehaviour changesAudit entries from the management plane's services now record the call that produced them -- source_ip, user_agent, http_method and endpoint -- and name the user an action was performed on under the subject_user_id metadata key. Key lifecycle entries use one vocabulary: ISSUE_MY_KEY, REVOKE_MY_KEY, ROTATE_CLIENT_KEY, UPDATE_API_KEY and DELETE_API_KEY, with resource_type api_key and actor_type USER or SERVICE.
QueryPlatformAuditLogsbehaviour changesAudit entries from the management plane's services now record the call that produced them -- source_ip, user_agent, http_method and endpoint -- and name the user an action was performed on under the subject_user_id metadata key. Key lifecycle entries use one vocabulary: ISSUE_MY_KEY, REVOKE_MY_KEY, ROTATE_CLIENT_KEY, UPDATE_API_KEY and DELETE_API_KEY, with resource_type api_key and actor_type USER or SERVICE.
QueryAuditLogsnew featuresQueryAuditLogs and QueryPlatformAuditLogs accept subject_user_id, which selects the entries where a user was acted upon rather than the entries they performed themselves. An admin minting a key for a service identity is now findable from either side: user_id names the admin, subject_user_id names the identity.
QueryPlatformAuditLogsnew featuresQueryAuditLogs and QueryPlatformAuditLogs accept subject_user_id, which selects the entries where a user was acted upon rather than the entries they performed themselves. An admin minting a key for a service identity is now findable from either side: user_id names the admin, subject_user_id names the identity.
RecordCatalogSyncnew featuresThe catalog API can now record and read a management plane's catalog sync state: which published catalog version it last read, which one it is actually on, when each happened and who ran it. The same pair is on the admin API, so a scheduled job authenticating with a plane's admin key writes the same record an operator's own run does.
GetCatalogSyncStatenew featuresThe catalog API can now record and read a management plane's catalog sync state: which published catalog version it last read, which one it is actually on, when each happened and who ran it. The same pair is on the admin API, so a scheduled job authenticating with a plane's admin key writes the same record an operator's own run does.
UpsertCatalogProvidernew featuresCatalog audit entries now say whether a write came from a batch. A sync run's several hundred UPSERT rows carry batched: true in their metadata and interactive edits carry batched: false, so the audit view can be filtered to just the changes a person made.
UpsertCatalogModelnew featuresCatalog audit entries now say whether a write came from a batch. A sync run's several hundred UPSERT rows carry batched: true in their metadata and interactive edits carry batched: false, so the audit view can be filtered to just the changes a person made.
QueryAuditLogsbug fixesScoped management API keys can now reach audit-log and metrics operations without organization or project fields. The handler applies the relevant workspace, organization or platform boundary for each operation.
GetAuditLogbug fixesScoped management API keys can now reach audit-log and metrics operations without organization or project fields. The handler applies the relevant workspace, organization or platform boundary for each operation.

CatalogService

OperationKindChange
RecordCatalogSyncnew featuresThe catalog API can now record and read a management plane's catalog sync state: which published catalog version it last read, which one it is actually on, when each happened and who ran it. The same pair is on the admin API, so a scheduled job authenticating with a plane's admin key writes the same record an operator's own run does.
GetCatalogSyncStatenew featuresThe catalog API can now record and read a management plane's catalog sync state: which published catalog version it last read, which one it is actually on, when each happened and who ran it. The same pair is on the admin API, so a scheduled job authenticating with a plane's admin key writes the same record an operator's own run does.
UpsertProvidernew featuresCatalog audit entries now say whether a write came from a batch. A sync run's several hundred UPSERT rows carry batched: true in their metadata and interactive edits carry batched: false, so the audit view can be filtered to just the changes a person made.
UpsertModelnew featuresCatalog audit entries now say whether a write came from a batch. A sync run's several hundred UPSERT rows carry batched: true in their metadata and interactive edits carry batched: false, so the audit view can be filtered to just the changes a person made.

CustomerRequestLogsService

OperationKindChange
GetCustomerRequestLogStatsbug fixesRequest log stats now report the full billed amount. The group cost left out per-image generation cost, so a group of image generation traffic could read 0.00 while those requests were billed. The response-level total cost was never populated and was always empty. Both now count every cost component, so figures for image-heavy workloads rise to the amount that was always charged.
ListCustomerRequestLogsdeprecationsThe microdollar cost fields are deprecated. They have always returned 0, because nothing ever wrote them, and the decimal string fields carry the real amount at full precision. Read total_cost for one request, or cost for a stats group. The fields stay in the API and keep returning 0.
GetCustomerRequestLogdeprecationsThe microdollar cost fields are deprecated. They have always returned 0, because nothing ever wrote them, and the decimal string fields carry the real amount at full precision. Read total_cost for one request, or cost for a stats group. The fields stay in the API and keep returning 0.
GetCustomerRequestLogStatsdeprecationsThe microdollar cost fields are deprecated. They have always returned 0, because nothing ever wrote them, and the decimal string fields carry the real amount at full precision. Read total_cost for one request, or cost for a stats group. The fields stay in the API and keep returning 0.

GuardrailProvidersService

OperationKindChange
CreateGuardrailProviderbehaviour changesCreating or updating an externalservice guardrail provider now rejects, with INVALID_ARGUMENT, a config the data plane could not use: an unknown key or non-string value, a service_url that is not an absolute http or https URL or names a link-local or metadata address, a blank endpoint or one without a leading slash, a blank timeout or one outside 0-30s, or a ca_cert_pem over 8 KiB, over four certificates or holding anything else. Its rules need a raw.threshold above 0 and at most 1.
UpdateGuardrailProviderbehaviour changesCreating or updating an externalservice guardrail provider now rejects, with INVALID_ARGUMENT, a config the data plane could not use: an unknown key or non-string value, a service_url that is not an absolute http or https URL or names a link-local or metadata address, a blank endpoint or one without a leading slash, a blank timeout or one outside 0-30s, or a ca_cert_pem over 8 KiB, over four certificates or holding anything else. Its rules need a raw.threshold above 0 and at most 1.
CreateGuardrailProvidersecurity updatesCreating or updating a guardrail provider now rejects the config key api_key_file, and the credential keys api_key and auth_token, under any spelling, with INVALID_ARGUMENT. A stored api_key_file is no longer delivered to the data plane: the management plane sets that key itself, so a caller could otherwise choose which credential file a provider reads.
UpdateGuardrailProvidersecurity updatesCreating or updating a guardrail provider now rejects the config key api_key_file, and the credential keys api_key and auth_token, under any spelling, with INVALID_ARGUMENT. A stored api_key_file is no longer delivered to the data plane: the management plane sets that key itself, so a caller could otherwise choose which credential file a provider reads.
CreateGuardrailProvidernew featurestare api guardrails providers create and update take the provider as --provider, a JSON object in the API's shape, so a guardrail provider can be registered and enabled from the CLI. The flag is required.
UpdateGuardrailProvidernew featurestare api guardrails providers create and update take the provider as --provider, a JSON object in the API's shape, so a guardrail provider can be registered and enabled from the CLI. The flag is required.

GuardrailsService

OperationKindChange
CreateGuardrailRulebehaviour changesCreating or updating an externalservice guardrail provider now rejects, with INVALID_ARGUMENT, a config the data plane could not use: an unknown key or non-string value, a service_url that is not an absolute http or https URL or names a link-local or metadata address, a blank endpoint or one without a leading slash, a blank timeout or one outside 0-30s, or a ca_cert_pem over 8 KiB, over four certificates or holding anything else. Its rules need a raw.threshold above 0 and at most 1.
UpdateGuardrailRulebehaviour changesCreating or updating an externalservice guardrail provider now rejects, with INVALID_ARGUMENT, a config the data plane could not use: an unknown key or non-string value, a service_url that is not an absolute http or https URL or names a link-local or metadata address, a blank endpoint or one without a leading slash, a blank timeout or one outside 0-30s, or a ca_cert_pem over 8 KiB, over four certificates or holding anything else. Its rules need a raw.threshold above 0 and at most 1.
CreateGuardrailRulebehaviour changesCreating or updating a guardrail rule with the externalService configuration variant now fails with INVALID_ARGUMENT for every provider kind. A stored rule that still carries the variant stays readable and editable as long as the write does not send it back.
UpdateGuardrailRulebehaviour changesCreating or updating a guardrail rule with the externalService configuration variant now fails with INVALID_ARGUMENT for every provider kind. A stored rule that still carries the variant stays readable and editable as long as the write does not send it back.
CreateGuardrailRuledeprecationsThe externalService variant of a guardrail rule's configuration is deprecated: nothing reads it, and its headers were never sent as HTTP headers. Connection settings and the credential live on the provider; per-check parameters go in the rule's raw configuration, where threshold is the one reserved key.
UpdateGuardrailRuledeprecationsThe externalService variant of a guardrail rule's configuration is deprecated: nothing reads it, and its headers were never sent as HTTP headers. Connection settings and the credential live on the provider; per-check parameters go in the rule's raw configuration, where threshold is the one reserved key.

IdentityService

OperationKindChange
GetUserbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
ListUsersbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
SearchUsersbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
GetUserStatsbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
CreateOrUpdateSSOProvidernew featuresCorporate SSO can now be registered and used through the management API. Administrators holding sso_providers permissions can create, read and delete the OIDC provider, a sign-in page can ask whether corporate login is available before anyone signs in, and a browser can complete a corporate login against the management API itself. Set SSO_CALLBACK_BASE_URL to the management API's public origin to enable the browser flow.
ListSSOProvidersnew featuresCorporate SSO can now be registered and used through the management API. Administrators holding sso_providers permissions can create, read and delete the OIDC provider, a sign-in page can ask whether corporate login is available before anyone signs in, and a browser can complete a corporate login against the management API itself. Set SSO_CALLBACK_BASE_URL to the management API's public origin to enable the browser flow.
GetSSOProvidernew featuresCorporate SSO can now be registered and used through the management API. Administrators holding sso_providers permissions can create, read and delete the OIDC provider, a sign-in page can ask whether corporate login is available before anyone signs in, and a browser can complete a corporate login against the management API itself. Set SSO_CALLBACK_BASE_URL to the management API's public origin to enable the browser flow.
DeleteSSOProvidernew featuresCorporate SSO can now be registered and used through the management API. Administrators holding sso_providers permissions can create, read and delete the OIDC provider, a sign-in page can ask whether corporate login is available before anyone signs in, and a browser can complete a corporate login against the management API itself. Set SSO_CALLBACK_BASE_URL to the management API's public origin to enable the browser flow.
CreateOrUpdateSSOProvidernew featuresCorporate SSO now supports SAML 2.0 as well as OIDC. Register the IdP entity id, sign-on URL and signing certificate, then import the service provider metadata the management API publishes for that provider. Encrypted assertions and IdP-initiated sign-in are not supported.
GetUsernew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
ListUsersnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
SearchUsersnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
RevokeUserSessionsnew featuresAdministrators can sign a user out of every session through the management plane API, for example after lowering their role. The user's API keys keep working and the account is not banned. It needs the same users.edit permission as banning a user, and only a signed-in administrator can call it, not an API key.

McpOAuthClientsService

OperationKindChange
CreateMcpOAuthClientnew featuresYou can now register and connect an MCP server whose OAuth provider issues public clients, which have no client secret.
UpdateMcpOAuthClientnew featuresYou can now register and connect an MCP server whose OAuth provider issues public clients, which have no client secret.

MeService

OperationKindChange
GetSSOProviderStatusnew featuresCorporate SSO can now be registered and used through the management API. Administrators holding sso_providers permissions can create, read and delete the OIDC provider, a sign-in page can ask whether corporate login is available before anyone signs in, and a browser can complete a corporate login against the management API itself. Set SSO_CALLBACK_BASE_URL to the management API's public origin to enable the browser flow.
StartSSOLoginnew featuresCorporate SSO can now be registered and used through the management API. Administrators holding sso_providers permissions can create, read and delete the OIDC provider, a sign-in page can ask whether corporate login is available before anyone signs in, and a browser can complete a corporate login against the management API itself. Set SSO_CALLBACK_BASE_URL to the management API's public origin to enable the browser flow.
StartSSOLoginnew featuresCorporate SSO now supports SAML 2.0 as well as OIDC. Register the IdP entity id, sign-on URL and signing certificate, then import the service provider metadata the management API publishes for that provider. Encrypted assertions and IdP-initiated sign-in are not supported.
StartSocialLoginnew featuresGoogle and GitHub sign-in can now be served by the management API. Set the provider's client id and secret to offer it; a provider missing either one is not offered. A Google or GitHub account whose email address the provider has not verified cannot sign in.
ListSocialProvidersnew featuresGoogle and GitHub sign-in can now be served by the management API. Set the provider's client id and secret to offer it; a provider missing either one is not offered. A Google or GitHub account whose email address the provider has not verified cannot sign in.
SignInWithPasswordnew featuresThe management plane now serves password sign-in, reset, and change directly, using the same password format as the auth service. The surface stays off until ENABLE_PASSWORD_AUTH is true with corporate login off; reset mail also needs SMTP_HOST, and without it no reset links are issued.
RequestPasswordResetnew featuresThe management plane now serves password sign-in, reset, and change directly, using the same password format as the auth service. The surface stays off until ENABLE_PASSWORD_AUTH is true with corporate login off; reset mail also needs SMTP_HOST, and without it no reset links are issued.
ResetPasswordnew featuresThe management plane now serves password sign-in, reset, and change directly, using the same password format as the auth service. The surface stays off until ENABLE_PASSWORD_AUTH is true with corporate login off; reset mail also needs SMTP_HOST, and without it no reset links are issued.
ChangePasswordnew featuresThe management plane now serves password sign-in, reset, and change directly, using the same password format as the auth service. The surface stays off until ENABLE_PASSWORD_AUTH is true with corporate login off; reset mail also needs SMTP_HOST, and without it no reset links are issued.
SignUpWithPasswordnew featuresSelf-serve sign-up now works against the management plane: confirm the emailed link once to verify and sign in (a second open does not mint another session). Where a challenge is configured, sign-up and sign-in ask for it; an unreachable challenge service blocks sign-up but lets sign-in continue. Needs ENABLE_PASSWORD_AUTH with corporate login off, and SMTP_HOST; sign-up itself stays off unless turned on.
SendVerificationEmailnew featuresSelf-serve sign-up now works against the management plane: confirm the emailed link once to verify and sign in (a second open does not mint another session). Where a challenge is configured, sign-up and sign-in ask for it; an unreachable challenge service blocks sign-up but lets sign-in continue. Needs ENABLE_PASSWORD_AUTH with corporate login off, and SMTP_HOST; sign-up itself stays off unless turned on.
VerifyEmailnew featuresSelf-serve sign-up now works against the management plane: confirm the emailed link once to verify and sign in (a second open does not mint another session). Where a challenge is configured, sign-up and sign-in ask for it; an unreachable challenge service blocks sign-up but lets sign-in continue. Needs ENABLE_PASSWORD_AUTH with corporate login off, and SMTP_HOST; sign-up itself stays off unless turned on.
CreateUsernew featuresSelf-serve sign-up now works against the management plane: confirm the emailed link once to verify and sign in (a second open does not mint another session). Where a challenge is configured, sign-up and sign-in ask for it; an unreachable challenge service blocks sign-up but lets sign-in continue. Needs ENABLE_PASSWORD_AUTH with corporate login off, and SMTP_HOST; sign-up itself stays off unless turned on.
UpdateMenew featuresSigned-in users can change their own display name through the management plane API. Only the name can be changed this way, and the call needs a browser or CLI sign-in rather than an API key.
ResolveMyPermissionsnew featuresThe management plane now serves the RBAC read surface directly: a caller can resolve their own permissions at an organization or project, list the project ids they can reach, and read the deployment's permission catalog. These answer from the same bindings the platform already enforces against, so what the API reports and what a request is allowed to do cannot drift apart. Nothing changes for existing callers yet -- the console continues to use the auth service until it is moved over.
ListMyReachableProjectsnew featuresThe management plane now serves the RBAC read surface directly: a caller can resolve their own permissions at an organization or project, list the project ids they can reach, and read the deployment's permission catalog. These answer from the same bindings the platform already enforces against, so what the API reports and what a request is allowed to do cannot drift apart. Nothing changes for existing callers yet -- the console continues to use the auth service until it is moved over.
GetPermissionCatalognew featuresThe management plane now serves the RBAC read surface directly: a caller can resolve their own permissions at an organization or project, list the project ids they can reach, and read the deployment's permission catalog. These answer from the same bindings the platform already enforces against, so what the API reports and what a request is allowed to do cannot drift apart. Nothing changes for existing callers yet -- the console continues to use the auth service until it is moved over.
GetMenew featuresGetMe now returns session claims to a signed-in browser session: the caller's organization-level permission set and whether the deployment has an administrator. A console reading its session from the management plane gets the same permission view the auth service provides today, including the difference between "no access" and "could not tell". Callers using an API key see no change.

MetricsService

OperationKindChange
GetMetricbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
GetRawMetricbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
ListMetricsbehaviour changesReaching a fleet-wide operation now requires an explicit platform binding for a caller that does not hold the admin scope. A management API key that reached one of these operations on a coarse scope alone, such as read or metrics_reader, is refused after this upgrade.
GetMetricbug fixesScoped management API keys can now reach audit-log and metrics operations without organization or project fields. The handler applies the relevant workspace, organization or platform boundary for each operation.
GetRawMetricbug fixesScoped management API keys can now reach audit-log and metrics operations without organization or project fields. The handler applies the relevant workspace, organization or platform boundary for each operation.
ListMetricsbug fixesScoped management API keys can now reach audit-log and metrics operations without organization or project fields. The handler applies the relevant workspace, organization or platform boundary for each operation.

PatternsService

OperationKindChange
ListPatternsbehaviour changesListing and reading guardrail patterns now requires the guardrail_patterns.read permission or a scope that grants guardrail reads. Keys with the read, write, admin, guardrails_reader or guardrails_admin scope keep access, as do the Super Admin and Viewer roles and anyone who can open the Admin Console's Patterns page today. A key scoped to an unrelated area, or a custom role with neither, now gets a permission error.
GetPatternbehaviour changesListing and reading guardrail patterns now requires the guardrail_patterns.read permission or a scope that grants guardrail reads. Keys with the read, write, admin, guardrails_reader or guardrails_admin scope keep access, as do the Super Admin and Viewer roles and anyone who can open the Admin Console's Patterns page today. A key scoped to an unrelated area, or a custom role with neither, now gets a permission error.

PolicyService

OperationKindChange
DeleteUserGroupbehaviour changesDeleteUserGroup now refuses with FailedPrecondition while the team still has members or is the target of an active budget policy. Previously, deleting a team with members failed with an internal error; deleting a team without members also deleted its budget policies.
ListUserGroupsbehaviour changesListUserGroups now returns InvalidArgument for a non-empty page.filter or an unsupported page.order_by instead of silently ignoring them.
ListRequestAttributesbehaviour changesListRequestAttributes now accepts an optional search, returns unfiltered catalog stats, supports sorting by name, value_type or referencing_policy_count, and rejects unsupported page.filter or page.order_by values with InvalidArgument instead of ignoring them.
GetEffectivePolicynew featuresPolicyService can explain which attribute-routing policy governs a key or tag preview. It returns the enabled winner, ordered rules and precedence details, and reports how many eligible keys are covered. These views require the attribute_routing_policies.read permission.
GetPolicyCoveragenew featuresPolicyService can explain which attribute-routing policy governs a key or tag preview. It returns the enabled winner, ordered rules and precedence details, and reports how many eligible keys are covered. These views require the attribute_routing_policies.read permission.
GetUserGroupnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
ListUserGroupsnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
UpdateUserGroupnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
ListUserGroupMembersnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
AddUserGroupMembersnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
RemoveUserGroupMembersnew featuresTeams can now be managed end to end through PolicyService instead of the console's own database. AddUserGroupMembers and RemoveUserGroupMembers move users in and out of a team (a user already in another team of the same organization is moved, and the response names the team they left), ListUserGroupMembers pages a team's members with a name or email search and name or recently-added order, and every read of a team carries its member count and the first five members. ListUserGroups can filter by whether a team has members, search descriptions, sort by name, member count, created or updated time, and report how many teams have members. UpdateUserGroup can clear a description with clear_description. A member's email, avatar and ban flag are returned only to credentials that hold users_reader and only for members inside the caller's directory boundary; otherwise callers see ids and names. Email search follows the same scope and per-member boundary rules. Directory reads hide team IDs outside the caller's organization boundary; team filters and counts use the same visible membership.
CreateFallbackChainPolicynew featuresFallback policies can now define independent ordered fallback entries for each model, so requests fail over through the configured providers in the order specified. UpsertFallbackPolicy replaces the full set of entries for an organization, project, or API-key target in one idempotent call: omitted models are removed and an empty set deactivates the target. Existing policy clients using the flat chain representation remain compatible.
GetFallbackChainPolicynew featuresFallback policies can now define independent ordered fallback entries for each model, so requests fail over through the configured providers in the order specified. UpsertFallbackPolicy replaces the full set of entries for an organization, project, or API-key target in one idempotent call: omitted models are removed and an empty set deactivates the target. Existing policy clients using the flat chain representation remain compatible.
UpdateFallbackChainPolicynew featuresFallback policies can now define independent ordered fallback entries for each model, so requests fail over through the configured providers in the order specified. UpsertFallbackPolicy replaces the full set of entries for an organization, project, or API-key target in one idempotent call: omitted models are removed and an empty set deactivates the target. Existing policy clients using the flat chain representation remain compatible.
UpsertFallbackPolicynew featuresFallback policies can now define independent ordered fallback entries for each model, so requests fail over through the configured providers in the order specified. UpsertFallbackPolicy replaces the full set of entries for an organization, project, or API-key target in one idempotent call: omitted models are removed and an empty set deactivates the target. Existing policy clients using the flat chain representation remain compatible.
ListPoliciesnew featuresThe unified policy list now includes attribute-routing policies alongside the budget, rate-limit, fallback-chain and traffic-split rows, naming each policy's target, effective project, and monitor or enforce mode, and appearing only where the caller could read it directly. For these rows match_count counts the eligible keys for which the policy is the enabled winner; a paused policy reports zero.
UpsertFallbackPolicybug fixesFallback policies now keep independent ordered entries for each protected model and resolve project and organization policies, plus API-key policies, in the documented precedence order. Full-set updates converge on replay, remove omitted entries, and treat an explicit empty set as a deactivated override while preserving legacy fallback-chain aliases.

RbacService

OperationKindChange
ListRolesnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
CreateRolenew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
UpdateRolenew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
DeleteRolenew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
ListBindingsnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
CreateBindingnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
UpdateBindingnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
DeleteBindingnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
ListGroupsnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
CreateGroupnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
ListGroupMembersnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
AddGroupMembernew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
RemoveGroupMembernew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
GetTeamAccessGroupnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
EnsureTeamAccessGroupnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
DeleteTeamAccessGroupnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
GrantSuperAdminnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.
RevokeSuperAdminnew featuresAdministrators can now manage RBAC roles, bindings, groups, Team access groups, and super administrators through the management plane API. The API prevents callers from granting permissions they do not hold and protects the final project owner and final super administrator.

RequestLogsService

OperationKindChange
GetRequestLogStatsbug fixesRequest log stats now report the full billed amount. The group cost left out per-image generation cost, so a group of image generation traffic could read 0.00 while those requests were billed. The response-level total cost was never populated and was always empty. Both now count every cost component, so figures for image-heavy workloads rise to the amount that was always charged.
QueryRequestLogsdeprecationsThe microdollar cost fields are deprecated. They have always returned 0, because nothing ever wrote them, and the decimal string fields carry the real amount at full precision. Read total_cost for one request, or cost for a stats group. The fields stay in the API and keep returning 0.
GetRequestLogdeprecationsThe microdollar cost fields are deprecated. They have always returned 0, because nothing ever wrote them, and the decimal string fields carry the real amount at full precision. Read total_cost for one request, or cost for a stats group. The fields stay in the API and keep returning 0.
GetRequestLogStatsdeprecationsThe microdollar cost fields are deprecated. They have always returned 0, because nothing ever wrote them, and the decimal string fields carry the real amount at full precision. Read total_cost for one request, or cost for a stats group. The fields stay in the API and keep returning 0.

v0.4.1

No API operations changed in this release.

v0.4.0

AdminService

OperationKindChange
SetWorkspaceURLsecurity updatesClaiming a hostname that is already in use no longer exposes details about the existing configuration. The conflict message now says only that the hostname is in use, preventing a rejected claim from revealing information about another organization's resources.
SetDataplaneURLsecurity updatesClaiming a hostname that is already in use no longer exposes details about the existing configuration. The conflict message now says only that the hostname is in use, preventing a rejected claim from revealing information about another organization's resources.
CreateProjectGatewaysecurity updatesClaiming a hostname that is already in use no longer exposes details about the existing configuration. The conflict message now says only that the hostname is in use, preventing a rejected claim from revealing information about another organization's resources.
UpdateProjectGatewaysecurity updatesClaiming a hostname that is already in use no longer exposes details about the existing configuration. The conflict message now says only that the hostname is in use, preventing a rejected claim from revealing information about another organization's resources.
SetProjectGatewayURLsecurity updatesClaiming a hostname that is already in use no longer exposes details about the existing configuration. The conflict message now says only that the hostname is in use, preventing a rejected claim from revealing information about another organization's resources.
CreateUserTokenbug fixesCreating or rotating a routing key through the API saves the key and its client membership together. If membership setup fails, no partial key or client records remain. Newly created standalone routing keys also appear in the client list; those created directly through the token API have no client title.

ClientsService

OperationKindChange
CreateClientWithKeybug fixesCreating or rotating a routing key through the API saves the key and its client membership together. If membership setup fails, no partial key or client records remain. Newly created standalone routing keys also appear in the client list; those created directly through the token API have no client title.
RotateKeyInClientbug fixesCreating or rotating a routing key through the API saves the key and its client membership together. If membership setup fails, no partial key or client records remain. Newly created standalone routing keys also appear in the client list; those created directly through the token API have no client title.

GuardrailProvidersService

OperationKindChange
CreateGuardrailProviderbehaviour changesA guardrail provider's credential is no longer accepted in its configuration. Creating or updating a provider with an Azure AI Content Safety "api_key", or an external service's "auth_token", inside the configuration now fails with an error naming the new SetGuardrailProviderSecret operation, which is the only way a credential enters. The credential is stored encrypted, the provider keeps only a reference to it, no read returns it -- providers now report whether one is stored, not what it is -- and calling the operation again rotates the credential in place. Providers created before this release keep working and stay editable: their credential no longer appears in any API response, and editing such a provider preserves it rather than dropping it, so it can only be replaced through SetGuardrailProviderSecret. Deleting a provider, or its project, destroys the credential with it.
UpdateGuardrailProviderbehaviour changesA guardrail provider's credential is no longer accepted in its configuration. Creating or updating a provider with an Azure AI Content Safety "api_key", or an external service's "auth_token", inside the configuration now fails with an error naming the new SetGuardrailProviderSecret operation, which is the only way a credential enters. The credential is stored encrypted, the provider keeps only a reference to it, no read returns it -- providers now report whether one is stored, not what it is -- and calling the operation again rotates the credential in place. Providers created before this release keep working and stay editable: their credential no longer appears in any API response, and editing such a provider preserves it rather than dropping it, so it can only be replaced through SetGuardrailProviderSecret. Deleting a provider, or its project, destroys the credential with it.
ListGuardrailProvidersbehaviour changesA guardrail provider's credential is no longer accepted in its configuration. Creating or updating a provider with an Azure AI Content Safety "api_key", or an external service's "auth_token", inside the configuration now fails with an error naming the new SetGuardrailProviderSecret operation, which is the only way a credential enters. The credential is stored encrypted, the provider keeps only a reference to it, no read returns it -- providers now report whether one is stored, not what it is -- and calling the operation again rotates the credential in place. Providers created before this release keep working and stay editable: their credential no longer appears in any API response, and editing such a provider preserves it rather than dropping it, so it can only be replaced through SetGuardrailProviderSecret. Deleting a provider, or its project, destroys the credential with it.
GetGuardrailProviderbehaviour changesA guardrail provider's credential is no longer accepted in its configuration. Creating or updating a provider with an Azure AI Content Safety "api_key", or an external service's "auth_token", inside the configuration now fails with an error naming the new SetGuardrailProviderSecret operation, which is the only way a credential enters. The credential is stored encrypted, the provider keeps only a reference to it, no read returns it -- providers now report whether one is stored, not what it is -- and calling the operation again rotates the credential in place. Providers created before this release keep working and stay editable: their credential no longer appears in any API response, and editing such a provider preserves it rather than dropping it, so it can only be replaced through SetGuardrailProviderSecret. Deleting a provider, or its project, destroys the credential with it.
DeleteGuardrailProviderbehaviour changesA guardrail provider's credential is no longer accepted in its configuration. Creating or updating a provider with an Azure AI Content Safety "api_key", or an external service's "auth_token", inside the configuration now fails with an error naming the new SetGuardrailProviderSecret operation, which is the only way a credential enters. The credential is stored encrypted, the provider keeps only a reference to it, no read returns it -- providers now report whether one is stored, not what it is -- and calling the operation again rotates the credential in place. Providers created before this release keep working and stay editable: their credential no longer appears in any API response, and editing such a provider preserves it rather than dropping it, so it can only be replaced through SetGuardrailProviderSecret. Deleting a provider, or its project, destroys the credential with it.
SetGuardrailProviderSecretbehaviour changesA guardrail provider's credential is no longer accepted in its configuration. Creating or updating a provider with an Azure AI Content Safety "api_key", or an external service's "auth_token", inside the configuration now fails with an error naming the new SetGuardrailProviderSecret operation, which is the only way a credential enters. The credential is stored encrypted, the provider keeps only a reference to it, no read returns it -- providers now report whether one is stored, not what it is -- and calling the operation again rotates the credential in place. Providers created before this release keep working and stay editable: their credential no longer appears in any API response, and editing such a provider preserves it rather than dropping it, so it can only be replaced through SetGuardrailProviderSecret. Deleting a provider, or its project, destroys the credential with it.
ListGuardrailProvidersbehaviour changesListing and reading guardrail providers now requires either the "guardrail_providers.read" permission or a scope that grants guardrail reads, bringing provider reads into the same permission domain as the writes. Management API keys carrying the read, write, admin, guardrails_reader or guardrails_admin scope keep their access with no action needed, as do the Super Admin and Viewer roles and every console session. A key scoped only to an unrelated area -- audit logs, for example -- and any custom role that grants neither the new permission nor a guardrail read scope will now receive a permission error where a provider list or lookup previously succeeded. To restore access, add "guardrail_providers.read" to the custom role, or issue the key with a scope that includes guardrail reads.
GetGuardrailProviderbehaviour changesListing and reading guardrail providers now requires either the "guardrail_providers.read" permission or a scope that grants guardrail reads, bringing provider reads into the same permission domain as the writes. Management API keys carrying the read, write, admin, guardrails_reader or guardrails_admin scope keep their access with no action needed, as do the Super Admin and Viewer roles and every console session. A key scoped only to an unrelated area -- audit logs, for example -- and any custom role that grants neither the new permission nor a guardrail read scope will now receive a permission error where a provider list or lookup previously succeeded. To restore access, add "guardrail_providers.read" to the custom role, or issue the key with a scope that includes guardrail reads.
ListGuardrailProviderssecurity updatesA management API key scoped to an unrelated area can no longer enumerate a project's guardrail providers. Listing and reading providers required no permission and no scope at all, so any credential valid for the project could read every provider registered in it -- names, kinds and endpoints -- even though changing one had been restricted to administrators. Both operations are now gated. Callers holding a guardrail read scope are unaffected, which includes every console session, so this narrows the credentials that can reach provider configuration rather than closing the read to everyone without an explicit grant. No CVE; required a credential already valid for the project.
GetGuardrailProvidersecurity updatesA management API key scoped to an unrelated area can no longer enumerate a project's guardrail providers. Listing and reading providers required no permission and no scope at all, so any credential valid for the project could read every provider registered in it -- names, kinds and endpoints -- even though changing one had been restricted to administrators. Both operations are now gated. Callers holding a guardrail read scope are unaffected, which includes every console session, so this narrows the credentials that can reach provider configuration rather than closing the read to everyone without an explicit grant. No CVE; required a credential already valid for the project.
CreateGuardrailProvidernew featuresCreating or updating a guardrail provider now fails with a clear message when the provider could never run: an Azure AI Content Safety provider must carry an endpoint that is an absolute http(s) URL, alongside the existing checks on provider kind and on an external service's declared checks. Such a provider used to be saved and shipped, and then quietly skipped by the gateway, so every rule bound to it stopped enforcing with nothing to see. Existing providers are untouched: only a write that actually changes the configuration is checked, so renaming or disabling one still works even if its stored configuration would not pass.
UpdateGuardrailProvidernew featuresCreating or updating a guardrail provider now fails with a clear message when the provider could never run: an Azure AI Content Safety provider must carry an endpoint that is an absolute http(s) URL, alongside the existing checks on provider kind and on an external service's declared checks. Such a provider used to be saved and shipped, and then quietly skipped by the gateway, so every rule bound to it stopped enforcing with nothing to see. Existing providers are untouched: only a write that actually changes the configuration is checked, so renaming or disabling one still works even if its stored configuration would not pass.

GuardrailsService

OperationKindChange
CreateGuardrailRulebehaviour changesEditing a guardrail rule that is bound to a provider outside its own project is now refused. The rule keeps enforcing and reading it is unaffected, but any update that touches its provider, check type or configuration fails until the rule is repointed at a provider its own project owns -- which can be done in the same update call. Only rules the guardrail-provider ownership migration reports as still bound outside their project are affected; it names the count in a notice reading "N non-template rule(s) remain bound outside their own project".
UpdateGuardrailRulebehaviour changesEditing a guardrail rule that is bound to a provider outside its own project is now refused. The rule keeps enforcing and reading it is unaffected, but any update that touches its provider, check type or configuration fails until the rule is repointed at a provider its own project owns -- which can be done in the same update call. Only rules the guardrail-provider ownership migration reports as still bound outside their project are affected; it names the count in a notice reading "N non-template rule(s) remain bound outside their own project".
CreateGuardrailRulesecurity updatesA guardrail rule can now be bound only to a provider its own project owns. A caller who knew another project's provider id could previously point a rule at it and send that project's traffic through another project's provider and credential, because the binding check asked only whether the provider existed and was usable, never who owned it. The refusal reads the same whether the id names another project's provider, a catalog template or nothing at all, so it cannot be used to discover which provider ids exist. Rules that already reference a provider in their own project are unaffected. No CVE; requires a caller authorized to write guardrails in some project.

Rules written before this release are NOT rewritten, and any that the upgrade left bound outside their own project keep enforcing -- and keep exporting the other project's provider configuration, its endpoint and credential reference included, into the referencing project's data-plane configuration. The upgrade reports how many such rules remain: the guardrail-provider ownership migration raises a notice reading "N non-template rule(s) remain bound outside their own project". Repoint each of them at a provider its own project owns; until you do, the next edit to the rule's provider, check type or configuration is refused. | | UpdateGuardrailRule | security updates | A guardrail rule can now be bound only to a provider its own project owns. A caller who knew another project's provider id could previously point a rule at it and send that project's traffic through another project's provider and credential, because the binding check asked only whether the provider existed and was usable, never who owned it. The refusal reads the same whether the id names another project's provider, a catalog template or nothing at all, so it cannot be used to discover which provider ids exist. Rules that already reference a provider in their own project are unaffected. No CVE; requires a caller authorized to write guardrails in some project. Rules written before this release are NOT rewritten, and any that the upgrade left bound outside their own project keep enforcing -- and keep exporting the other project's provider configuration, its endpoint and credential reference included, into the referencing project's data-plane configuration. The upgrade reports how many such rules remain: the guardrail-provider ownership migration raises a notice reading "N non-template rule(s) remain bound outside their own project". Repoint each of them at a provider its own project owns; until you do, the next edit to the rule's provider, check type or configuration is refused. |

IdentityService

OperationKindChange
BanUsernew featuresAdministrators can ban and unban a user through the management API. Banning a user signs them out everywhere and disables their API keys. Unbanning lets them sign in again, and they issue new keys -- keys removed by the ban are not restored. Both calls require an interactive session holding the admin scope or the users.edit permission, which is the same authority the delete call requires. An API key is refused even when it carries that permission.
UnbanUsernew featuresAdministrators can ban and unban a user through the management API. Banning a user signs them out everywhere and disables their API keys. Unbanning lets them sign in again, and they issue new keys -- keys removed by the ban are not restored. Both calls require an interactive session holding the admin scope or the users.edit permission, which is the same authority the delete call requires. An API key is refused even when it carries that permission.
DeleteUsernew featuresPlatform operators can soft-delete and restore user accounts over the management API. DELETE /v1/users/{user_id} marks the account deleted, revokes its API keys, and ends its sessions in one atomic operation; POST /v1/users/{user_id}/restore reverses it. The delete refuses the last active administrator of the platform or of any organization the user administers, so a deployment cannot be left unadministrable.
RestoreUsernew featuresPlatform operators can soft-delete and restore user accounts over the management API. DELETE /v1/users/{user_id} marks the account deleted, revokes its API keys, and ends its sessions in one atomic operation; POST /v1/users/{user_id}/restore reverses it. The delete refuses the last active administrator of the platform or of any organization the user administers, so a deployment cannot be left unadministrable.
SearchUsersnew featuresThe management API now serves the user directory the Admin Console reads. POST /v1/users/search returns a page of users matched on name or email substring, filtered by account status, role, team or id set, sorted on a chosen field, and POST /v1/users/stats returns the per-status counts over those same filters. A request that names no status leaves deleted users out, so the active population is what a caller sees by default. A directory user also carries its account status, ban reason and deletion time, so a console can render a deleted user in history instead of resolving nothing.
GetUserStatsnew featuresThe management API now serves the user directory the Admin Console reads. POST /v1/users/search returns a page of users matched on name or email substring, filtered by account status, role, team or id set, sorted on a chosen field, and POST /v1/users/stats returns the per-status counts over those same filters. A request that names no status leaves deleted users out, so the active population is what a caller sees by default. A directory user also carries its account status, ban reason and deletion time, so a console can render a deleted user in history instead of resolving nothing.

PolicyService

OperationKindChange
ListBudgetPoliciesbehaviour changesListing budget policies now returns INVALID_ARGUMENT for a non-empty page.filter or an unsupported page.order_by, including multiple sort fields. These inputs were previously ignored.
ListBudgetPoliciesnew featuresBudget policies can now report live billable spend and passthrough estimates, including per-member spend for teams and customer spend and near-limit, over-limit and unmeasured policy counts on list requests. Reads include target names, with user names and email addresses limited to the caller's directory permissions. Lists support target search and sorting, and inactive policies can be permanently removed. Statistics measure at most 500 active policies per request and indicate when more policies match. A failed measurement no longer discards the policy list; the response reports the number of failed measurements.
GetBudgetPolicynew featuresBudget policies can now report live billable spend and passthrough estimates, including per-member spend for teams and customer spend and near-limit, over-limit and unmeasured policy counts on list requests. Reads include target names, with user names and email addresses limited to the caller's directory permissions. Lists support target search and sorting, and inactive policies can be permanently removed. Statistics measure at most 500 active policies per request and indicate when more policies match. A failed measurement no longer discards the policy list; the response reports the number of failed measurements.
PurgeBudgetPolicynew featuresBudget policies can now report live billable spend and passthrough estimates, including per-member spend for teams and customer spend and near-limit, over-limit and unmeasured policy counts on list requests. Reads include target names, with user names and email addresses limited to the caller's directory permissions. Lists support target search and sorting, and inactive policies can be permanently removed. Statistics measure at most 500 active policies per request and indicate when more policies match. A failed measurement no longer discards the policy list; the response reports the number of failed measurements.
CreateRequestAttributenew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
GetRequestAttributenew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
ListRequestAttributesnew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
UpdateRequestAttributenew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
DeleteRequestAttributenew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
CreateAttributeRoutingPolicynew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
GetAttributeRoutingPolicynew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
ListAttributeRoutingPoliciesnew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
UpdateAttributeRoutingPolicynew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
DeleteAttributeRoutingPolicynew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
SetAttributeRoutingPolicyStatusnew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
SetAttributeRoutingPolicyModenew featuresRequest attribute catalogs and attribute-based routing policies can now be managed through the API, with separate controls for activation and monitor or enforce mode.
PurgeBudgetPolicynew featuresThe API can now permanently remove an inactive budget policy without changing the existing deactivation behavior of DELETE. Without the admin scope, purge reaches only PROJECT and API_KEY policies in the request project. Callers with the admin scope can also purge inactive policies with other scopes in their customer.
CreateBudgetPolicybug fixesCreateBudgetPolicy now accepts only the released TEAM, TEAM_PER_USER_DEFAULT, and API_KEY scopes. Existing policies in legacy scopes remain available for reads, updates, enforcement, and resolution.

v0.3.0

AdminService

OperationKindChange
UpdateProjectMembersecurity updatesA project can no longer be left with no administrator. Demoting or removing a project's last admin through the admin or tenancy member APIs is now refused with FailedPrecondition; the mutation is allowed again as soon as a second admin exists. Previously either call could strip the final admin and orphan the project, leaving no one able to manage its members. A project whose ownership is held only through a manual role grant (not a member row) is unaffected, and revoking that grant is still done separately.
RemoveProjectMembersecurity updatesA project can no longer be left with no administrator. Demoting or removing a project's last admin through the admin or tenancy member APIs is now refused with FailedPrecondition; the mutation is allowed again as soon as a second admin exists. Previously either call could strip the final admin and orphan the project, leaving no one able to manage its members. A project whose ownership is held only through a manual role grant (not a member row) is unaffected, and revoking that grant is still done separately.
CreateUserTokenbug fixesCreating an API key now schedules a budget snapshot refresh instead of waiting for the next periodic rebuild, up to five minutes by default. Exhausted budgets begin enforcing on the new key once the updated snapshot reaches the data plane. The refresh runs in the background; it does not delay key creation.

ClientsService

OperationKindChange
CreateClientWithKeybug fixesCreating an API key now schedules a budget snapshot refresh instead of waiting for the next periodic rebuild, up to five minutes by default. Exhausted budgets begin enforcing on the new key once the updated snapshot reaches the data plane. The refresh runs in the background; it does not delay key creation.
AddKeyToClientbug fixesA budget policy on a single API key now caps the client behind the key, within the key's project, instead of the key row. Rotating the key used to strand the policy on the retired key, leaving the replacement with no budget while the policy still listed as active; the budget now follows the rotation, the period's spend is summed across every key of the client in that project, and both keys of a rotation pair are governed while both are live. The client is recorded on the policy when it is written, and at most one active per-key policy per project, client and intent is allowed (one default and one bound may coexist): creating, retargeting or activating a second one on another key of the same client, or attaching an already-budgeted key to such a client, is refused. A key cannot be moved out of a client that other keys stay in while that client's budget is active; deactivate the budget first. A per-key budget can only be created on, or retargeted to, a key that belongs to the project named in the request; a key in another project is reported as not found.
RotateKeyInClientbug fixesA budget policy on a single API key now caps the client behind the key, within the key's project, instead of the key row. Rotating the key used to strand the policy on the retired key, leaving the replacement with no budget while the policy still listed as active; the budget now follows the rotation, the period's spend is summed across every key of the client in that project, and both keys of a rotation pair are governed while both are live. The client is recorded on the policy when it is written, and at most one active per-key policy per project, client and intent is allowed (one default and one bound may coexist): creating, retargeting or activating a second one on another key of the same client, or attaching an already-budgeted key to such a client, is refused. A key cannot be moved out of a client that other keys stay in while that client's budget is active; deactivate the budget first. A per-key budget can only be created on, or retargeted to, a key that belongs to the project named in the request; a key in another project is reported as not found.

PolicyService

OperationKindChange
CreateBudgetPolicybehaviour changesPer-key budget storage changes with migration 0131. If two per-key budgets were active on two keys of the same client at the same intent, the upgrade keeps the earliest and deactivates the rest, and the surviving limit now applies to the client's combined spend.
UpdateBudgetPolicybehaviour changesPer-key budget storage changes with migration 0131. If two per-key budgets were active on two keys of the same client at the same intent, the upgrade keeps the earliest and deactivates the rest, and the surviving limit now applies to the client's combined spend.
CreateBudgetPolicybug fixesCreating, changing, deleting, or disabling a budget policy now schedules a gateway refresh for every project it governs. Previously only one project's gateways were refreshed, leaving other projects enforcing the old policy until the next periodic rebuild. Removing the last budget also clears older gateway snapshots that could otherwise keep blocking requests until another configuration refresh.
UpdateBudgetPolicybug fixesCreating, changing, deleting, or disabling a budget policy now schedules a gateway refresh for every project it governs. Previously only one project's gateways were refreshed, leaving other projects enforcing the old policy until the next periodic rebuild. Removing the last budget also clears older gateway snapshots that could otherwise keep blocking requests until another configuration refresh.
DeleteBudgetPolicybug fixesCreating, changing, deleting, or disabling a budget policy now schedules a gateway refresh for every project it governs. Previously only one project's gateways were refreshed, leaving other projects enforcing the old policy until the next periodic rebuild. Removing the last budget also clears older gateway snapshots that could otherwise keep blocking requests until another configuration refresh.
SetBudgetPolicyStatusbug fixesCreating, changing, deleting, or disabling a budget policy now schedules a gateway refresh for every project it governs. Previously only one project's gateways were refreshed, leaving other projects enforcing the old policy until the next periodic rebuild. Removing the last budget also clears older gateway snapshots that could otherwise keep blocking requests until another configuration refresh.
CreateBudgetPolicybug fixesA budget policy on a single API key now caps the client behind the key, within the key's project, instead of the key row. Rotating the key used to strand the policy on the retired key, leaving the replacement with no budget while the policy still listed as active; the budget now follows the rotation, the period's spend is summed across every key of the client in that project, and both keys of a rotation pair are governed while both are live. The client is recorded on the policy when it is written, and at most one active per-key policy per project, client and intent is allowed (one default and one bound may coexist): creating, retargeting or activating a second one on another key of the same client, or attaching an already-budgeted key to such a client, is refused. A key cannot be moved out of a client that other keys stay in while that client's budget is active; deactivate the budget first. A per-key budget can only be created on, or retargeted to, a key that belongs to the project named in the request; a key in another project is reported as not found.
UpdateBudgetPolicybug fixesA budget policy on a single API key now caps the client behind the key, within the key's project, instead of the key row. Rotating the key used to strand the policy on the retired key, leaving the replacement with no budget while the policy still listed as active; the budget now follows the rotation, the period's spend is summed across every key of the client in that project, and both keys of a rotation pair are governed while both are live. The client is recorded on the policy when it is written, and at most one active per-key policy per project, client and intent is allowed (one default and one bound may coexist): creating, retargeting or activating a second one on another key of the same client, or attaching an already-budgeted key to such a client, is refused. A key cannot be moved out of a client that other keys stay in while that client's budget is active; deactivate the budget first. A per-key budget can only be created on, or retargeted to, a key that belongs to the project named in the request; a key in another project is reported as not found.
SetBudgetPolicyStatusbug fixesA budget policy on a single API key now caps the client behind the key, within the key's project, instead of the key row. Rotating the key used to strand the policy on the retired key, leaving the replacement with no budget while the policy still listed as active; the budget now follows the rotation, the period's spend is summed across every key of the client in that project, and both keys of a rotation pair are governed while both are live. The client is recorded on the policy when it is written, and at most one active per-key policy per project, client and intent is allowed (one default and one bound may coexist): creating, retargeting or activating a second one on another key of the same client, or attaching an already-budgeted key to such a client, is refused. A key cannot be moved out of a client that other keys stay in while that client's budget is active; deactivate the budget first. A per-key budget can only be created on, or retargeted to, a key that belongs to the project named in the request; a key in another project is reported as not found.
CreateBudgetPolicybug fixesBudget policies with a block or fallback action are no longer accepted at the user and per-key-default team scopes, where enforcement does not evaluate them. Such a policy was stored and reported spend but never gated a request; creating one now returns an error naming the limitation, and monitor policies at these scopes remain supported. The few existing rows (internal testing only; the Console never authored these scopes) cannot be edited or re-activated while they keep the enforcing action; switching one to monitor or moving it to a scope enforcement governs unfreezes it, and deactivating or deleting it remains available either way.
UpdateBudgetPolicybug fixesBudget policies with a block or fallback action are no longer accepted at the user and per-key-default team scopes, where enforcement does not evaluate them. Such a policy was stored and reported spend but never gated a request; creating one now returns an error naming the limitation, and monitor policies at these scopes remain supported. The few existing rows (internal testing only; the Console never authored these scopes) cannot be edited or re-activated while they keep the enforcing action; switching one to monitor or moving it to a scope enforcement governs unfreezes it, and deactivating or deleting it remains available either way.
SetBudgetPolicyStatusbug fixesBudget policies with a block or fallback action are no longer accepted at the user and per-key-default team scopes, where enforcement does not evaluate them. Such a policy was stored and reported spend but never gated a request; creating one now returns an error naming the limitation, and monitor policies at these scopes remain supported. The few existing rows (internal testing only; the Console never authored these scopes) cannot be edited or re-activated while they keep the enforcing action; switching one to monitor or moving it to a scope enforcement governs unfreezes it, and deactivating or deleting it remains available either way.

ProjectsService

OperationKindChange
UpdateProjectMembersecurity updatesA project can no longer be left with no administrator. Demoting or removing a project's last admin through the admin or tenancy member APIs is now refused with FailedPrecondition; the mutation is allowed again as soon as a second admin exists. Previously either call could strip the final admin and orphan the project, leaving no one able to manage its members. A project whose ownership is held only through a manual role grant (not a member row) is unaffected, and revoking that grant is still done separately.
RemoveProjectMembersecurity updatesA project can no longer be left with no administrator. Demoting or removing a project's last admin through the admin or tenancy member APIs is now refused with FailedPrecondition; the mutation is allowed again as soon as a second admin exists. Previously either call could strip the final admin and orphan the project, leaving no one able to manage its members. A project whose ownership is held only through a manual role grant (not a member row) is unaffected, and revoking that grant is still done separately.

v0.2.1

No API operations changed in this release.

v0.2.0

AdminService

OperationKindChange
ListUserTokenssecurity updatesListing, reading and revoking user tokens through the admin API is now confined to the calling credential's own organization. A credential carrying the broad admin scope could previously act on any organization's tokens, because these operations matched a token by its id alone and never checked who was asking. Naming a different organization on the request is refused. Credentials that are not tied to an organization, such as an operator's environment-configured key, are unaffected. An organization administrator signed in to the dashboard can now list, read and revoke their own organization's tokens through these operations, which an organization-scoped API key still cannot do. Before upgrading a management plane that serves more than one organization, re-scope by hand any user tokens still stamped with the placeholder organization "default": until you do, the organization that owns them can no longer read or revoke them.
GetUserTokensecurity updatesListing, reading and revoking user tokens through the admin API is now confined to the calling credential's own organization. A credential carrying the broad admin scope could previously act on any organization's tokens, because these operations matched a token by its id alone and never checked who was asking. Naming a different organization on the request is refused. Credentials that are not tied to an organization, such as an operator's environment-configured key, are unaffected. An organization administrator signed in to the dashboard can now list, read and revoke their own organization's tokens through these operations, which an organization-scoped API key still cannot do. Before upgrading a management plane that serves more than one organization, re-scope by hand any user tokens still stamped with the placeholder organization "default": until you do, the organization that owns them can no longer read or revoke them.
RevokeUserTokensecurity updatesListing, reading and revoking user tokens through the admin API is now confined to the calling credential's own organization. A credential carrying the broad admin scope could previously act on any organization's tokens, because these operations matched a token by its id alone and never checked who was asking. Naming a different organization on the request is refused. Credentials that are not tied to an organization, such as an operator's environment-configured key, are unaffected. An organization administrator signed in to the dashboard can now list, read and revoke their own organization's tokens through these operations, which an organization-scoped API key still cannot do. Before upgrading a management plane that serves more than one organization, re-scope by hand any user tokens still stamped with the placeholder organization "default": until you do, the organization that owns them can no longer read or revoke them.
QueryAuditLogsnew featuresThe audit log query RPCs (QueryAuditLogs and QueryPlatformAuditLogs) can now return success and failure counts alongside the page of entries. Set include_stats and read the new stats field instead of running an extra query per count. The counts obey every filter except success, so a view filtered to one outcome still shows both numbers. The response is unchanged when include_stats is not set.
QueryPlatformAuditLogsnew featuresThe audit log query RPCs (QueryAuditLogs and QueryPlatformAuditLogs) can now return success and failure counts alongside the page of entries. Set include_stats and read the new stats field instead of running an extra query per count. The counts obey every filter except success, so a view filtered to one outcome still shows both numbers. The response is unchanged when include_stats is not set.

CatalogService

OperationKindChange
UpsertProviderbehaviour changesCreating a provider through the catalog API no longer enables it. A provider created without is_enabled now arrives disabled, and registering a model under it is refused until it is enabled: enabling a provider is what makes the data plane start fetching its credentials, so one created before it has a credential cannot serve. Existing providers are unaffected.
UpsertModelnew featuresThe catalog API now carries a model's whole record. Modalities, rate and size limits, per-model backend URLs, non-per-token pricing, the cache-write rate, and free-form metadata (including the display name and the deprecation and retirement dates) can now be written and read back, where before they could only be set by editing the database. Providers likewise carry their routing metadata (upstream type, backend schema, API-key flavor and per-operation variants), which had no representation at all. Listing providers or models also accepts include_disabled, so the full catalog can be read rather than only the enabled part.
GetModelnew featuresThe catalog API now carries a model's whole record. Modalities, rate and size limits, per-model backend URLs, non-per-token pricing, the cache-write rate, and free-form metadata (including the display name and the deprecation and retirement dates) can now be written and read back, where before they could only be set by editing the database. Providers likewise carry their routing metadata (upstream type, backend schema, API-key flavor and per-operation variants), which had no representation at all. Listing providers or models also accepts include_disabled, so the full catalog can be read rather than only the enabled part.
ListModelsnew featuresThe catalog API now carries a model's whole record. Modalities, rate and size limits, per-model backend URLs, non-per-token pricing, the cache-write rate, and free-form metadata (including the display name and the deprecation and retirement dates) can now be written and read back, where before they could only be set by editing the database. Providers likewise carry their routing metadata (upstream type, backend schema, API-key flavor and per-operation variants), which had no representation at all. Listing providers or models also accepts include_disabled, so the full catalog can be read rather than only the enabled part.
UpsertProvidernew featuresThe catalog API now carries a model's whole record. Modalities, rate and size limits, per-model backend URLs, non-per-token pricing, the cache-write rate, and free-form metadata (including the display name and the deprecation and retirement dates) can now be written and read back, where before they could only be set by editing the database. Providers likewise carry their routing metadata (upstream type, backend schema, API-key flavor and per-operation variants), which had no representation at all. Listing providers or models also accepts include_disabled, so the full catalog can be read rather than only the enabled part.
GetProvidernew featuresThe catalog API now carries a model's whole record. Modalities, rate and size limits, per-model backend URLs, non-per-token pricing, the cache-write rate, and free-form metadata (including the display name and the deprecation and retirement dates) can now be written and read back, where before they could only be set by editing the database. Providers likewise carry their routing metadata (upstream type, backend schema, API-key flavor and per-operation variants), which had no representation at all. Listing providers or models also accepts include_disabled, so the full catalog can be read rather than only the enabled part.
ListProvidersnew featuresThe catalog API now carries a model's whole record. Modalities, rate and size limits, per-model backend URLs, non-per-token pricing, the cache-write rate, and free-form metadata (including the display name and the deprecation and retirement dates) can now be written and read back, where before they could only be set by editing the database. Providers likewise carry their routing metadata (upstream type, backend schema, API-key flavor and per-operation variants), which had no representation at all. Listing providers or models also accepts include_disabled, so the full catalog can be read rather than only the enabled part.
UpsertModelbug fixesEditing a model or provider through the catalog API no longer switches it back on. Every write used to assert "enabled" whether or not it mentioned enablement, so an administrator's deliberate disable was reverted by the next unrelated edit (a price correction or a rename was enough) with nothing recording it. Enablement now changes only when a request actually asks it to. One consequence: a provider created through the API now arrives disabled, because enabling a provider is what makes the data plane start fetching its credentials, and one created before it has a credential cannot serve. Existing providers are unaffected, and enabling a new one is a single further call. If you script provider creation and relied on it being immediately enabled, ask for it explicitly.
UpsertProviderbug fixesEditing a model or provider through the catalog API no longer switches it back on. Every write used to assert "enabled" whether or not it mentioned enablement, so an administrator's deliberate disable was reverted by the next unrelated edit (a price correction or a rename was enough) with nothing recording it. Enablement now changes only when a request actually asks it to. One consequence: a provider created through the API now arrives disabled, because enabling a provider is what makes the data plane start fetching its credentials, and one created before it has a credential cannot serve. Existing providers are unaffected, and enabling a new one is a single further call. If you script provider creation and relied on it being immediately enabled, ask for it explicitly.
UpsertModelbug fixesA partial edit through the catalog API no longer blanks the fields it did not mention. Changing one property of a model (its mode, say) cleared its capabilities, per-token prices and context window, because an omitted value was written over the stored one rather than skipped. Fields a request does not carry are now left as they are. The model's modalities, limits, backend URLs and pricing extras follow the same rule now that the API can carry them at all; they were never reachable before, so nothing was lost through them.

CustomerRequestLogsService

OperationKindChange
GetCustomerRequestLogStatsnew featuresRequest-log statistics can now separate spend the organization was actually billed for from cost that is only estimated. Group or filter by usage_mode (managed, byok, passthrough) to keep BYOK and passthrough traffic out of a spend total. Group or filter by usage_source (actual, partial, estimated) to see how much of a figure rests on locally estimated token counts rather than counts the provider reported. Both work on the admin and customer stats endpoints and can be combined with an existing dimension, for example per-model billed spend. usage_mode is available for historical requests; usage_source is recorded from this release onward and is empty for earlier requests, for requests served by a data plane that has not been upgraded, and for rejected or budget-blocked requests. Individual request logs now carry usage_source too, which answers whether a request's token counts were measured or estimated, a question the usage_measured flag cannot answer.
ListCustomerRequestLogsnew featuresRequest-log statistics can now separate spend the organization was actually billed for from cost that is only estimated. Group or filter by usage_mode (managed, byok, passthrough) to keep BYOK and passthrough traffic out of a spend total. Group or filter by usage_source (actual, partial, estimated) to see how much of a figure rests on locally estimated token counts rather than counts the provider reported. Both work on the admin and customer stats endpoints and can be combined with an existing dimension, for example per-model billed spend. usage_mode is available for historical requests; usage_source is recorded from this release onward and is empty for earlier requests, for requests served by a data plane that has not been upgraded, and for rejected or budget-blocked requests. Individual request logs now carry usage_source too, which answers whether a request's token counts were measured or estimated, a question the usage_measured flag cannot answer.
GetCustomerRequestLognew featuresRequest-log statistics can now separate spend the organization was actually billed for from cost that is only estimated. Group or filter by usage_mode (managed, byok, passthrough) to keep BYOK and passthrough traffic out of a spend total. Group or filter by usage_source (actual, partial, estimated) to see how much of a figure rests on locally estimated token counts rather than counts the provider reported. Both work on the admin and customer stats endpoints and can be combined with an existing dimension, for example per-model billed spend. usage_mode is available for historical requests; usage_source is recorded from this release onward and is empty for earlier requests, for requests served by a data plane that has not been upgraded, and for rejected or budget-blocked requests. Individual request logs now carry usage_source too, which answers whether a request's token counts were measured or estimated, a question the usage_measured flag cannot answer.

IdentityService

OperationKindChange
GetUsersecurity updatesDirectory lookups through IdentityService.GetUser and ListUsers are now confined to the organizations the calling session belongs to. A signed-in user that held the users_reader scope, including every organization administrator, could previously resolve any user id in any tenant to email, name and role. GetUser now answers "not found" for a user outside the caller's organizations, and ListUsers omits them. A session with no project memberships resolves no users at all, including its own row. This affects users whose only access is an organization-level role, pending invites, and users whose only project is the reserved "default" project. Platform operators keep cross-tenant directory reads only through an explicit platform role binding. In a multi-tenant deployment that binding is a documented provisioning step (docs/runbooks/platform-directory-reach.md).
ListUserssecurity updatesDirectory lookups through IdentityService.GetUser and ListUsers are now confined to the organizations the calling session belongs to. A signed-in user that held the users_reader scope, including every organization administrator, could previously resolve any user id in any tenant to email, name and role. GetUser now answers "not found" for a user outside the caller's organizations, and ListUsers omits them. A session with no project memberships resolves no users at all, including its own row. This affects users whose only access is an organization-level role, pending invites, and users whose only project is the reserved "default" project. Platform operators keep cross-tenant directory reads only through an explicit platform role binding. In a multi-tenant deployment that binding is a documented provisioning step (docs/runbooks/platform-directory-reach.md).

McpOAuthClientsService

OperationKindChange
CreateMcpOAuthClientbug fixesThe MCP OAuth clients API is now reachable. Every call to it (from the SDKs, the REST endpoints, or the API explorer) previously returned an empty success response and saved nothing, because the service was never routed on the management API. Creating, reading, updating and deleting MCP OAuth clients now works as documented.
GetMcpOAuthClientbug fixesThe MCP OAuth clients API is now reachable. Every call to it (from the SDKs, the REST endpoints, or the API explorer) previously returned an empty success response and saved nothing, because the service was never routed on the management API. Creating, reading, updating and deleting MCP OAuth clients now works as documented.
ListMcpOAuthClientsbug fixesThe MCP OAuth clients API is now reachable. Every call to it (from the SDKs, the REST endpoints, or the API explorer) previously returned an empty success response and saved nothing, because the service was never routed on the management API. Creating, reading, updating and deleting MCP OAuth clients now works as documented.
UpdateMcpOAuthClientbug fixesThe MCP OAuth clients API is now reachable. Every call to it (from the SDKs, the REST endpoints, or the API explorer) previously returned an empty success response and saved nothing, because the service was never routed on the management API. Creating, reading, updating and deleting MCP OAuth clients now works as documented.
DeleteMcpOAuthClientbug fixesThe MCP OAuth clients API is now reachable. Every call to it (from the SDKs, the REST endpoints, or the API explorer) previously returned an empty success response and saved nothing, because the service was never routed on the management API. Creating, reading, updating and deleting MCP OAuth clients now works as documented.

RequestLogsService

OperationKindChange
GetRequestLogStatsnew featuresRequest-log statistics can now separate spend the organization was actually billed for from cost that is only estimated. Group or filter by usage_mode (managed, byok, passthrough) to keep BYOK and passthrough traffic out of a spend total. Group or filter by usage_source (actual, partial, estimated) to see how much of a figure rests on locally estimated token counts rather than counts the provider reported. Both work on the admin and customer stats endpoints and can be combined with an existing dimension, for example per-model billed spend. usage_mode is available for historical requests; usage_source is recorded from this release onward and is empty for earlier requests, for requests served by a data plane that has not been upgraded, and for rejected or budget-blocked requests. Individual request logs now carry usage_source too, which answers whether a request's token counts were measured or estimated, a question the usage_measured flag cannot answer.
QueryRequestLogsnew featuresRequest-log statistics can now separate spend the organization was actually billed for from cost that is only estimated. Group or filter by usage_mode (managed, byok, passthrough) to keep BYOK and passthrough traffic out of a spend total. Group or filter by usage_source (actual, partial, estimated) to see how much of a figure rests on locally estimated token counts rather than counts the provider reported. Both work on the admin and customer stats endpoints and can be combined with an existing dimension, for example per-model billed spend. usage_mode is available for historical requests; usage_source is recorded from this release onward and is empty for earlier requests, for requests served by a data plane that has not been upgraded, and for rejected or budget-blocked requests. Individual request logs now carry usage_source too, which answers whether a request's token counts were measured or estimated, a question the usage_measured flag cannot answer.
GetRequestLognew featuresRequest-log statistics can now separate spend the organization was actually billed for from cost that is only estimated. Group or filter by usage_mode (managed, byok, passthrough) to keep BYOK and passthrough traffic out of a spend total. Group or filter by usage_source (actual, partial, estimated) to see how much of a figure rests on locally estimated token counts rather than counts the provider reported. Both work on the admin and customer stats endpoints and can be combined with an existing dimension, for example per-model billed spend. usage_mode is available for historical requests; usage_source is recorded from this release onward and is empty for earlier requests, for requests served by a data plane that has not been upgraded, and for rejected or budget-blocked requests. Individual request logs now carry usage_source too, which answers whether a request's token counts were measured or estimated, a question the usage_measured flag cannot answer.

v0.1.5

AdminService

OperationKindChange
AddProjectMembersecurity updatesAdding a member to a project now rejects an identity that does not exist, instead of recording a membership and role assignment against an unknown id: records that were inert until someone was later created with the same id and inherited the access. Both API surfaces enforce this.
ListProjectMembersbug fixesListing a project's members now includes people whose access comes from a role or permission granted on that project, not only those added directly. Both let someone into the project, but only direct membership appeared on the list, so it under-reported who could reach the project, wrong for an access review or offboarding. Someone listed this way has no membership record to change, so they are reported without one, and their access is removed where it was granted rather than from the member list.
CreateServiceAccountbug fixesCreating or revoking a service account now takes effect in seconds rather than minutes. The published key set is refreshed immediately by the instance handling the change and within 30 seconds elsewhere, where previously either could take up to five minutes, long enough that a new service account was rejected as if its credentials were wrong, and a revoked one kept being accepted.
RevokeServiceAccountbug fixesCreating or revoking a service account now takes effect in seconds rather than minutes. The published key set is refreshed immediately by the instance handling the change and within 30 seconds elsewhere, where previously either could take up to five minutes, long enough that a new service account was rejected as if its credentials were wrong, and a revoked one kept being accepted.
ListProjectsbug fixesListing projects now paginates. The project list endpoints accepted a page token and ignored it, always reporting that no further pages existed, so a organization with more projects than one page silently saw only the first, and a caller had no way to tell a full page from a truncated one. Callers that follow the next-page token now receive every project.
ListProjectsbug fixesProjects can now be listed in a requested order, by creation time or by project id, so a client no longer has to re-sort every response. An unsupported sort field, or a filter expression the endpoint does not implement, is now rejected with a clear error rather than silently ignored, which previously returned an unsorted or unfiltered list that looked like an answer.
CreateProjectbug fixesA project created through the admin API now starts with its caller as an administrator, so it can be managed and have keys minted right away. Previously a project created this way could come out with no members: its management page read "unavailable" and nobody could administer it or mint keys for its users. A caller with no resolvable user identity (a legacy admin API key) still creates an unowned project, now recorded so it can be found and repaired.
GetSystemSettingbug fixesReading and writing a system setting whose key contains a colon (for example dataplane-url:<workspace_id>) now works over REST. GET and PUT /admin/v1/system-settings/{key} previously returned an empty 200 response for such keys; both the raw and the percent-encoded forms of the key now resolve.
UpsertSystemSettingbug fixesReading and writing a system setting whose key contains a colon (for example dataplane-url:<workspace_id>) now works over REST. GET and PUT /admin/v1/system-settings/{key} previously returned an empty 200 response for such keys; both the raw and the percent-encoded forms of the key now resolve.
CreateCustomerbug fixesCreating an organization now rejects an organization ID that does not match the documented slug format (lowercase letters, digits, and internal hyphens, 63 characters maximum). The API previously accepted any non-empty string. Existing organizations are not affected; the check applies only when an organization is created.
AddProjectMemberbug fixesAdding a project member now fails with a 404 error when the given identity does not exist, instead of creating the membership and its RBAC binding anyway, records a user registering later with the same ID could inherit. The check and write run in one statement, so a concurrent identity deletion cannot slip through. The same call updates an existing member's role, and that path now also fails with a 404 when the member's identity was deleted. Member removal is unaffected, so cleanup of such rows still works.

AiKeysService

OperationKindChange
Registerbug fixesProject members can again register, list, and revoke their own user-scoped AI provider keys. The permission-only AI-key endpoints rejected members after the RBAC migration even though their role was intended to carry those permissions. Shared project keys remain owner-controlled.
Listbug fixesProject members can again register, list, and revoke their own user-scoped AI provider keys. The permission-only AI-key endpoints rejected members after the RBAC migration even though their role was intended to carry those permissions. Shared project keys remain owner-controlled.
Revokebug fixesProject members can again register, list, and revoke their own user-scoped AI provider keys. The permission-only AI-key endpoints rejected members after the RBAC migration even though their role was intended to carry those permissions. Shared project keys remain owner-controlled.

ApiKeysService

OperationKindChange
UpdateApiKeybug fixesChanging an API key's policy tags, or enabling or disabling a key, now takes effect on the data plane promptly. Previously these changes only reached a project's gateways on the periodic resync, so a re-tagged key kept its old routing and fallback for up to ~30 minutes, a rate-limit change from a tag was not applied until an unrelated policy edit, and a disabled key kept serving until the resync.

CatalogService

OperationKindChange
UpsertProviderbug fixesEditing a provider's connection settings through the catalog API (base URL or credential, or removing the provider) now takes effect on projects that route on their own hostname (strict isolation). Previously only the shared route map picked up the change, so a project with its own hostname kept serving the old provider configuration until an unrelated change happened to refresh it.
SetProviderCredentialbug fixesEditing a provider's connection settings through the catalog API (base URL or credential, or removing the provider) now takes effect on projects that route on their own hostname (strict isolation). Previously only the shared route map picked up the change, so a project with its own hostname kept serving the old provider configuration until an unrelated change happened to refresh it.
DeleteProviderbug fixesEditing a provider's connection settings through the catalog API (base URL or credential, or removing the provider) now takes effect on projects that route on their own hostname (strict isolation). Previously only the shared route map picked up the change, so a project with its own hostname kept serving the old provider configuration until an unrelated change happened to refresh it.
UpsertModelbug fixesEditing or removing a model through the catalog API (its upstream name, capabilities, or pricing) now takes effect on projects that route on their own hostname (strict isolation). Previously only the shared route map picked up the change, so a project with its own hostname kept serving the old model configuration until an unrelated change happened to refresh it. Companion to the provider-config fix above.
DeleteModelbug fixesEditing or removing a model through the catalog API (its upstream name, capabilities, or pricing) now takes effect on projects that route on their own hostname (strict isolation). Previously only the shared route map picked up the change, so a project with its own hostname kept serving the old model configuration until an unrelated change happened to refresh it. Companion to the provider-config fix above.

ConfiguratorService

OperationKindChange
SetDataplaneURLsecurity updatesThe Configurator SetDataplaneURL and RevokeUserToken RPCs no longer accept an organization admin management API key. Repointing a workspace's data-plane URL and revoking gatekeeper user tokens by JTI are platform operations: they now require the dataplane_operator scope or the dataplane machine role (plus the managed-SaaS machine credential for SetDataplaneURL), so a leaked or over-privileged org admin key can no longer redirect a data plane or invalidate sessions. Tenant-facing equivalents under AdminService are unchanged. No CVE.
RevokeUserTokensecurity updatesThe Configurator SetDataplaneURL and RevokeUserToken RPCs no longer accept an organization admin management API key. Repointing a workspace's data-plane URL and revoking gatekeeper user tokens by JTI are platform operations: they now require the dataplane_operator scope or the dataplane machine role (plus the managed-SaaS machine credential for SetDataplaneURL), so a leaked or over-privileged org admin key can no longer redirect a data plane or invalidate sessions. Tenant-facing equivalents under AdminService are unchanged. No CVE.
UpsertMCPCatalogServersecurity updatesMCP catalog writes are now confined to the caller's own workspace. A data plane's service account could previously write catalog entries into another workspace, because the ownership check it was gated behind never ran. No CVE; requires a valid service-account credential.

InferenceIngressService

OperationKindChange
GetDataplaneURLbug fixesAsking for a dataplane URL by project without naming an organization now answers 400 with the field to supply, instead of 500. Callers who belong to no project had no organization to infer, so the request failed as a server error quoting an internal argument contract. Naming the organization gives the same answer it always did.

MCPCatalogService

OperationKindChange
UpsertCatalogServerbug fixesEditing, disabling, or deleting a shared MCP catalog server now refreshes the MCP profiles that route it within a worker poll. Previously only the per-gateway catalog directory was refreshed, so a profile serving that server kept the old address and tool set until the next periodic full sync, up to ~30 minutes. Both the catalog API and the operator dashboard now fan the change out to every affected profile owner.
SetCatalogServerEnabledbug fixesEditing, disabling, or deleting a shared MCP catalog server now refreshes the MCP profiles that route it within a worker poll. Previously only the per-gateway catalog directory was refreshed, so a profile serving that server kept the old address and tool set until the next periodic full sync, up to ~30 minutes. Both the catalog API and the operator dashboard now fan the change out to every affected profile owner.
DeleteCatalogServerbug fixesEditing, disabling, or deleting a shared MCP catalog server now refreshes the MCP profiles that route it within a worker poll. Previously only the per-gateway catalog directory was refreshed, so a profile serving that server kept the old address and tool set until the next periodic full sync, up to ~30 minutes. Both the catalog API and the operator dashboard now fan the change out to every affected profile owner.
DeleteCatalogServerbug fixesDeleting an MCP catalog server now succeeds when projects have granted that server. The delete removes the grant rows and the server in one transaction, then refreshes each granting project and each affected profile owner. Such a delete previously failed with a 500 error that exposed the database constraint name.

MCPProfilesService

OperationKindChange
CreateMCPProfilebug fixesAn MCP profile created or changed through the MCPProfilesService API now becomes routable within seconds, the same as one changed from the dashboard. Where profiles are served on the shared URL rather than a per-project gateway hostname, the API path refreshed only part of the routing configuration, so a new profile's /mcp/ address returned 404 until the next periodic full sync (up to ~38 minutes) during which an app given that address silently had none of its tools. Every profile mutation on the API now fires the same per-user refresh the dashboard does.
UpdateMCPProfilebug fixesAn MCP profile created or changed through the MCPProfilesService API now becomes routable within seconds, the same as one changed from the dashboard. Where profiles are served on the shared URL rather than a per-project gateway hostname, the API path refreshed only part of the routing configuration, so a new profile's /mcp/ address returned 404 until the next periodic full sync (up to ~38 minutes) during which an app given that address silently had none of its tools. Every profile mutation on the API now fires the same per-user refresh the dashboard does.
DeleteMCPProfilebug fixesAn MCP profile created or changed through the MCPProfilesService API now becomes routable within seconds, the same as one changed from the dashboard. Where profiles are served on the shared URL rather than a per-project gateway hostname, the API path refreshed only part of the routing configuration, so a new profile's /mcp/ address returned 404 until the next periodic full sync (up to ~38 minutes) during which an app given that address silently had none of its tools. Every profile mutation on the API now fires the same per-user refresh the dashboard does.
AddMCPProfileServerbug fixesAn MCP profile created or changed through the MCPProfilesService API now becomes routable within seconds, the same as one changed from the dashboard. Where profiles are served on the shared URL rather than a per-project gateway hostname, the API path refreshed only part of the routing configuration, so a new profile's /mcp/ address returned 404 until the next periodic full sync (up to ~38 minutes) during which an app given that address silently had none of its tools. Every profile mutation on the API now fires the same per-user refresh the dashboard does.
RemoveMCPProfileServerbug fixesAn MCP profile created or changed through the MCPProfilesService API now becomes routable within seconds, the same as one changed from the dashboard. Where profiles are served on the shared URL rather than a per-project gateway hostname, the API path refreshed only part of the routing configuration, so a new profile's /mcp/ address returned 404 until the next periodic full sync (up to ~38 minutes) during which an app given that address silently had none of its tools. Every profile mutation on the API now fires the same per-user refresh the dashboard does.
SetMCPProfileServerToolsbug fixesAn MCP profile created or changed through the MCPProfilesService API now becomes routable within seconds, the same as one changed from the dashboard. Where profiles are served on the shared URL rather than a per-project gateway hostname, the API path refreshed only part of the routing configuration, so a new profile's /mcp/ address returned 404 until the next periodic full sync (up to ~38 minutes) during which an app given that address silently had none of its tools. Every profile mutation on the API now fires the same per-user refresh the dashboard does.

MeService

OperationKindChange
IssueMyKeynew featuresManagement keys can now receive built-in platform roles by explicit delegation when a key is issued or updated. The issuer's platform permissions bound what can be delegated. Legacy platform scopes are converted to explicit role bindings on upgrade, and bindings written by the retired scope inference are removed.
UpdateMyKeynew featuresManagement keys can now receive built-in platform roles by explicit delegation when a key is issued or updated. The issuer's platform permissions bound what can be delegated. Legacy platform scopes are converted to explicit role bindings on upgrade, and bindings written by the retired scope inference are removed.
ListMyProjectsnew featuresA new endpoint, GET /v1/me/projects, lists the projects you can access and your role in each: a console or client can answer "which projects am I in" with the caller's own credential instead of an administrator key or a direct database read. Access covers project membership, project-scoped and organization-wide RBAC grants, plus your organization's default project.
IssueMyKeynew featuresA management API key's scopes are now readable: the key object returned when a key is issued, listed, or re-scoped carries its scope set, so an assignment can be confirmed directly instead of inferred from a refused call. An empty list means the key carries no explicit scopes and resolves through its owner's roles, not that it has none.
ListMyKeysnew featuresA management API key's scopes are now readable: the key object returned when a key is issued, listed, or re-scoped carries its scope set, so an assignment can be confirmed directly instead of inferred from a refused call. An empty list means the key carries no explicit scopes and resolves through its owner's roles, not that it has none.
UpdateMyKeynew featuresA management API key's scopes are now readable: the key object returned when a key is issued, listed, or re-scoped carries its scope set, so an assignment can be confirmed directly instead of inferred from a refused call. An empty list means the key carries no explicit scopes and resolves through its owner's roles, not that it has none.
IssueMyKeybug fixesCreating a management API key now follows the api_keys.create permission rather than the name of the role that carries it. A User Admin, a custom role, or a direct grant holding that permission was refused, so granting the permission the denial named could not work and only a Super Admin could create these keys. The console's key-type chooser follows the same permission, so the option appears for everyone who can use it. The key such a person creates carries their own access, not full administrative access. Only someone who can already administer the organization can put that on a key.

PolicyService

OperationKindChange
AddApiKeyTagbug fixesChanging an API key's policy tags, or enabling or disabling a key, now takes effect on the data plane promptly. Previously these changes only reached a project's gateways on the periodic resync, so a re-tagged key kept its old routing and fallback for up to ~30 minutes, a rate-limit change from a tag was not applied until an unrelated policy edit, and a disabled key kept serving until the resync.
RemoveApiKeyTagbug fixesChanging an API key's policy tags, or enabling or disabling a key, now takes effect on the data plane promptly. Previously these changes only reached a project's gateways on the periodic resync, so a re-tagged key kept its old routing and fallback for up to ~30 minutes, a rate-limit change from a tag was not applied until an unrelated policy edit, and a disabled key kept serving until the resync.
UpdateBudgetPolicybug fixesUpdating a budget policy, a rate-limit policy, or a user group with the all-zero UUID (00000000-0000-0000-0000-000000000000) now returns a 400 error that names the invalid field. These requests previously returned a 500 error.
UpdateRateLimitPolicybug fixesUpdating a budget policy, a rate-limit policy, or a user group with the all-zero UUID (00000000-0000-0000-0000-000000000000) now returns a 400 error that names the invalid field. These requests previously returned a 500 error.
UpdateUserGroupbug fixesUpdating a budget policy, a rate-limit policy, or a user group with the all-zero UUID (00000000-0000-0000-0000-000000000000) now returns a 400 error that names the invalid field. These requests previously returned a 500 error.
ListApiKeyTagsbug fixesThe API key tag endpoints now answer 400 invalid_argument for the all-zero api key id, instead of 500. The all-zero uuid has valid syntax, so it passed every id guard and reached the database layer, where it became an internal error. List tags for a key, add a tag, remove a tag, and the policy coverage check all report the bad id the same way. Remove a tag answered 404 not found for this id before. It now answers 400 with the other three.
AddApiKeyTagbug fixesThe API key tag endpoints now answer 400 invalid_argument for the all-zero api key id, instead of 500. The all-zero uuid has valid syntax, so it passed every id guard and reached the database layer, where it became an internal error. List tags for a key, add a tag, remove a tag, and the policy coverage check all report the bad id the same way. Remove a tag answered 404 not found for this id before. It now answers 400 with the other three.
RemoveApiKeyTagbug fixesThe API key tag endpoints now answer 400 invalid_argument for the all-zero api key id, instead of 500. The all-zero uuid has valid syntax, so it passed every id guard and reached the database layer, where it became an internal error. List tags for a key, add a tag, remove a tag, and the policy coverage check all report the bad id the same way. Remove a tag answered 404 not found for this id before. It now answers 400 with the other three.
GetPolicyCoveragebug fixesThe API key tag endpoints now answer 400 invalid_argument for the all-zero api key id, instead of 500. The all-zero uuid has valid syntax, so it passed every id guard and reached the database layer, where it became an internal error. List tags for a key, add a tag, remove a tag, and the policy coverage check all report the bad id the same way. Remove a tag answered 404 not found for this id before. It now answers 400 with the other three.

ProjectsService

OperationKindChange
AddProjectMembersecurity updatesAdding a member to a project now rejects an identity that does not exist, instead of recording a membership and role assignment against an unknown id: records that were inert until someone was later created with the same id and inherited the access. Both API surfaces enforce this.
ListProjectMembersbug fixesListing a project's members now includes people whose access comes from a role or permission granted on that project, not only those added directly. Both let someone into the project, but only direct membership appeared on the list, so it under-reported who could reach the project, wrong for an access review or offboarding. Someone listed this way has no membership record to change, so they are reported without one, and their access is removed where it was granted rather than from the member list.
ListProjectsbug fixesListing projects now paginates. The project list endpoints accepted a page token and ignored it, always reporting that no further pages existed, so a organization with more projects than one page silently saw only the first, and a caller had no way to tell a full page from a truncated one. Callers that follow the next-page token now receive every project.
ListProjectsbug fixesProjects can now be listed in a requested order, by creation time or by project id, so a client no longer has to re-sort every response. An unsupported sort field, or a filter expression the endpoint does not implement, is now rejected with a clear error rather than silently ignored, which previously returned an unsorted or unfiltered list that looked like an answer.
AddProjectMemberbug fixesAdding a project member now fails with a 404 error when the given identity does not exist, instead of creating the membership and its RBAC binding anyway, records a user registering later with the same ID could inherit. The check and write run in one statement, so a concurrent identity deletion cannot slip through. The same call updates an existing member's role, and that path now also fails with a 404 when the member's identity was deleted. Member removal is unaffected, so cleanup of such rows still works.

RequestLogsService

OperationKindChange
GetRequestLogbug fixesFetching a request log by ID over REST now works when the ID contains a colon (for example default:<uuid>). Such a request previously returned an empty 200 response, because the route treated the text after the colon as a custom verb. Both the raw and the percent-encoded forms of the ID now resolve.
QueryRequestLogsbug fixesA management API key that holds the request_logs_reader scope can now read request logs and request-log stats. Every scoped key was previously refused on these endpoints with "scoped api key cannot call an operation without a tenant boundary", so the scope granted nothing. Results are confined to the key's own organization or project, and the three read endpoints accept an optional customer_id filter. Admin credentials and console sessions are unchanged.
GetRequestLogbug fixesA management API key that holds the request_logs_reader scope can now read request logs and request-log stats. Every scoped key was previously refused on these endpoints with "scoped api key cannot call an operation without a tenant boundary", so the scope granted nothing. Results are confined to the key's own organization or project, and the three read endpoints accept an optional customer_id filter. Admin credentials and console sessions are unchanged.
GetRequestLogStatsbug fixesA management API key that holds the request_logs_reader scope can now read request logs and request-log stats. Every scoped key was previously refused on these endpoints with "scoped api key cannot call an operation without a tenant boundary", so the scope granted nothing. Results are confined to the key's own organization or project, and the three read endpoints accept an optional customer_id filter. Admin credentials and console sessions are unchanged.

TenancyService

OperationKindChange
CreateCustomerbug fixesCreating an organization now rejects an organization ID that does not match the documented slug format (lowercase letters, digits, and internal hyphens, 63 characters maximum). The API previously accepted any non-empty string. Existing organizations are not affected; the check applies only when an organization is created.