Skip to content
Talk to us

API Gateway

Create APIs, their configs from OpenAPI or gRPC documents, and the gateways that use them.

24Supported6Not testedof 30 methods

Control plane only: gateways don't serve traffic.

Requests go to $VERA_ENDPOINT/_gcp/apigateway/v1/. As in Google Cloud, APIs and API configs live in global and gateways in a region, such as us-central1. For gcloud, add this override to the shared setup:

Terminal window
export CLOUDSDK_API_ENDPOINT_OVERRIDES_APIGATEWAY="$VERA_ENDPOINT/_gcp/apigateway/"

Create an API, give it a config from an OpenAPI document and attach the config to a gateway. Save this as openapi.yaml:

openapi.yaml
swagger: "2.0"
info: { title: example-api, version: "1.0.0" }
schemes: [https]
produces: [application/json]
paths:
/hello:
get:
operationId: hello
x-google-backend: { address: "https://example.com/hello" }
responses: { "200": { description: OK } }
Terminal window
gcloud api-gateway apis create example-api
gcloud api-gateway api-configs create example-config \
--api=example-api --openapi-spec=openapi.yaml
gcloud api-gateway gateways create example-gateway \
--api=example-api --api-config=example-config --location=us-central1
gcloud api-gateway gateways describe example-gateway \
--location=us-central1 --format=json

Each create waits for its operation, which the emulator finishes at once. The last command prints the gateway. Its defaultHostname and timestamps differ on every run.

Output
{
"apiConfig": "projects/example-project/locations/global/apis/example-api/configs/example-config",
"createTime": "2026-11-02T20:16:38.232128Z",
"defaultHostname": "example-gateway-5s5xkgid.uc.gateway.dev",
"displayName": "example-gateway",
"effectiveStreamingMode": "EFFECTIVE_STREAMING_MODE_DISABLED",
"name": "projects/example-project/locations/us-central1/gateways/example-gateway",
"state": "ACTIVE",
"updateTime": "2026-11-02T20:16:38.232128Z"
}
  • APIs in global: create, read, list, update and delete.
  • API configs from OpenAPI 2.0 or 3 documents, or gRPC descriptors with a service config, parsed and checked for common mistakes.
  • Gateways in supported regions, each with a generated defaultHostname, switching between configs.
  • Service accounts: a named account must exist and be enabled in the IAM emulator. Without one, the project’s default Compute Engine account is used.
  • IAM policies on APIs, configs and gateways, with etag checks and validation.
  • Long-running operations for every change, already done when returned.
  • v1beta and v1alpha1 requests, including those from Terraform’s google-beta provider.
  • No traffic. A gateway’s defaultHostname doesn’t resolve: nothing routes requests, checks API keys or JWTs, or calls your x-google-backend.
  • Partial validation. Documents are checked for common mistakes, not against the full OpenAPI specification. External $refs aren’t resolved, and gRPC descriptors are decoded, not compiled.
  • IAM isn’t enforced. Policies are stored and validated, but requests aren’t authorized against them.
  • Service accounts aren’t fully authorized. Missing or disabled accounts and Google service agents are refused, but there’s no complete actAs permission check.
  • Operations finish immediately, with no provisioning delay.
  • Alpha-only fields (apiController, serviceRollout, uniqueId and a config’s gatewayConfig) answer 501 Not Implemented on v1alpha1, as does patching a config’s gatewayConfig on v1beta.

Measured 2 November 2026 against recorded Google Cloud responses. What the statuses mean

apis

8 methods · 1 not tested
MethodStatusNotes
createSupportedCreate in global only.
getSupported
listSupported
patchSupportedOnly labels and displayName can change.
deleteSupportedRefused while the API has configs.
getIamPolicySupported
setIamPolicySupported
testIamPermissionsNot testedAnswers for a caller that owns the project.

configs

8 methods · 1 not tested
MethodStatusNotes
createSupportedOpenAPI 2.0 or 3, or gRPC. Documents are partly validated.
getSupportedview=FULL returns the source documents.
listSupported
patchSupportedOnly labels and displayName can change.
deleteSupportedRefused while a gateway uses the config.
getIamPolicySupported
setIamPolicySupported
testIamPermissionsNot testedAnswers for a caller that owns the project.

gateways

8 methods · 1 not tested
MethodStatusNotes
createSupporteddefaultHostname is generated. Nothing is served there.
getSupported
listSupported
patchSupported
deleteSupported
getIamPolicySupported
setIamPolicySupported
testIamPermissionsNot testedAnswers for a caller that owns the project.

operations

4 methods · 1 not tested
MethodStatusNotes
getSupportedOperations finish immediately.
listNot tested
cancelSupportedA finished operation is left unchanged.
deleteSupported

locations

2 methods · 2 not tested
MethodStatusNotes
getNot tested
listNot tested44 locations, including global.