GCP APIs and Services

Demo project drift

On April 15, 2026, gcloud services list --enabled --project=bq-wh-nb began returning CONSUMER_INVALID with the message Project #348557092514 has been deleted. The read-only listing, filtering, and REST metadata examples in this note were refreshed live against active project dagflow-poc. The state-changing enable, disable, and operation-tracking examples remain documented patterns from the original bq-wh-nb walkthrough and were not re-executed during this pass.

API Fundamentals

Service enablement is one of the easiest places to misunderstand Google Cloud because it sits between IAM and runtime access. A principal can have the right roles and still fail immediately if the API is disabled in the target project. The reverse is also true: a project can have the API enabled and still fail if the caller lacks IAM or the request exceeds quota.


stateDiagram-v2
    [*] --> Available
    Available --> Enabled: gcloud services enable SERVICE
    Enabled --> Disabled: gcloud services disable SERVICE
    Disabled --> Enabled: gcloud services enable SERVICE
    Enabled --> Enabled: disable without --force<br/>when dependents exist fails

    note right of Available
      Visible in --available
      but not yet consumable
    end note

    note right of Enabled
      Requests can reach the API
      if IAM and quota also allow them
    end note

    note right of Disabled
      Resources usually persist
      but the API endpoint is blocked
    end note

PowerShell / Linux | activation model

API activation is always project-scoped. Enabling bigquery.googleapis.com in development does not enable it in staging or production. That is why platform bootstrap usually includes an explicit gcloud services enable ... step or the Terraform google_project_service resource.

The live dagflow-poc project illustrates the usual pattern: core control-plane services such as serviceusage.googleapis.com, servicemanagement.googleapis.com, and cloudapis.googleapis.com are already active, and product services such as compute.googleapis.com, storage.googleapis.com, and bigquery.googleapis.com are also enabled. Most specialized services are not enabled until an operator or IaC workflow does so deliberately.

PowerShell / Linux | “API not enabled” is not an IAM denial

An API not enabled error is a service-activation failure, not a role-binding failure. IAM answers “may this principal perform the operation?” Service Usage answers “is this product turned on for this project at all?” Those are separate control points.

Missing enablement is not a permission fix

When the error explicitly says that a service is not enabled, adding more IAM roles does not solve the immediate problem. The consumer project still needs that API activated first.

Check project, service state, then IAM

First confirm the target project, then confirm whether the service is enabled, and only after that debug roles, bindings, and quotas. This order avoids wasting time on the wrong control plane.

Listing APIs

Listing is the fastest way to answer three operational questions: what the project already consumes, what it could enable next, and whether a filter expression is too broad or too narrow.

PowerShell / Linux | gcloud services list —enabled

gcloud services list --enabled returns only the services already active in the target project. This is the preflight check to run before product-specific commands such as bq query, gcloud run deploy, or gcloud scheduler jobs create.

List the enabled services in dagflow-poc

Before running any product-specific command that depends on a Google Cloud API. It is typically triggered by first project audit, preflight checks, or troubleshooting an “API not enabled” failure. Read-only gcloud list command. It queries Service Usage state for the target project and does not mutate anything. Return the exact service endpoints currently enabled in dagflow-poc.

Output columnSource fieldTypeMeaning
config.nameconfig.namestringCanonical service endpoint used in enable/disable commands and REST resource names.
config.titleconfig.titlestringHuman-readable product name exposed by Service Usage metadata.

List every enabled service in the project and render the canonical endpoint plus display title.

gcloud services list --enabled --project=dagflow-poc --format='table(config.name,config.title)'
NAME                                 TITLE
analyticshub.googleapis.com          Analytics Hub API
artifactregistry.googleapis.com      Artifact Registry API
bigquery.googleapis.com              BigQuery API
bigqueryconnection.googleapis.com    BigQuery Connection API
bigquerydatapolicy.googleapis.com    BigQuery Data Policy API
bigquerydatatransfer.googleapis.com  BigQuery Data Transfer API
bigquerymigration.googleapis.com     BigQuery Migration API
bigqueryreservation.googleapis.com   BigQuery Reservation API
bigquerystorage.googleapis.com       BigQuery Storage API
cloudapis.googleapis.com             Google Cloud APIs
cloudbuild.googleapis.com            Cloud Build API
cloudresourcemanager.googleapis.com  Cloud Resource Manager API
cloudscheduler.googleapis.com        Cloud Scheduler API
cloudtrace.googleapis.com            Cloud Trace API
compute.googleapis.com               Compute Engine API
containerregistry.googleapis.com     Container Registry API
dataform.googleapis.com              Dataform API
dataplex.googleapis.com              Cloud Dataplex API
datastore.googleapis.com             Cloud Datastore API
iam.googleapis.com                   Identity and Access Management (IAM) API
iamcredentials.googleapis.com        IAM Service Account Credentials API
logging.googleapis.com               Cloud Logging API
monitoring.googleapis.com            Cloud Monitoring API
oslogin.googleapis.com               Cloud OS Login API
pubsub.googleapis.com                Cloud Pub/Sub API
run.googleapis.com                   Cloud Run Admin API
secretmanager.googleapis.com         Secret Manager API
servicemanagement.googleapis.com     Service Management API
servicenetworking.googleapis.com     Service Networking API
serviceusage.googleapis.com          Service Usage API
sql-component.googleapis.com         Cloud SQL
sqladmin.googleapis.com              Cloud SQL Admin API
storage-api.googleapis.com           Google Cloud Storage JSON API
storage-component.googleapis.com     Cloud Storage
storage.googleapis.com               Cloud Storage API
sts.googleapis.com                   Security Token Service API
telemetry.googleapis.com             Telemetry API

The project currently has 37 enabled services. The list mixes product APIs such as BigQuery, Cloud Run, Pub/Sub, and Dataplex with control-plane dependencies such as Service Usage, Service Management, Cloud Resource Manager, and Google Cloud APIs. That mix is normal: real projects need both workload services and the control services that support them.

FlagSyntaxDescription
--enabledgcloud services list --enabledReturns only services currently enabled in the project. This is the default mode.
--availablegcloud services list --availableReturns all services the project can enable, including those already enabled.
--filtergcloud services list --enabled --filter='config.title:BigQuery'Applies a filter expression after sort evaluation.
--limitgcloud services list --enabled --limit=20Caps the number of returned rows.
--page-sizegcloud services list --enabled --page-size=100Controls paging size when the backend paginates responses.
--sort-bygcloud services list --enabled --sort-by=config.nameSorts rows client-side before filtering and limiting.
--formatgcloud services list --enabled --format='value(config.name)'Changes output shape for scripting or table rendering.
--projectgcloud services list --enabled --project=dagflow-pocTargets a specific project instead of the active config default.

PowerShell / Linux | gcloud services list —available

gcloud services list --available answers a different question: which services could this project enable if needed? The result set is far larger because it includes Google-managed product APIs, public data endpoints, and marketplace-style partner services.

Sample the services available to dagflow-poc

During service discovery, project bootstrap planning, or before writing an enablement batch. It is typically triggered by you know a workload category but not the exact service endpoint name yet. Read-only Service Usage query. The command can return a very large result set, so --limit is used here to keep the output reviewable. Show the difference between “available to enable” and “already enabled.”.

Output columnSource fieldTypeMeaning
config.nameconfig.namestringThe service endpoint that can be passed to gcloud services enable.
config.titleconfig.titlestringThe display title published for that service.

List a 15-row sample from the much larger available-services catalog.

gcloud services list --available --project=dagflow-poc --limit=15 --format='table(config.name,config.title)'
NAME                                                                                         TITLE
a10-thunder-adc-601b150-byol.endpoints.a10networks-public-396315.cloud.goog                  A10 Thunder ADC 601 - BYOL
a10-vthunder-adc-100mbps.endpoints.a10networks-public-396315.cloud.goog                      A10 Thunder ADC for Advanced Load Balancing - 100 Mbps
a10-vthunder-adc-10gbps.endpoints.a10networks-public-396315.cloud.goog                       A10 Thunder ADC for Advanced Load Balancing - 10 Gbps
a10-vthunder-adc-1gbps.endpoints.a10networks-public-396315.cloud.goog                        A10 Thunder ADC for Advanced Load Balancing - 1 Gbps
a10-vthunder-adc-200mbps.endpoints.a10networks-public-396315.cloud.goog                      A10 Thunder ADC for Advanced Load Balancing - 200 Mbps
a10-vthunder-adc-20mbps.endpoints.a10networks-public-396315.cloud.goog                       A10 Thunder ADC for Advanced Load Balancing - 20 Mbps
a10-vthunder-adc-500mbps.endpoints.a10networks-public-396315.cloud.goog                      A10 Thunder ADC for Advanced Load Balancing - 500 Mbps
a10-vthunder-adc-5gbps.endpoints.a10networks-public-396315.cloud.goog                        A10 Thunder ADC for Advanced Load Balancing - 5 Gbps
a10-vthunder-adc-byol.endpoints.a10networks-public-396315.cloud.goog         A10 Thunder ADC for Advanced Load Balancing - BYOL
a2a-agent-v1-49b2.endpoints.menlo-security-public.cloud.goog                 Menlo A2A Agent (Preview)
a8genaiplatform.endpoints.articul8-public.cloud.goog                         Articul8 GenAI Platform
aapanel.endpoints.anarion-technologies-public.cloud.goog                     aaPanel v7.0.16 on Ubuntu v20
aapl-miriinfotech-public.cloudpartnerservices.goog                           Miri Infotech lapp
ab-initio-cooperating-system.endpoints.ab-initio-419002.cloud.goog           Ab Initio? Co>Operating System?
ab-initio-data-platform.endpoints.ab-initio-419002.cloud.goog                Ab Initio? Data Platform

This output is intentionally noisy. It shows why --available is not the same thing as “Google first-party services you probably care about today.” The catalog includes partner endpoints and marketplace products, so production bootstrap scripts should always pin exact canonical names instead of relying on fuzzy search.

FlagSyntaxDescription
--availablegcloud services list --availableReturns the full catalog of services the project can enable.
--enabledgcloud services list --enabledRestricts the result to services already active in the project.
--filtergcloud services list --available --filter='config.name=bigquery.googleapis.com'Narrows the catalog to matching names or metadata.
--limitgcloud services list --available --limit=15Prevents the result from becoming unmanageably large.
--page-sizegcloud services list --available --page-size=100Adjusts the backend page size for large catalogs.
--sort-bygcloud services list --available --sort-by=config.nameSorts rows before filter and limit are applied.
--formatgcloud services list --available --format='table(config.name,config.title)'Chooses table, JSON, YAML, CSV, or value output.
--projectgcloud services list --available --project=dagflow-pocQueries a specific project’s visible catalog.

PowerShell / Linux | filtering and searching services

Filtering matters because the available-services catalog is broad enough to produce misleading matches. The safest pattern is to search loosely only once, then switch to exact canonical service names for scripts, Terraform, and runbooks.

Filter available services with a broad name expression

During initial discovery, before you know the exact service endpoint. It is typically triggered by you know the product family, such as BigQuery, but not the exact canonical service names yet. Read-only list command. The filter is intentionally broad and can match marketplace or public-data services in addition to the Google-managed API. Show why fuzzy search is useful for discovery but unsafe for automation.

Output columnSource fieldTypeMeaning
namenamestringFully qualified Service Usage resource path, not just the short API endpoint.
config.titleconfig.titlestringDisplay title published by the service.

Search the available-services catalog with the broad filter name:bigquery.

gcloud services list --available --project=dagflow-poc --filter='name:bigquery' --format='table(name,config.title)'

The command returned hundreds of rows. The excerpt below shows the opening portion of the actual output.

NAME                                                                                                                               TITLE
projects/462383815308/services/active-campaign.endpoints.bigquery-connectors-public.cloud.goog                                     ActiveCampaign Connector by Windsor.ai
projects/462383815308/services/activecampaign.endpoints.bigquery-connectors-public.cloud.goog                                      ActiveCampaign by Windsor.ai
projects/462383815308/services/adalyser.endpoints.bigquery-connectors-public.cloud.goog                                            Adalyser by Windsor.ai
projects/462383815308/services/adform-bigquery-connector.endpoints.bigquery-connectors-public.cloud.goog                           Adform BigQuery Connector
projects/462383815308/services/adform.endpoints.bigquery-connectors-public.cloud.goog                                              Adform by Windsor.ai
projects/462383815308/services/adjust-connector-by-windsor.ai.endpoints.bigquery-connectors-public.cloud.goog                      Adjust Connector by Windsor.ai
projects/462383815308/services/adjust.endpoints.bigquery-connectors-public.cloud.goog                                              Adjust by Windsor.ai
projects/462383815308/services/adobe-analytics-bigquery-connector.endpoints.bigquery-connectors-public.cloud.goog                  Adobe Analytics BigQuery Connector
projects/462383815308/services/adobe-analytics-v2.bigquery-connector.endpoints.bigquery-connectors-public.cloud.goog               Adobe Analytics (v2.0) BigQuery Connector
projects/462383815308/services/adobe-analytics.endpoints.bigquery-connectors-public.cloud.goog                                     Adobe Analytics by Windsor.ai
projects/462383815308/services/adroll-connector-by-windsor.ai.endpoints.bigquery-connectors-public.cloud.goog                      AdRoll Connector by Windsor.ai
projects/462383815308/services/adroll.endpoints.bigquery-connectors-public.cloud.goog                                              AdRoll by Windsor.ai
projects/462383815308/services/adtraction.endpoints.bigquery-connectors-public.cloud.goog                                          Adtraction by Windsor.ai
projects/462383815308/services/aha.endpoints.bigquery-connectors-public.cloud.goog                                                 Aha! by Windsor.ai
projects/462383815308/services/aircall-connector-by-windsor.ai.endpoints.bigquery-connectors-public.cloud.goog                     Aircall Connector by Windsor.ai
projects/462383815308/services/aircall.endpoints.bigquery-connectors-public.cloud.goog                                             Aircall by Windsor.ai

The command ended with this CLI warning:

WARNING: --filter : operator evaluation is changing for consistency across Google APIs.  name:bigquery currently matches but will not match in the near future.  Run `gcloud topic filters` for details.

This is the exact reason broad discovery filters do not belong in production scripts. The expression matches marketplace connectors, public data services, and the real Google-managed BigQuery endpoints all at once.

Filter available services by exact canonical API name

After discovery, when you are ready to write a deterministic script or bootstrap step. It is typically triggered by you want to prove that one exact service endpoint exists in the available catalog. Read-only list command using an equality filter. This is safe for scripts because it does not rely on fuzzy matching. Return exactly one target API by canonical service endpoint.

Output columnSource fieldTypeMeaning
config.nameconfig.namestringCanonical service endpoint suitable for gcloud services enable.
config.titleconfig.titlestringHuman-readable title published by Service Usage.

Match only the canonical BigQuery API endpoint.

gcloud services list --available --project=dagflow-poc --filter='config.name=bigquery.googleapis.com' --format='table(config.name,config.title)'
NAME                     TITLE
bigquery.googleapis.com  BigQuery API

This is the scripting-safe pattern. Exact equality on config.name avoids marketplace noise and future filter-behavior changes.

Filter enabled services by product title

When you need a quick family-level inventory rather than one exact API. It is typically triggered by you want to see every enabled BigQuery-related API in the current project. Read-only list command against the enabled-services view. Return the currently enabled services whose titles belong to one product family.

Output columnSource fieldTypeMeaning
config.nameconfig.namestringCanonical service endpoint.
config.titleconfig.titlestringProduct-family display title used for human scanning.

List the enabled BigQuery family services in dagflow-poc.

gcloud services list --enabled --project=dagflow-poc --filter='config.title:BigQuery' --format='table(config.name,config.title)'
NAME                                 TITLE
bigquery.googleapis.com              BigQuery API
bigqueryconnection.googleapis.com    BigQuery Connection API
bigquerydatapolicy.googleapis.com    BigQuery Data Policy API
bigquerydatatransfer.googleapis.com  BigQuery Data Transfer API
bigquerymigration.googleapis.com     BigQuery Migration API
bigqueryreservation.googleapis.com   BigQuery Reservation API
bigquerystorage.googleapis.com       BigQuery Storage API

This filter is broad enough to be useful and still precise enough to stay inside the BigQuery family for the current enabled set.

Filter enabled services by a substring and observe the CLI warning

During quick interactive exploration of a small enabled-service set. It is typically triggered by you want a fast shortlist of storage-related services without remembering all exact names. Read-only list command. The filter works today, but the CLI warns that future operator behavior will tighten. Show a substring search that is acceptable for ad hoc exploration but weak for long-lived scripts.

Output columnSource fieldTypeMeaning
config.nameconfig.namestringCanonical endpoint of each matched service.
config.titleconfig.titlestringProduct title associated with the endpoint.

Search enabled services for endpoints containing storage.

gcloud services list --enabled --project=dagflow-poc --filter='config.name:storage' --format='table(config.name,config.title)'
NAME                              TITLE
bigquerystorage.googleapis.com    BigQuery Storage API
storage-api.googleapis.com        Google Cloud Storage JSON API
storage-component.googleapis.com  Cloud Storage
storage.googleapis.com            Cloud Storage API
WARNING: --filter : operator evaluation is changing for consistency across Google APIs.  config.name:storage currently matches but will not match in the near future.  Run `gcloud topic filters` for details.

The command works today, but the warning is the important part. For automation, replace this with exact-name filters.

Attempt the older wildcard title pattern

When validating an older runbook or copied command snippet. It is typically triggered by you inherited a filter expression that uses shell-style wildcards inside the : operator. Read-only command, but the expression is invalid in the current CLI parser. Show the current error shape so you know the fix belongs in the filter syntax, not in IAM or project state.

Run the older wildcard pattern against the available-services catalog.

gcloud services list --available --project=dagflow-poc --filter='config.title:*Storage*' --format='table(config.name,config.title)'
ERROR: (gcloud.services.list) At most one * expected in : patterns [*Storage*].

On this SDK version, the older wildcard pattern is simply invalid. Use config.title:Storage for a broad title search or, better, use exact equality on config.name.

FlagSyntaxDescription
--filtergcloud services list --filter='config.name=bigquery.googleapis.com'Applies a Boolean filter to the list result.
--formatgcloud services list --format='table(config.name,config.title)'Controls table, JSON, YAML, CSV, or value output.
--projectgcloud services list --project=dagflow-pocTargets a specific project explicitly.
--availablegcloud services list --availableSearches the full enable-able catalog instead of only enabled services.
--enabledgcloud services list --enabledRestricts the search to currently enabled services.
--limitgcloud services list --available --limit=15Keeps discovery output manageable when the catalog is large.
--page-sizegcloud services list --available --page-size=200Changes the response page size returned by the backend.
--sort-bygcloud services list --sort-by=config.nameSorts rows before filtering and limiting.

PowerShell / Linux | service details and the missing gcloud services describe

The current prompt asks for gcloud services describe, but the installed SDK does not expose that subcommand. The correct operational response is to state that plainly and then use the Service Usage REST services.get method for the equivalent metadata.

Confirm that gcloud services describe is not present in SDK 563.0.0

Before relying on copied examples that mention gcloud services describe. It is typically triggered by you need service metadata and expect a direct describe subcommand under gcloud services. Read-only command lookup. The failure happens entirely in the CLI parser before a service request is sent. Prove that the current SDK surface does not expose the subcommand the prompt asks for.

Attempt to describe the BigQuery API directly from the gcloud services command group.

gcloud services describe bigquery.googleapis.com --project=dagflow-poc
ERROR: (gcloud.services) Invalid choice: 'describe'.
Maybe you meant:
  gcloud services disable
  gcloud services enable
  gcloud services list
  gcloud services api-keys describe
  gcloud services operations describe
  gcloud network-services endpoint-policies describe
  gcloud network-services gateways describe
  gcloud network-services grpc-routes describe
  gcloud network-services http-routes describe
  gcloud network-services meshes describe
 
To search the help text of gcloud commands, run:
  gcloud help -- SEARCH_TERMS

On April 15, 2026, with Google Cloud SDK 563.0.0, there is still no direct gcloud services describe. That is a CLI-surface limitation, not a permission problem.

Query the Service Usage REST API for the same service metadata

After confirming the CLI surface does not provide a direct describe command. It is typically triggered by you still need service state, descriptive metadata, and quota descriptors for one API. Read-only REST call authenticated with the active access token. The shell wrapper below is PowerShell because that is the live execution environment for this note. Retrieve the Service Usage services.get payload for bigquery.googleapis.com.

Output fieldSource fieldTypeMeaning
namenamestringFully qualified Service Usage resource name.
statestateenumService enablement state for this consumer project.
serviceNameconfig.namestringCanonical service endpoint.
titleconfig.titlestringHuman-readable product title.
documentationSummaryconfig.documentation.summarystringSummary text published by the service metadata.
quotaLimitCountconfig.quota.limits.CountintegerNumber of quota limit descriptors exposed in the service config.
sampleQuota[].nameconfig.quota.limits[*].namestringIndividual quota limit descriptor name.
sampleQuota[].metricconfig.quota.limits[*].metricstringMetric namespace tracked by the quota descriptor.
sampleQuota[].unitconfig.quota.limits[*].unitstringUnit or cardinality scope of the quota descriptor.

Call the Service Usage services.get endpoint for bigquery.googleapis.com and reduce the payload to the fields that matter operationally.

$token = gcloud auth print-access-token
$headers = @{ Authorization = "Bearer $token" }
$url = 'https://serviceusage.googleapis.com/v1/projects/462383815308/services/bigquery.googleapis.com'
$svc = Invoke-RestMethod -Headers $headers -Uri $url
 
$summary = [ordered]@{
  name                 = $svc.name
  state                = $svc.state
  serviceName          = $svc.config.name
  title                = $svc.config.title
  documentationSummary = $svc.config.documentation.summary
  quotaLimitCount      = $svc.config.quota.limits.Count
  sampleQuota          = @(
    $svc.config.quota.limits |
      Select-Object -First 3 |
      ForEach-Object {
        [ordered]@{
          name    = $_.name
          metric  = $_.metric
          unit    = $_.unit
          default = $_.values.DEFAULT
        }
      }
  )
}
 
$summary | ConvertTo-Json -Depth 5
{
  "name": "projects/462383815308/services/bigquery.googleapis.com",
  "state": "ENABLED",
  "serviceName": "bigquery.googleapis.com",
  "title": "BigQuery API",
  "documentationSummary": "A data platform for customers to create, manage, share and query data.",
  "quotaLimitCount": 33,
  "sampleQuota": [
    {
      "name": "QueryUsagePerDay",
      "metric": "bigquery.googleapis.com/quota/query/usage",
      "unit": "1/d/{project}",
      "default": "209715200"
    },
    {
      "name": "QueryUsagePerUserPerDay",
      "metric": "bigquery.googleapis.com/quota/query/usage",
      "unit": "1/d/{project}/{user}",
      "default": "9223372036854775807"
    },
    {
      "name": "StreamingInsertBytesPerSecond",
      "metric": "bigquery.googleapis.com/quota/streaming/insert_bytes",
      "unit": "1/min/{project}/{region}",
      "default": "18874368000"
    }
  ]
}

This gives the service state, title, documentation summary, and quota descriptor inventory the prompt asked for. One important limitation is visible too: the current services.get payload exposes a documentation summary, but not a human-facing documentation URL field for this service. Use the References section later in the note for the canonical docs links.

Enabling APIs

Enablement is the project-bootstrap step that turns a service from “available” into “consumable.” It is safe to rerun enable commands because Service Usage treats them idempotently, but you still need to be explicit about the target project.

Enablement does not cross environment boundaries

Turning on an API in development does not turn it on in staging or production. Every project is a separate enablement boundary.

Put API activation in bootstrap code

Treat API activation as part of environment provisioning. A project bootstrap step or Terraform module prevents the classic “works in dev, API disabled in prod” failure mode.

PowerShell / Linux | gcloud services enable

gcloud services enable accepts one or more canonical service endpoints and turns them on for the target consumer project. The command can run synchronously or return immediately with --async.

Enable one currently disabled API

Before first use of a specific product that is available but not yet enabled. It is typically triggered by A workload needs a service such as Cloud Scheduler, Dataflow, or Pub/Sub for the first time. State-changing Service Usage operation against the target project. This changes only API activation state, not IAM or resource configuration. Activate one specific API so product requests can start reaching the service backend.

Enable cloudscheduler.googleapis.com for bq-wh-nb.

gcloud services enable cloudscheduler.googleapis.com --project=bq-wh-nb --quiet
Operation "operations/acf.p2-348557092514-29a83514-af4f-491b-bb15-43021d472b42" finished successfully.

The returned operation name is the control-plane record of the enablement. After this completes, Cloud Scheduler requests can reach the API if IAM also allows them.

Enable multiple APIs in one call

During project bootstrap, environment normalization, or when rolling out a feature that depends on several services at once. It is typically triggered by A workflow needs more than one API and you want one atomic-enough activation step instead of several separate commands. State-changing Service Usage operation. Multiple canonical service names are passed as positional arguments in one command. Enable several service endpoints with one call and one long-running operation.

Enable two observability APIs in one command.

gcloud services enable logging.googleapis.com monitoring.googleapis.com --project=bq-wh-nb --quiet
Operation "operations/acat.p2-348557092514-d0e6c05b-bf37-4725-9cd9-0a7b877b6525" finished successfully.

Even when the target services are already enabled, Service Usage can still acknowledge the request as a successful idempotent operation. That is one reason repeated bootstrap runs are safe.

Bootstrap a data-engineering baseline on a new project

During initial platform bootstrap for a new data project. It is typically triggered by you want the common control-plane and analytics services available before workload code lands. State-changing batch enablement. The list below mixes analytics, metadata, storage, scheduler, and identity-support APIs that commonly appear together in data engineering projects. Turn on a practical baseline of services in one reproducible command.

Enable a common data-engineering baseline in one shot.

gcloud services enable bigquery.googleapis.com bigquerydatatransfer.googleapis.com dataform.googleapis.com dataplex.googleapis.com storage.googleapis.com logging.googleapis.com monitoring.googleapis.com cloudscheduler.googleapis.com iamcredentials.googleapis.com sts.googleapis.com --project=bq-wh-nb --quiet
Operation "operations/acf.p2-348557092514-b8776540-6e61-4cd7-afe0-489230b0b254" finished successfully.

This pattern is much safer than enabling services one failure at a time while deploying the first workload. It front-loads the dependency surface and makes environment drift easier to reason about.

FlagSyntaxDescription
SERVICE [SERVICE ...]gcloud services enable bigquery.googleapis.com storage.googleapis.comOne or more canonical service endpoints to enable.
--asyncgcloud services enable bigquery.googleapis.com --asyncReturn immediately instead of waiting for the long-running operation to finish.
--projectgcloud services enable bigquery.googleapis.com --project=bq-wh-nbTargets a specific project explicitly.
--quietgcloud services enable bigquery.googleapis.com --quietSuppresses prompts and is appropriate for scripts or runbooks.

Disabling APIs

Disabling is the inverse control-plane operation. It does not usually delete the underlying resources, but it can instantly break the control plane for workloads that still depend on the service.

PowerShell / Linux | gcloud services disable

gcloud services disable turns a service off for the project. If the service has dependents, the command can fail with FAILED_PRECONDITION unless --force is used.

Start an asynchronous disable operation

During controlled cleanup, rollback, or platform hardening after confirming that the service is no longer needed. It is typically triggered by you want to remove an API from the project’s active surface area without blocking the shell while the control-plane operation finishes. State-changing command. --async returns immediately and gives you an operation name to track later. Start a disable job for one API and hand off completion tracking to the operations subcommands.

Start an asynchronous disable of cloudscheduler.googleapis.com.

gcloud services disable cloudscheduler.googleapis.com --project=bq-wh-nb --async
Asynchronous operation is in progress... Use the following command to wait for its completion:
 gcloud beta services operations wait operations/acat.p17-348557092514-fc60d688-f973-416c-83cf-b41cd0f1aba3

The important payload here is the operation name operations/acat.p17-348557092514-fc60d688-f973-416c-83cf-b41cd0f1aba3. That identifier becomes the handle for describe and wait.

FlagSyntaxDescription
SERVICE [SERVICE ...]gcloud services disable cloudscheduler.googleapis.comOne or more canonical service endpoints to disable.
--asyncgcloud services disable cloudscheduler.googleapis.com --asyncReturns the operation handle immediately without waiting.
--forcegcloud services disable bigquery.googleapis.com --forceAllows dependent services to be disabled as part of the same operation.
--projectgcloud services disable cloudscheduler.googleapis.com --project=bq-wh-nbTargets a specific project explicitly.
--quietgcloud services disable cloudscheduler.googleapis.com --quietSuppresses prompts for scripted runs.

PowerShell / Linux | dependency handling

Dependencies are the reason disablement deserves more care than enablement. A service may look isolated while other active APIs still depend on it.

Attempt to disable BigQuery without --force

Before using --force, to see whether the target service is still required by other enabled APIs. It is typically triggered by you suspect the service may have dependents and want the CLI to enumerate them before any destructive cascade happens. State-changing command attempt, but this example fails before the disable proceeds because Service Usage blocks the request. Show the exact dependency error emitted when an enabled service still has active dependents.

Try to disable BigQuery without allowing cascaded dependent-service disablement.

gcloud services disable bigquery.googleapis.com --project=bq-wh-nb --quiet
Provide the --force flag if you wish to force disable services.
ERROR: (gcloud.services.disable) FAILED_PRECONDITION: The service bigquery.googleapis.com is depended on by the following active service(s): bigquerystorage.googleapis.com,cloudapis.googleapis.com; Please specify disable_dependent_services=true if you want to proceed with disabling all services.
Help Token: AVnrbfnes0WXA_uZkpDeLeQ2jyykAwD64mJm6THJHnNlUr0Jy1ivByLtco95OmAucx5Kt2seYcYEGNEiQciWumJuhm8ltvs009UaoxvVKY_buMno
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
  violations:
  - subject: ?error_code=100001&service_name=bigquery.googleapis.com&services=bigquerystorage.googleapis.com&services=cloudapis.googleapis.com
    type: googleapis.com
- '@type': type.googleapis.com/google.rpc.ErrorInfo
  domain: serviceusage.googleapis.com
  metadata:
    service_name: bigquery.googleapis.com
    services: bigquerystorage.googleapis.com,cloudapis.googleapis.com
  reason: COMMON_SU_SERVICE_HAS_DEPENDENT_SERVICES

This is the exact protection you want before a production disable. Service Usage refused the request because bigquerystorage.googleapis.com and cloudapis.googleapis.com still depend on bigquery.googleapis.com.

PowerShell / Linux | implications of disabling

Disabling an API usually does not delete the resources the API created. It removes the control-plane access path to those resources. Buckets remain buckets, datasets remain datasets, and jobs or service metadata remain in Google’s backend, but requests against the disabled API stop working until the service is enabled again.

In this project there were no Cloud Scheduler jobs to demonstrate post-disable resource visibility, but the long-running operation in the next section returns state: "DISABLED" for the service itself. That is the key control-plane state change: the service endpoint is off for the consumer project.

Production disablement can be an outage

Disabling an API in production can silently break running workloads, deployment pipelines, cron triggers, or support tooling that still assumes the endpoint exists.

Audit dependencies before disable

Check enabled services, check the workloads that use them, and prefer one explicit rollback plan before disabling anything in a shared project.

--force can cascade farther than expected

A forced disable can remove the target API and every enabled service that depends on it. That can turn one cleanup step into a multi-service outage.

Use --force only with an explicit blast-radius review

Read the dependency error first, record the affected services, and use --force only when you are prepared to lose every listed dependent in the same change window.

Operations

Service Usage uses long-running operations for enable and disable requests. That is why --async returns an operation handle instead of the final service record.

PowerShell / Linux | gcloud services operations describe

gcloud services operations describe inspects one operation resource by name. For short API-toggle jobs, the operation may already be complete by the time you query it.

Describe the asynchronous Cloud Scheduler disable operation

After an --async enable or disable request returns an operation name. It is typically triggered by you need the operation result, the target service state, or proof that the control-plane action finished. Read-only operation lookup. It queries the Service Usage operation resource, not the service catalog directly. Inspect the operation resource returned by the asynchronous disable command.

Describe the disable operation returned for cloudscheduler.googleapis.com.

gcloud services operations describe operations/acat.p17-348557092514-fc60d688-f973-416c-83cf-b41cd0f1aba3 --project=bq-wh-nb
Operation [operations/acat.p17-348557092514-fc60d688-f973-416c-83cf-b41cd0f1aba3] complete. Result: {
    "@type":"type.googleapis.com/google.api.serviceusage.v1.DisableServiceResponse",
    "service":{
        "config":{
            "authentication":{},
            "documentation":{
                "summary":"Creates and manages jobs run on a regular recurring schedule."
            },
            "monitoring":{},
            "name":"cloudscheduler.googleapis.com",
            "quota":{},
            "title":"Cloud Scheduler API",
            "usage":{
                "requirements":[
                    "serviceusage.googleapis.com/tos/cloud",
                    "serviceusage.googleapis.com/tos/cloud",
                    "serviceusage.googleapis.com/billing-enabled"
                ]
            }
        },
        "name":"projects/348557092514/services/cloudscheduler.googleapis.com",
        "parent":"projects/348557092514",
        "state":"DISABLED"
    }
}

In this run the operation finished so quickly that describe already returned the terminal result rather than an in-progress record. That is common for single-API toggles.

FlagSyntaxDescription
OPERATIONgcloud services operations describe operations/abcOperation resource name returned by Service Usage.
--fullgcloud services operations describe operations/abc --fullDeprecated flag retained by the CLI; avoid using it in new automation.
--projectgcloud services operations describe operations/abc --project=bq-wh-nbTargets a specific project explicitly.
--formatgcloud services operations describe operations/abc --format=jsonChooses JSON, YAML, table, or value output where supported.

PowerShell / Linux | gcloud services operations wait

gcloud services operations wait blocks until the operation reaches a terminal state. It is the cleanest way to serialize dependent automation after an asynchronous Service Usage call.

Wait for the disable operation to finish

Immediately after an asynchronous enable or disable when the next step depends on completion. It is typically triggered by your script or runbook cannot proceed safely until the API state has converged. Read-only wait loop on the operation resource. It does not change service state by itself. Block until the Service Usage operation reaches a final result and return that result.

Wait on the Cloud Scheduler disable operation until Service Usage marks it complete.

gcloud services operations wait operations/acat.p17-348557092514-fc60d688-f973-416c-83cf-b41cd0f1aba3 --project=bq-wh-nb
Operation [operations/acat.p17-348557092514-fc60d688-f973-416c-83cf-b41cd0f1aba3] complete. Result: {
    "@type":"type.googleapis.com/google.api.serviceusage.v1.DisableServiceResponse",
    "service":{
        "config":{
            "authentication":{},
            "documentation":{
                "summary":"Creates and manages jobs run on a regular recurring schedule."
            },
            "monitoring":{},
            "name":"cloudscheduler.googleapis.com",
            "quota":{},
            "title":"Cloud Scheduler API",
            "usage":{
                "requirements":[
                    "serviceusage.googleapis.com/tos/cloud",
                    "serviceusage.googleapis.com/tos/cloud",
                    "serviceusage.googleapis.com/billing-enabled"
                ]
            }
        },
        "name":"projects/348557092514/services/cloudscheduler.googleapis.com",
        "parent":"projects/348557092514",
        "state":"DISABLED"
    }
}

For this kind of control-plane change, wait is the safest handoff point. The returned state: "DISABLED" confirms that the service endpoint is now off for the project.

FlagSyntaxDescription
OPERATIONgcloud services operations wait operations/abcOperation resource name to wait on.
--projectgcloud services operations wait operations/abc --project=bq-wh-nbTargets a specific project explicitly.
--quietgcloud services operations wait operations/abc --quietSuppresses prompts if any wrapper or environment would otherwise ask for confirmation.

Common Data Engineering APIs

The table below focuses on service endpoints that commonly appear in warehouse, pipeline, orchestration, and identity-support workflows. Default-enabled is guidance for the common empty-project bootstrap experience in Google Cloud today; organization policy, project age, and provisioning path can change the exact initial set.

API nameServiceDefault-enabledTypical DE use case
bigquery.googleapis.comBigQuery APINoQuery warehouse tables, create datasets, run load and extract jobs.
bigquerydatatransfer.googleapis.comBigQuery Data Transfer APINoScheduled SaaS ingest and managed transfer jobs into BigQuery.
bigqueryreservation.googleapis.comBigQuery Reservation APINoSlot reservations, assignments, and workload isolation.
bigquerystorage.googleapis.comBigQuery Storage APINoHigh-throughput reads and writes from Spark, pandas, Beam, and connectors.
dataform.googleapis.comDataform APINoSQL transformation orchestration and repository-backed workflow execution.
dataplex.googleapis.comCloud Dataplex APINoData governance, lake zones, catalog, and data-quality management.
dataflow.googleapis.comDataflow APINoApache Beam batch and streaming pipelines.
composer.googleapis.comCloud Composer APINoManaged Airflow environments for orchestration.
dataproc.googleapis.comCloud Dataproc APINoManaged Spark and Hadoop clusters for heavy distributed processing.
pubsub.googleapis.comPub/Sub APINoEvent ingestion, fan-out, decoupled triggers, and pipeline messaging.
storage.googleapis.comCloud Storage APIYesLanding zone files, staged exports, checkpoints, and archive tiers.
compute.googleapis.comCompute Engine APIYesVMs for custom workers, bastions, schedulers, or legacy ETL runtimes.
cloudscheduler.googleapis.comCloud Scheduler APINoTime-based pipeline triggers for HTTP, Pub/Sub, and Workflows.
cloudfunctions.googleapis.comCloud Functions APINoLightweight event-driven transforms and webhook handlers.
logging.googleapis.comCloud Logging APINoPipeline logs, audit logs, error diagnostics, and centralized search.
monitoring.googleapis.comCloud Monitoring APINoMetrics, alerting, uptime checks, and SLO tracking.
iam.googleapis.comIAM APINoCustom roles, service-account administration, and policy tooling.
iamcredentials.googleapis.comIAM Service Account Credentials APINoService-account token minting, signing, and impersonation workflows.
sts.googleapis.comSecurity Token Service APINoWorkload Identity Federation and token exchange for external identity providers.

Terraform Equivalents

Terraform is the safer long-term pattern because it makes API activation part of the declared project baseline instead of a manual afterthought.

GCP APIs and Services References