<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="serviceusage_v1beta1.html">Service Usage API</a> . <a href="serviceusage_v1beta1.services.html">services</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="serviceusage_v1beta1.services.consumerQuotaMetrics.html">consumerQuotaMetrics()</a></code>
</p>
<p class="firstline">Returns the consumerQuotaMetrics Resource.</p>

<p class="toc_element">
  <code><a href="#batchEnable">batchEnable(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Enable multiple services on a project. The operation is atomic: if enabling</p>
<p class="toc_element">
  <code><a href="#disable">disable(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Disable a service so that it can no longer be used with a project.</p>
<p class="toc_element">
  <code><a href="#enable">enable(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Enable a service so that it can be used with a project.</p>
<p class="toc_element">
  <code><a href="#generateServiceIdentity">generateServiceIdentity(parent, x__xgafv=None)</a></code></p>
<p class="firstline">Generate service identity for service.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the service configuration and enabled state for a given service.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, filter=None, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">List all services available to the specified project, and the current</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchEnable">batchEnable(parent, body=None, x__xgafv=None)</code>
  <pre>Enable multiple services on a project. The operation is atomic: if enabling
any service fails, then the entire batch fails, and no state changes occur.

Operation&lt;response: google.protobuf.Empty&gt;

Args:
  parent: string, Parent to enable services on.

An example name would be:
`projects/123`
where `123` is the project number (not project ID).

The `BatchEnableServices` method currently only supports projects. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for the `BatchEnableServices` method.
    &quot;serviceIds&quot;: [ # The identifiers of the services to enable on the project.
        # 
        # A valid identifier would be:
        # serviceusage.googleapis.com
        # 
        # Enabling services requires that each service is public or is shared with
        # the user enabling the service.
        # 
        # Two or more services must be specified. To enable a single service,
        # use the `EnableService` method instead.
        # 
        # A single request can enable a maximum of 20 services at a time. If more
        # than 20 services are specified, the request will fail, and no state changes
        # will occur.
      &quot;A String&quot;,
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

<div class="method">
    <code class="details" id="disable">disable(name, body=None, x__xgafv=None)</code>
  <pre>Disable a service so that it can no longer be used with a project.
This prevents unintended usage that may cause unexpected billing
charges or security leaks.

It is not valid to call the disable method on a service that is not
currently enabled. Callers will receive a `FAILED_PRECONDITION` status if
the target service is not currently enabled.

Operation&lt;response: google.protobuf.Empty&gt;

Args:
  name: string, Name of the consumer and service to disable the service on.

The enable and disable methods currently only support projects.

An example name would be:
`projects/123/services/serviceusage.googleapis.com`
where `123` is the project number (not project ID). (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for the `DisableService` method.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

<div class="method">
    <code class="details" id="enable">enable(name, body=None, x__xgafv=None)</code>
  <pre>Enable a service so that it can be used with a project.

Operation&lt;response: google.protobuf.Empty&gt;

Args:
  name: string, Name of the consumer and service to enable the service on.

The `EnableService` and `DisableService` methods currently only support
projects.

Enabling a service requires that the service is public or is shared with
the user enabling the service.

An example name would be:
`projects/123/services/serviceusage.googleapis.com`
where `123` is the project number (not project ID). (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for the `EnableService` method.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

<div class="method">
    <code class="details" id="generateServiceIdentity">generateServiceIdentity(parent, x__xgafv=None)</code>
  <pre>Generate service identity for service.

Args:
  parent: string, Name of the consumer and service to generate an identity for.

The `GenerateServiceIdentity` methods currently only support projects.

An example name would be:
`projects/123/services/example.googleapis.com` where `123` is the
project number. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Returns the service configuration and enabled state for a given service.

Args:
  name: string, Name of the consumer and service to get the `ConsumerState` for.

An example name would be:
`projects/123/services/serviceusage.googleapis.com`
where `123` is the project number (not project ID). (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A service that is available for use by the consumer.
    &quot;name&quot;: &quot;A String&quot;, # The resource name of the consumer and service.
        #
        # A valid name would be:
        # - projects/123/services/serviceusage.googleapis.com
    &quot;state&quot;: &quot;A String&quot;, # Whether or not the service has been enabled for use by the consumer.
    &quot;config&quot;: { # The configuration of the service. # The service configuration of the available service.
        # Some fields may be filtered out of the configuration in responses to
        # the `ListServices` method. These fields are present only in responses to
        # the `GetService` method.
      &quot;title&quot;: &quot;A String&quot;, # The product title for this service.
      &quot;name&quot;: &quot;A String&quot;, # The DNS address at which this service is available.
          #
          # An example DNS address would be:
          # `calendar.googleapis.com`.
      &quot;usage&quot;: { # Configuration controlling usage of a service. # Configuration controlling usage of this service.
        &quot;rules&quot;: [ # A list of usage rules that apply to individual API methods.
            #
            # **NOTE:** All service configuration rules follow &quot;last one wins&quot; order.
          { # Usage configuration rules for the service.
              #
              # NOTE: Under development.
              #
              #
              # Use this rule to configure unregistered calls for the service. Unregistered
              # calls are calls that do not contain consumer project identity.
              # (Example: calls that do not contain an API key).
              # By default, API methods do not allow unregistered calls, and each method call
              # must be identified by a consumer project identity. Use this rule to
              # allow/disallow unregistered calls.
              #
              # Example of an API that wants to allow unregistered calls for entire service.
              #
              #     usage:
              #       rules:
              #       - selector: &quot;*&quot;
              #         allow_unregistered_calls: true
              #
              # Example of a method that wants to allow unregistered calls.
              #
              #     usage:
              #       rules:
              #       - selector: &quot;google.example.library.v1.LibraryService.CreateBook&quot;
              #         allow_unregistered_calls: true
            &quot;skipServiceControl&quot;: True or False, # If true, the selected method should skip service control and the control
                # plane features, such as quota and billing, will not be available.
                # This flag is used by Google Cloud Endpoints to bypass checks for internal
                # methods, such as service health check methods.
            &quot;allowUnregisteredCalls&quot;: True or False, # If true, the selected method allows unregistered calls, e.g. calls
                # that don&#x27;t identify any user or application.
            &quot;selector&quot;: &quot;A String&quot;, # Selects the methods to which this rule applies. Use &#x27;*&#x27; to indicate all
                # methods in all APIs.
                #
                # Refer to selector for syntax details.
          },
        ],
        &quot;requirements&quot;: [ # Requirements that must be satisfied before a consumer project can use the
            # service. Each requirement is of the form &lt;service.name&gt;/&lt;requirement-id&gt;;
            # for example &#x27;serviceusage.googleapis.com/billing-enabled&#x27;.
          &quot;A String&quot;,
        ],
        &quot;serviceIdentity&quot;: { # The per-product per-project service identity for a service. # The configuration of a per-product per-project service identity.
            #
            #
            # Use this field to configure per-product per-project service identity.
            # Example of a service identity configuration.
            #
            #     usage:
            #       service_identity:
            #       - service_account_parent: &quot;projects/123456789&quot;
            #         display_name: &quot;Cloud XXX Service Agent&quot;
            #         description: &quot;Used as the identity of Cloud XXX to access resources&quot;
          &quot;description&quot;: &quot;A String&quot;, # Optional. A user-specified opaque description of the service account.
              # Must be less than or equal to 256 UTF-8 bytes.
          &quot;displayName&quot;: &quot;A String&quot;, # Optional. A user-specified name for the service account.
              # Must be less than or equal to 100 UTF-8 bytes.
          &quot;serviceAccountParent&quot;: &quot;A String&quot;, # A service account project that hosts the service accounts.
              #
              # An example name would be:
              # `projects/123456789`
        },
        &quot;producerNotificationChannel&quot;: &quot;A String&quot;, # The full resource name of a channel used for sending notifications to the
            # service producer.
            #
            # Google Service Management currently only supports
            # [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification
            # channel. To use Google Cloud Pub/Sub as the channel, this must be the name
            # of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format
            # documented in https://cloud.google.com/pubsub/docs/overview.
      },
      &quot;endpoints&quot;: [ # Configuration for network endpoints. Contains only the names and aliases
          # of the endpoints.
        { # `Endpoint` describes a network endpoint that serves a set of APIs.
            # A service may expose any number of endpoints, and all endpoints share the
            # same service configuration, such as quota configuration and monitoring
            # configuration.
            #
            # Example service configuration:
            #
            #     name: library-example.googleapis.com
            #     endpoints:
            #       # Below entry makes &#x27;google.example.library.v1.Library&#x27;
            #       # API be served from endpoint address library-example.googleapis.com.
            #       # It also allows HTTP OPTIONS calls to be passed to the backend, for
            #       # it to decide whether the subsequent cross-origin request is
            #       # allowed to proceed.
            #     - name: library-example.googleapis.com
            #       allow_cors: true
          &quot;allowCors&quot;: True or False, # Allowing
              # [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka
              # cross-domain traffic, would allow the backends served from this endpoint to
              # receive and respond to HTTP OPTIONS requests. The response will be used by
              # the browser to determine whether the subsequent cross-origin request is
              # allowed to proceed.
          &quot;target&quot;: &quot;A String&quot;, # The specification of an Internet routable address of API frontend that will
              # handle requests to this [API
              # Endpoint](https://cloud.google.com/apis/design/glossary). It should be
              # either a valid IPv4 address or a fully-qualified domain name. For example,
              # &quot;8.8.8.8&quot; or &quot;myservice.appspot.com&quot;.
          &quot;name&quot;: &quot;A String&quot;, # The canonical name of this endpoint.
          &quot;aliases&quot;: [ # DEPRECATED: This field is no longer supported. Instead of using aliases,
              # please specify multiple google.api.Endpoint for each of the intended
              # aliases.
              #
              # Additional names that this endpoint will be hosted on.
            &quot;A String&quot;,
          ],
        },
      ],
      &quot;authentication&quot;: { # `Authentication` defines the authentication configuration for an API. # Auth configuration. Contains only the OAuth rules.
          #
          # Example for an API targeted for external use:
          #
          #     name: calendar.googleapis.com
          #     authentication:
          #       providers:
          #       - id: google_calendar_auth
          #         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
          #         issuer: https://securetoken.google.com
          #       rules:
          #       - selector: &quot;*&quot;
          #         requirements:
          #           provider_id: google_calendar_auth
        &quot;providers&quot;: [ # Defines a set of authentication providers that a service supports.
          { # Configuration for an authentication provider, including support for
              # [JSON Web Token
              # (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
            &quot;jwksUri&quot;: &quot;A String&quot;, # URL of the provider&#x27;s public key set to validate signature of the JWT. See
                # [OpenID
                # Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).
                # Optional if the key set document:
                #  - can be retrieved from
                #    [OpenID
                #    Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html of
                #    the issuer.
                #  - can be inferred from the email domain of the issuer (e.g. a Google
                #  service account).
                #
                # Example: https://www.googleapis.com/oauth2/v1/certs
            &quot;authorizationUrl&quot;: &quot;A String&quot;, # Redirect URL if JWT token is required but not present or is expired.
                # Implement authorizationUrl of securityDefinitions in OpenAPI spec.
            &quot;issuer&quot;: &quot;A String&quot;, # Identifies the principal that issued the JWT. See
                # https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1
                # Usually a URL or an email address.
                #
                # Example: https://securetoken.google.com
                # Example: 1234567-compute@developer.gserviceaccount.com
            &quot;jwtLocations&quot;: [ # Defines the locations to extract the JWT.
                #
                # JWT locations can be either from HTTP headers or URL query parameters.
                # The rule is that the first match wins. The checking order is: checking
                # all headers first, then URL query parameters.
                #
                # If not specified,  default to use following 3 locations:
                #    1) Authorization: Bearer
                #    2) x-goog-iap-jwt-assertion
                #    3) access_token query parameter
                #
                # Default locations can be specified as followings:
                #    jwt_locations:
                #    - header: Authorization
                #      value_prefix: &quot;Bearer &quot;
                #    - header: x-goog-iap-jwt-assertion
                #    - query: access_token
              { # Specifies a location to extract JWT from an API request.
                &quot;query&quot;: &quot;A String&quot;, # Specifies URL query parameter name to extract JWT token.
                &quot;valuePrefix&quot;: &quot;A String&quot;, # The value prefix. The value format is &quot;value_prefix{token}&quot;
                    # Only applies to &quot;in&quot; header type. Must be empty for &quot;in&quot; query type.
                    # If not empty, the header value has to match (case sensitive) this prefix.
                    # If not matched, JWT will not be extracted. If matched, JWT will be
                    # extracted after the prefix is removed.
                    #
                    # For example, for &quot;Authorization: Bearer {JWT}&quot;,
                    # value_prefix=&quot;Bearer &quot; with a space at the end.
                &quot;header&quot;: &quot;A String&quot;, # Specifies HTTP header name to extract JWT token.
              },
            ],
            &quot;id&quot;: &quot;A String&quot;, # The unique identifier of the auth provider. It will be referred to by
                # `AuthRequirement.provider_id`.
                #
                # Example: &quot;bookstore_auth&quot;.
            &quot;audiences&quot;: &quot;A String&quot;, # The list of JWT
                # [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
                # that are allowed to access. A JWT containing any of these audiences will
                # be accepted. When this setting is absent, JWTs with audiences:
                #   - &quot;https://[service.name]/[google.protobuf.Api.name]&quot;
                #   - &quot;https://[service.name]/&quot;
                # will be accepted.
                # For example, if no audiences are in the setting, LibraryService API will
                # accept JWTs with the following audiences:
                #   -
                #   https://library-example.googleapis.com/google.example.library.v1.LibraryService
                #   - https://library-example.googleapis.com/
                #
                # Example:
                #
                #     audiences: bookstore_android.apps.googleusercontent.com,
                #                bookstore_web.apps.googleusercontent.com
          },
        ],
        &quot;rules&quot;: [ # A list of authentication rules that apply to individual API methods.
            #
            # **NOTE:** All service configuration rules follow &quot;last one wins&quot; order.
          { # Authentication rules for the service.
              #
              # By default, if a method has any authentication requirements, every request
              # must include a valid credential matching one of the requirements.
              # It&#x27;s an error to include more than one kind of credential in a single
              # request.
              #
              # If a method doesn&#x27;t have any auth requirements, request credentials will be
              # ignored.
            &quot;selector&quot;: &quot;A String&quot;, # Selects the methods to which this rule applies.
                #
                # Refer to selector for syntax details.
            &quot;requirements&quot;: [ # Requirements for additional authentication providers.
              { # User-defined authentication requirements, including support for
                  # [JSON Web Token
                  # (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
                &quot;providerId&quot;: &quot;A String&quot;, # id from authentication provider.
                    #
                    # Example:
                    #
                    #     provider_id: bookstore_auth
                &quot;audiences&quot;: &quot;A String&quot;, # NOTE: This will be deprecated soon, once AuthProvider.audiences is
                    # implemented and accepted in all the runtime components.
                    #
                    # The list of JWT
                    # [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
                    # that are allowed to access. A JWT containing any of these audiences will
                    # be accepted. When this setting is absent, only JWTs with audience
                    # &quot;https://Service_name/API_name&quot;
                    # will be accepted. For example, if no audiences are in the setting,
                    # LibraryService API will only accept JWTs with the following audience
                    # &quot;https://library-example.googleapis.com/google.example.library.v1.LibraryService&quot;.
                    #
                    # Example:
                    #
                    #     audiences: bookstore_android.apps.googleusercontent.com,
                    #                bookstore_web.apps.googleusercontent.com
              },
            ],
            &quot;oauth&quot;: { # OAuth scopes are a way to define data and permissions on data. For example, # The requirements for OAuth credentials.
                # there are scopes defined for &quot;Read-only access to Google Calendar&quot; and
                # &quot;Access to Cloud Platform&quot;. Users can consent to a scope for an application,
                # giving it permission to access that data on their behalf.
                #
                # OAuth scope specifications should be fairly coarse grained; a user will need
                # to see and understand the text description of what your scope means.
                #
                # In most cases: use one or at most two OAuth scopes for an entire family of
                # products. If your product has multiple APIs, you should probably be sharing
                # the OAuth scope across all of those APIs.
                #
                # When you need finer grained OAuth consent screens: talk with your product
                # management about how developers will use them in practice.
                #
                # Please note that even though each of the canonical scopes is enough for a
                # request to be accepted and passed to the backend, a request can still fail
                # due to the backend requiring additional scopes or permissions.
              &quot;canonicalScopes&quot;: &quot;A String&quot;, # The list of publicly documented OAuth scopes that are allowed access. An
                  # OAuth token containing any of these scopes will be accepted.
                  #
                  # Example:
                  #
                  #      canonical_scopes: https://www.googleapis.com/auth/calendar,
                  #                        https://www.googleapis.com/auth/calendar.read
            },
            &quot;allowWithoutCredential&quot;: True or False, # If true, the service accepts API keys without any other credential.
          },
        ],
      },
      &quot;apis&quot;: [ # A list of API interfaces exported by this service. Contains only the names,
          # versions, and method names of the interfaces.
        { # Api is a light-weight descriptor for an API Interface.
            #
            # Interfaces are also described as &quot;protocol buffer services&quot; in some contexts,
            # such as by the &quot;service&quot; keyword in a .proto file, but they are different
            # from API Services, which represent a concrete implementation of an interface
            # as opposed to simply a description of methods and bindings. They are also
            # sometimes simply referred to as &quot;APIs&quot; in other contexts, such as the name of
            # this message itself. See https://cloud.google.com/apis/design/glossary for
            # detailed terminology.
          &quot;options&quot;: [ # Any metadata attached to the interface.
            { # A protocol buffer option, which can be attached to a message, field,
                # enumeration, etc.
              &quot;value&quot;: { # The option&#x27;s value packed in an Any message. If the value is a primitive,
                  # the corresponding wrapper type defined in google/protobuf/wrappers.proto
                  # should be used. If the value is an enum, it should be stored as an int32
                  # value using the google.protobuf.Int32Value type.
                &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
              },
              &quot;name&quot;: &quot;A String&quot;, # The option&#x27;s name. For protobuf built-in options (options defined in
                  # descriptor.proto), this is the short name. For example, `&quot;map_entry&quot;`.
                  # For custom options, it should be the fully-qualified name. For example,
                  # `&quot;google.api.http&quot;`.
            },
          ],
          &quot;version&quot;: &quot;A String&quot;, # A version string for this interface. If specified, must have the form
              # `major-version.minor-version`, as in `1.10`. If the minor version is
              # omitted, it defaults to zero. If the entire version field is empty, the
              # major version is derived from the package name, as outlined below. If the
              # field is not empty, the version in the package name will be verified to be
              # consistent with what is provided here.
              #
              # The versioning schema uses [semantic
              # versioning](http://semver.org) where the major version number
              # indicates a breaking change and the minor version an additive,
              # non-breaking change. Both version numbers are signals to users
              # what to expect from different versions, and should be carefully
              # chosen based on the product plan.
              #
              # The major version is also reflected in the package name of the
              # interface, which must end in `v&lt;major-version&gt;`, as in
              # `google.feature.v1`. For major versions 0 and 1, the suffix can
              # be omitted. Zero major versions must only be used for
              # experimental, non-GA interfaces.
          &quot;mixins&quot;: [ # Included interfaces. See Mixin.
            { # Declares an API Interface to be included in this interface. The including
                # interface must redeclare all the methods from the included interface, but
                # documentation and options are inherited as follows:
                #
                # - If after comment and whitespace stripping, the documentation
                #   string of the redeclared method is empty, it will be inherited
                #   from the original method.
                #
                # - Each annotation belonging to the service config (http,
                #   visibility) which is not set in the redeclared method will be
                #   inherited.
                #
                # - If an http annotation is inherited, the path pattern will be
                #   modified as follows. Any version prefix will be replaced by the
                #   version of the including interface plus the root path if
                #   specified.
                #
                # Example of a simple mixin:
                #
                #     package google.acl.v1;
                #     service AccessControl {
                #       // Get the underlying ACL object.
                #       rpc GetAcl(GetAclRequest) returns (Acl) {
                #         option (google.api.http).get = &quot;/v1/{resource=**}:getAcl&quot;;
                #       }
                #     }
                #
                #     package google.storage.v2;
                #     service Storage {
                #       //       rpc GetAcl(GetAclRequest) returns (Acl);
                #
                #       // Get a data record.
                #       rpc GetData(GetDataRequest) returns (Data) {
                #         option (google.api.http).get = &quot;/v2/{resource=**}&quot;;
                #       }
                #     }
                #
                # Example of a mixin configuration:
                #
                #     apis:
                #     - name: google.storage.v2.Storage
                #       mixins:
                #       - name: google.acl.v1.AccessControl
                #
                # The mixin construct implies that all methods in `AccessControl` are
                # also declared with same name and request/response types in
                # `Storage`. A documentation generator or annotation processor will
                # see the effective `Storage.GetAcl` method after inherting
                # documentation and annotations as follows:
                #
                #     service Storage {
                #       // Get the underlying ACL object.
                #       rpc GetAcl(GetAclRequest) returns (Acl) {
                #         option (google.api.http).get = &quot;/v2/{resource=**}:getAcl&quot;;
                #       }
                #       ...
                #     }
                #
                # Note how the version in the path pattern changed from `v1` to `v2`.
                #
                # If the `root` field in the mixin is specified, it should be a
                # relative path under which inherited HTTP paths are placed. Example:
                #
                #     apis:
                #     - name: google.storage.v2.Storage
                #       mixins:
                #       - name: google.acl.v1.AccessControl
                #         root: acls
                #
                # This implies the following inherited HTTP annotation:
                #
                #     service Storage {
                #       // Get the underlying ACL object.
                #       rpc GetAcl(GetAclRequest) returns (Acl) {
                #         option (google.api.http).get = &quot;/v2/acls/{resource=**}:getAcl&quot;;
                #       }
                #       ...
                #     }
              &quot;root&quot;: &quot;A String&quot;, # If non-empty specifies a path under which inherited HTTP paths
                  # are rooted.
              &quot;name&quot;: &quot;A String&quot;, # The fully qualified name of the interface which is included.
            },
          ],
          &quot;sourceContext&quot;: { # `SourceContext` represents information about the source of a # Source context for the protocol buffer service represented by this
              # message.
              # protobuf element, like the file in which it is defined.
            &quot;fileName&quot;: &quot;A String&quot;, # The path-qualified name of the .proto file that contained the associated
                # protobuf element.  For example: `&quot;google/protobuf/source_context.proto&quot;`.
          },
          &quot;name&quot;: &quot;A String&quot;, # The fully qualified name of this interface, including package name
              # followed by the interface&#x27;s simple name.
          &quot;methods&quot;: [ # The methods of this interface, in unspecified order.
            { # Method represents a method of an API interface.
              &quot;requestStreaming&quot;: True or False, # If true, the request is streamed.
              &quot;responseTypeUrl&quot;: &quot;A String&quot;, # The URL of the output message type.
              &quot;syntax&quot;: &quot;A String&quot;, # The source syntax of this method.
              &quot;name&quot;: &quot;A String&quot;, # The simple name of this method.
              &quot;responseStreaming&quot;: True or False, # If true, the response is streamed.
              &quot;options&quot;: [ # Any metadata attached to the method.
                { # A protocol buffer option, which can be attached to a message, field,
                    # enumeration, etc.
                  &quot;value&quot;: { # The option&#x27;s value packed in an Any message. If the value is a primitive,
                      # the corresponding wrapper type defined in google/protobuf/wrappers.proto
                      # should be used. If the value is an enum, it should be stored as an int32
                      # value using the google.protobuf.Int32Value type.
                    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                  },
                  &quot;name&quot;: &quot;A String&quot;, # The option&#x27;s name. For protobuf built-in options (options defined in
                      # descriptor.proto), this is the short name. For example, `&quot;map_entry&quot;`.
                      # For custom options, it should be the fully-qualified name. For example,
                      # `&quot;google.api.http&quot;`.
                },
              ],
              &quot;requestTypeUrl&quot;: &quot;A String&quot;, # A URL of the input message type.
            },
          ],
          &quot;syntax&quot;: &quot;A String&quot;, # The source syntax of the service.
        },
      ],
      &quot;quota&quot;: { # Quota configuration helps to achieve fairness and budgeting in service # Quota configuration.
          # usage.
          #
          # The metric based quota configuration works this way:
          # - The service configuration defines a set of metrics.
          # - For API calls, the quota.metric_rules maps methods to metrics with
          #   corresponding costs.
          # - The quota.limits defines limits on the metrics, which will be used for
          #   quota checks at runtime.
          #
          # An example quota configuration in yaml format:
          #
          #    quota:
          #      limits:
          #
          #      - name: apiWriteQpsPerProject
          #        metric: library.googleapis.com/write_calls
          #        unit: &quot;1/min/{project}&quot;  # rate limit for consumer projects
          #        values:
          #          STANDARD: 10000
          #
          #
          #      # The metric rules bind all methods to the read_calls metric,
          #      # except for the UpdateBook and DeleteBook methods. These two methods
          #      # are mapped to the write_calls metric, with the UpdateBook method
          #      # consuming at twice rate as the DeleteBook method.
          #      metric_rules:
          #      - selector: &quot;*&quot;
          #        metric_costs:
          #          library.googleapis.com/read_calls: 1
          #      - selector: google.example.library.v1.LibraryService.UpdateBook
          #        metric_costs:
          #          library.googleapis.com/write_calls: 2
          #      - selector: google.example.library.v1.LibraryService.DeleteBook
          #        metric_costs:
          #          library.googleapis.com/write_calls: 1
          #
          #  Corresponding Metric definition:
          #
          #      metrics:
          #      - name: library.googleapis.com/read_calls
          #        display_name: Read requests
          #        metric_kind: DELTA
          #        value_type: INT64
          #
          #      - name: library.googleapis.com/write_calls
          #        display_name: Write requests
          #        metric_kind: DELTA
          #        value_type: INT64
          #
        &quot;metricRules&quot;: [ # List of `MetricRule` definitions, each one mapping a selected method to one
            # or more metrics.
          { # Bind API methods to metrics. Binding a method to a metric causes that
              # metric&#x27;s configured quota behaviors to apply to the method call.
            &quot;selector&quot;: &quot;A String&quot;, # Selects the methods to which this rule applies.
                #
                # Refer to selector for syntax details.
            &quot;metricCosts&quot;: { # Metrics to update when the selected methods are called, and the associated
                # cost applied to each metric.
                #
                # The key of the map is the metric name, and the values are the amount
                # increased for the metric against which the quota limits are defined.
                # The value must not be negative.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
          },
        ],
        &quot;limits&quot;: [ # List of `QuotaLimit` definitions for the service.
          { # `QuotaLimit` defines a specific limit that applies over a specified duration
              # for a limit type. There can be at most one limit for a duration and limit
              # type combination defined within a `QuotaGroup`.
            &quot;values&quot;: { # Tiered limit values. You must specify this as a key:value pair, with an
                # integer value that is the maximum number of requests allowed for the
                # specified unit. Currently only STANDARD is supported.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;name&quot;: &quot;A String&quot;, # Name of the quota limit.
                #
                # The name must be provided, and it must be unique within the service. The
                # name can only include alphanumeric characters as well as &#x27;-&#x27;.
                #
                # The maximum length of the limit name is 64 characters.
            &quot;unit&quot;: &quot;A String&quot;, # Specify the unit of the quota limit. It uses the same syntax as
                # Metric.unit. The supported unit kinds are determined by the quota
                # backend system.
                #
                # Here are some examples:
                # * &quot;1/min/{project}&quot; for quota per minute per project.
                #
                # Note: the order of unit components is insignificant.
                # The &quot;1&quot; at the beginning is required to follow the metric unit syntax.
            &quot;defaultLimit&quot;: &quot;A String&quot;, # Default number of tokens that can be consumed during the specified
                # duration. This is the number of tokens assigned when a client
                # application developer activates the service for his/her project.
                #
                # Specifying a value of 0 will block all requests. This can be used if you
                # are provisioning quota to selected consumers and blocking others.
                # Similarly, a value of -1 will indicate an unlimited quota. No other
                # negative values are allowed.
                #
                # Used by group-based quotas only.
            &quot;freeTier&quot;: &quot;A String&quot;, # Free tier value displayed in the Developers Console for this limit.
                # The free tier is the number of tokens that will be subtracted from the
                # billed amount when billing is enabled.
                # This field can only be set on a limit with duration &quot;1d&quot;, in a billable
                # group; it is invalid on any other limit. If this field is not set, it
                # defaults to 0, indicating that there is no free tier for this service.
                #
                # Used by group-based quotas only.
            &quot;maxLimit&quot;: &quot;A String&quot;, # Maximum number of tokens that can be consumed during the specified
                # duration. Client application developers can override the default limit up
                # to this maximum. If specified, this value cannot be set to a value less
                # than the default limit. If not specified, it is set to the default limit.
                #
                # To allow clients to apply overrides with no upper bound, set this to -1,
                # indicating unlimited maximum quota.
                #
                # Used by group-based quotas only.
            &quot;description&quot;: &quot;A String&quot;, # Optional. User-visible, extended description for this quota limit.
                # Should be used only when more context is needed to understand this limit
                # than provided by the limit&#x27;s display name (see: `display_name`).
            &quot;metric&quot;: &quot;A String&quot;, # The name of the metric this quota limit applies to. The quota limits with
                # the same metric will be checked together during runtime. The metric must be
                # defined within the service config.
            &quot;displayName&quot;: &quot;A String&quot;, # User-visible display name for this limit.
                # Optional. If not set, the UI will provide a default display name based on
                # the quota configuration. This field can be used to override the default
                # display name generated from the configuration.
            &quot;duration&quot;: &quot;A String&quot;, # Duration of this limit in textual notation. Must be &quot;100s&quot; or &quot;1d&quot;.
                #
                # Used by group-based quotas only.
          },
        ],
      },
      &quot;documentation&quot;: { # `Documentation` provides the information for describing a service. # Additional API documentation. Contains only the summary and the
          # documentation URL.
          #
          # Example:
          # &lt;pre&gt;&lt;code&gt;documentation:
          #   summary: &gt;
          #     The Google Calendar API gives access
          #     to most calendar features.
          #   pages:
          #   - name: Overview
          #     content: &amp;#40;== include google/foo/overview.md ==&amp;#41;
          #   - name: Tutorial
          #     content: &amp;#40;== include google/foo/tutorial.md ==&amp;#41;
          #     subpages;
          #     - name: Java
          #       content: &amp;#40;== include google/foo/tutorial_java.md ==&amp;#41;
          #   rules:
          #   - selector: google.calendar.Calendar.Get
          #     description: &gt;
          #       ...
          #   - selector: google.calendar.Calendar.Put
          #     description: &gt;
          #       ...
          # &lt;/code&gt;&lt;/pre&gt;
          # Documentation is provided in markdown syntax. In addition to
          # standard markdown features, definition lists, tables and fenced
          # code blocks are supported. Section headers can be provided and are
          # interpreted relative to the section nesting of the context where
          # a documentation fragment is embedded.
          #
          # Documentation from the IDL is merged with documentation defined
          # via the config at normalization time, where documentation provided
          # by config rules overrides IDL provided.
          #
          # A number of constructs specific to the API platform are supported
          # in documentation text.
          #
          # In order to reference a proto element, the following
          # notation can be used:
          # &lt;pre&gt;&lt;code&gt;&amp;#91;fully.qualified.proto.name]&amp;#91;]&lt;/code&gt;&lt;/pre&gt;
          # To override the display text used for the link, this can be used:
          # &lt;pre&gt;&lt;code&gt;&amp;#91;display text]&amp;#91;fully.qualified.proto.name]&lt;/code&gt;&lt;/pre&gt;
          # Text can be excluded from doc using the following notation:
          # &lt;pre&gt;&lt;code&gt;&amp;#40;-- internal comment --&amp;#41;&lt;/code&gt;&lt;/pre&gt;
          #
          # A few directives are available in documentation. Note that
          # directives must appear on a single line to be properly
          # identified. The `include` directive includes a markdown file from
          # an external source:
          # &lt;pre&gt;&lt;code&gt;&amp;#40;== include path/to/file ==&amp;#41;&lt;/code&gt;&lt;/pre&gt;
          # The `resource_for` directive marks a message to be the resource of
          # a collection in REST view. If it is not specified, tools attempt
          # to infer the resource from the operations in a collection:
          # &lt;pre&gt;&lt;code&gt;&amp;#40;== resource_for v1.shelves.books ==&amp;#41;&lt;/code&gt;&lt;/pre&gt;
          # The directive `suppress_warning` does not directly affect documentation
          # and is documented together with service config validation.
        &quot;serviceRootUrl&quot;: &quot;A String&quot;, # Specifies the service root url if the default one (the service name
            # from the yaml file) is not suitable. This can be seen in any fully
            # specified service urls as well as sections that show a base that other
            # urls are relative to.
        &quot;rules&quot;: [ # A list of documentation rules that apply to individual API elements.
            #
            # **NOTE:** All service configuration rules follow &quot;last one wins&quot; order.
          { # A documentation rule provides information about individual API elements.
            &quot;selector&quot;: &quot;A String&quot;, # The selector is a comma-separated list of patterns. Each pattern is a
                # qualified name of the element which may end in &quot;*&quot;, indicating a wildcard.
                # Wildcards are only allowed at the end and for a whole component of the
                # qualified name, i.e. &quot;foo.*&quot; is ok, but not &quot;foo.b*&quot; or &quot;foo.*.bar&quot;. A
                # wildcard will match one or more components. To specify a default for all
                # applicable elements, the whole pattern &quot;*&quot; is used.
            &quot;description&quot;: &quot;A String&quot;, # Description of the selected API(s).
            &quot;deprecationDescription&quot;: &quot;A String&quot;, # Deprecation description of the selected element(s). It can be provided if
                # an element is marked as `deprecated`.
          },
        ],
        &quot;documentationRootUrl&quot;: &quot;A String&quot;, # The URL to the root of documentation.
        &quot;summary&quot;: &quot;A String&quot;, # A short summary of what the service does. Can only be provided by
            # plain text.
        &quot;overview&quot;: &quot;A String&quot;, # Declares a single overview page. For example:
            # &lt;pre&gt;&lt;code&gt;documentation:
            #   summary: ...
            #   overview: &amp;#40;== include overview.md ==&amp;#41;
            # &lt;/code&gt;&lt;/pre&gt;
            # This is a shortcut for the following declaration (using pages style):
            # &lt;pre&gt;&lt;code&gt;documentation:
            #   summary: ...
            #   pages:
            #   - name: Overview
            #     content: &amp;#40;== include overview.md ==&amp;#41;
            # &lt;/code&gt;&lt;/pre&gt;
            # Note: you cannot specify both `overview` field and `pages` field.
        &quot;pages&quot;: [ # The top level pages for the documentation set.
          { # Represents a documentation page. A page can contain subpages to represent
              # nested documentation set structure.
            &quot;name&quot;: &quot;A String&quot;, # The name of the page. It will be used as an identity of the page to
                # generate URI of the page, text of the link to this page in navigation,
                # etc. The full page name (start from the root page name to this page
                # concatenated with `.`) can be used as reference to the page in your
                # documentation. For example:
                # &lt;pre&gt;&lt;code&gt;pages:
                # - name: Tutorial
                #   content: &amp;#40;== include tutorial.md ==&amp;#41;
                #   subpages:
                #   - name: Java
                #     content: &amp;#40;== include tutorial_java.md ==&amp;#41;
                # &lt;/code&gt;&lt;/pre&gt;
                # You can reference `Java` page using Markdown reference link syntax:
                # `Java`.
            &quot;content&quot;: &quot;A String&quot;, # The Markdown content of the page. You can use &lt;code&gt;&amp;#40;== include {path}
                # ==&amp;#41;&lt;/code&gt; to include content from a Markdown file.
            &quot;subpages&quot;: [ # Subpages of this page. The order of subpages specified here will be
                # honored in the generated docset.
              # Object with schema name: Page
            ],
          },
        ],
      },
    },
    &quot;parent&quot;: &quot;A String&quot;, # The resource name of the consumer.
        #
        # A valid name would be:
        # - projects/123
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, filter=None, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>List all services available to the specified project, and the current
state of those services with respect to the project. The list includes
all public services, all services for which the calling user has the
`servicemanagement.services.bind` permission, and all services that have
already been enabled on the project. The list can be filtered to
only include services in a specific state, for example to only include
services enabled on the project.

Args:
  parent: string, Parent to search for services on.

An example name would be:
`projects/123`
where `123` is the project number (not project ID). (required)
  filter: string, Only list services that conform to the given filter.
The allowed filter strings are `state:ENABLED` and `state:DISABLED`.
  pageToken: string, Token identifying which result to start with, which is returned by a
previous list call.
  pageSize: integer, Requested size of the next page of data.
Requested page size cannot exceed 200.
 If not set, the default page size is 50.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for the `ListServices` method.
    &quot;services&quot;: [ # The available services for the requested project.
      { # A service that is available for use by the consumer.
        &quot;name&quot;: &quot;A String&quot;, # The resource name of the consumer and service.
            #
            # A valid name would be:
            # - projects/123/services/serviceusage.googleapis.com
        &quot;state&quot;: &quot;A String&quot;, # Whether or not the service has been enabled for use by the consumer.
        &quot;config&quot;: { # The configuration of the service. # The service configuration of the available service.
            # Some fields may be filtered out of the configuration in responses to
            # the `ListServices` method. These fields are present only in responses to
            # the `GetService` method.
          &quot;title&quot;: &quot;A String&quot;, # The product title for this service.
          &quot;name&quot;: &quot;A String&quot;, # The DNS address at which this service is available.
              #
              # An example DNS address would be:
              # `calendar.googleapis.com`.
          &quot;usage&quot;: { # Configuration controlling usage of a service. # Configuration controlling usage of this service.
            &quot;rules&quot;: [ # A list of usage rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow &quot;last one wins&quot; order.
              { # Usage configuration rules for the service.
                  #
                  # NOTE: Under development.
                  #
                  #
                  # Use this rule to configure unregistered calls for the service. Unregistered
                  # calls are calls that do not contain consumer project identity.
                  # (Example: calls that do not contain an API key).
                  # By default, API methods do not allow unregistered calls, and each method call
                  # must be identified by a consumer project identity. Use this rule to
                  # allow/disallow unregistered calls.
                  #
                  # Example of an API that wants to allow unregistered calls for entire service.
                  #
                  #     usage:
                  #       rules:
                  #       - selector: &quot;*&quot;
                  #         allow_unregistered_calls: true
                  #
                  # Example of a method that wants to allow unregistered calls.
                  #
                  #     usage:
                  #       rules:
                  #       - selector: &quot;google.example.library.v1.LibraryService.CreateBook&quot;
                  #         allow_unregistered_calls: true
                &quot;skipServiceControl&quot;: True or False, # If true, the selected method should skip service control and the control
                    # plane features, such as quota and billing, will not be available.
                    # This flag is used by Google Cloud Endpoints to bypass checks for internal
                    # methods, such as service health check methods.
                &quot;allowUnregisteredCalls&quot;: True or False, # If true, the selected method allows unregistered calls, e.g. calls
                    # that don&#x27;t identify any user or application.
                &quot;selector&quot;: &quot;A String&quot;, # Selects the methods to which this rule applies. Use &#x27;*&#x27; to indicate all
                    # methods in all APIs.
                    #
                    # Refer to selector for syntax details.
              },
            ],
            &quot;requirements&quot;: [ # Requirements that must be satisfied before a consumer project can use the
                # service. Each requirement is of the form &lt;service.name&gt;/&lt;requirement-id&gt;;
                # for example &#x27;serviceusage.googleapis.com/billing-enabled&#x27;.
              &quot;A String&quot;,
            ],
            &quot;serviceIdentity&quot;: { # The per-product per-project service identity for a service. # The configuration of a per-product per-project service identity.
                #
                #
                # Use this field to configure per-product per-project service identity.
                # Example of a service identity configuration.
                #
                #     usage:
                #       service_identity:
                #       - service_account_parent: &quot;projects/123456789&quot;
                #         display_name: &quot;Cloud XXX Service Agent&quot;
                #         description: &quot;Used as the identity of Cloud XXX to access resources&quot;
              &quot;description&quot;: &quot;A String&quot;, # Optional. A user-specified opaque description of the service account.
                  # Must be less than or equal to 256 UTF-8 bytes.
              &quot;displayName&quot;: &quot;A String&quot;, # Optional. A user-specified name for the service account.
                  # Must be less than or equal to 100 UTF-8 bytes.
              &quot;serviceAccountParent&quot;: &quot;A String&quot;, # A service account project that hosts the service accounts.
                  #
                  # An example name would be:
                  # `projects/123456789`
            },
            &quot;producerNotificationChannel&quot;: &quot;A String&quot;, # The full resource name of a channel used for sending notifications to the
                # service producer.
                #
                # Google Service Management currently only supports
                # [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification
                # channel. To use Google Cloud Pub/Sub as the channel, this must be the name
                # of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format
                # documented in https://cloud.google.com/pubsub/docs/overview.
          },
          &quot;endpoints&quot;: [ # Configuration for network endpoints. Contains only the names and aliases
              # of the endpoints.
            { # `Endpoint` describes a network endpoint that serves a set of APIs.
                # A service may expose any number of endpoints, and all endpoints share the
                # same service configuration, such as quota configuration and monitoring
                # configuration.
                #
                # Example service configuration:
                #
                #     name: library-example.googleapis.com
                #     endpoints:
                #       # Below entry makes &#x27;google.example.library.v1.Library&#x27;
                #       # API be served from endpoint address library-example.googleapis.com.
                #       # It also allows HTTP OPTIONS calls to be passed to the backend, for
                #       # it to decide whether the subsequent cross-origin request is
                #       # allowed to proceed.
                #     - name: library-example.googleapis.com
                #       allow_cors: true
              &quot;allowCors&quot;: True or False, # Allowing
                  # [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka
                  # cross-domain traffic, would allow the backends served from this endpoint to
                  # receive and respond to HTTP OPTIONS requests. The response will be used by
                  # the browser to determine whether the subsequent cross-origin request is
                  # allowed to proceed.
              &quot;target&quot;: &quot;A String&quot;, # The specification of an Internet routable address of API frontend that will
                  # handle requests to this [API
                  # Endpoint](https://cloud.google.com/apis/design/glossary). It should be
                  # either a valid IPv4 address or a fully-qualified domain name. For example,
                  # &quot;8.8.8.8&quot; or &quot;myservice.appspot.com&quot;.
              &quot;name&quot;: &quot;A String&quot;, # The canonical name of this endpoint.
              &quot;aliases&quot;: [ # DEPRECATED: This field is no longer supported. Instead of using aliases,
                  # please specify multiple google.api.Endpoint for each of the intended
                  # aliases.
                  #
                  # Additional names that this endpoint will be hosted on.
                &quot;A String&quot;,
              ],
            },
          ],
          &quot;authentication&quot;: { # `Authentication` defines the authentication configuration for an API. # Auth configuration. Contains only the OAuth rules.
              #
              # Example for an API targeted for external use:
              #
              #     name: calendar.googleapis.com
              #     authentication:
              #       providers:
              #       - id: google_calendar_auth
              #         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
              #         issuer: https://securetoken.google.com
              #       rules:
              #       - selector: &quot;*&quot;
              #         requirements:
              #           provider_id: google_calendar_auth
            &quot;providers&quot;: [ # Defines a set of authentication providers that a service supports.
              { # Configuration for an authentication provider, including support for
                  # [JSON Web Token
                  # (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
                &quot;jwksUri&quot;: &quot;A String&quot;, # URL of the provider&#x27;s public key set to validate signature of the JWT. See
                    # [OpenID
                    # Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).
                    # Optional if the key set document:
                    #  - can be retrieved from
                    #    [OpenID
                    #    Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html of
                    #    the issuer.
                    #  - can be inferred from the email domain of the issuer (e.g. a Google
                    #  service account).
                    #
                    # Example: https://www.googleapis.com/oauth2/v1/certs
                &quot;authorizationUrl&quot;: &quot;A String&quot;, # Redirect URL if JWT token is required but not present or is expired.
                    # Implement authorizationUrl of securityDefinitions in OpenAPI spec.
                &quot;issuer&quot;: &quot;A String&quot;, # Identifies the principal that issued the JWT. See
                    # https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1
                    # Usually a URL or an email address.
                    #
                    # Example: https://securetoken.google.com
                    # Example: 1234567-compute@developer.gserviceaccount.com
                &quot;jwtLocations&quot;: [ # Defines the locations to extract the JWT.
                    #
                    # JWT locations can be either from HTTP headers or URL query parameters.
                    # The rule is that the first match wins. The checking order is: checking
                    # all headers first, then URL query parameters.
                    #
                    # If not specified,  default to use following 3 locations:
                    #    1) Authorization: Bearer
                    #    2) x-goog-iap-jwt-assertion
                    #    3) access_token query parameter
                    #
                    # Default locations can be specified as followings:
                    #    jwt_locations:
                    #    - header: Authorization
                    #      value_prefix: &quot;Bearer &quot;
                    #    - header: x-goog-iap-jwt-assertion
                    #    - query: access_token
                  { # Specifies a location to extract JWT from an API request.
                    &quot;query&quot;: &quot;A String&quot;, # Specifies URL query parameter name to extract JWT token.
                    &quot;valuePrefix&quot;: &quot;A String&quot;, # The value prefix. The value format is &quot;value_prefix{token}&quot;
                        # Only applies to &quot;in&quot; header type. Must be empty for &quot;in&quot; query type.
                        # If not empty, the header value has to match (case sensitive) this prefix.
                        # If not matched, JWT will not be extracted. If matched, JWT will be
                        # extracted after the prefix is removed.
                        #
                        # For example, for &quot;Authorization: Bearer {JWT}&quot;,
                        # value_prefix=&quot;Bearer &quot; with a space at the end.
                    &quot;header&quot;: &quot;A String&quot;, # Specifies HTTP header name to extract JWT token.
                  },
                ],
                &quot;id&quot;: &quot;A String&quot;, # The unique identifier of the auth provider. It will be referred to by
                    # `AuthRequirement.provider_id`.
                    #
                    # Example: &quot;bookstore_auth&quot;.
                &quot;audiences&quot;: &quot;A String&quot;, # The list of JWT
                    # [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
                    # that are allowed to access. A JWT containing any of these audiences will
                    # be accepted. When this setting is absent, JWTs with audiences:
                    #   - &quot;https://[service.name]/[google.protobuf.Api.name]&quot;
                    #   - &quot;https://[service.name]/&quot;
                    # will be accepted.
                    # For example, if no audiences are in the setting, LibraryService API will
                    # accept JWTs with the following audiences:
                    #   -
                    #   https://library-example.googleapis.com/google.example.library.v1.LibraryService
                    #   - https://library-example.googleapis.com/
                    #
                    # Example:
                    #
                    #     audiences: bookstore_android.apps.googleusercontent.com,
                    #                bookstore_web.apps.googleusercontent.com
              },
            ],
            &quot;rules&quot;: [ # A list of authentication rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow &quot;last one wins&quot; order.
              { # Authentication rules for the service.
                  #
                  # By default, if a method has any authentication requirements, every request
                  # must include a valid credential matching one of the requirements.
                  # It&#x27;s an error to include more than one kind of credential in a single
                  # request.
                  #
                  # If a method doesn&#x27;t have any auth requirements, request credentials will be
                  # ignored.
                &quot;selector&quot;: &quot;A String&quot;, # Selects the methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
                &quot;requirements&quot;: [ # Requirements for additional authentication providers.
                  { # User-defined authentication requirements, including support for
                      # [JSON Web Token
                      # (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
                    &quot;providerId&quot;: &quot;A String&quot;, # id from authentication provider.
                        #
                        # Example:
                        #
                        #     provider_id: bookstore_auth
                    &quot;audiences&quot;: &quot;A String&quot;, # NOTE: This will be deprecated soon, once AuthProvider.audiences is
                        # implemented and accepted in all the runtime components.
                        #
                        # The list of JWT
                        # [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).
                        # that are allowed to access. A JWT containing any of these audiences will
                        # be accepted. When this setting is absent, only JWTs with audience
                        # &quot;https://Service_name/API_name&quot;
                        # will be accepted. For example, if no audiences are in the setting,
                        # LibraryService API will only accept JWTs with the following audience
                        # &quot;https://library-example.googleapis.com/google.example.library.v1.LibraryService&quot;.
                        #
                        # Example:
                        #
                        #     audiences: bookstore_android.apps.googleusercontent.com,
                        #                bookstore_web.apps.googleusercontent.com
                  },
                ],
                &quot;oauth&quot;: { # OAuth scopes are a way to define data and permissions on data. For example, # The requirements for OAuth credentials.
                    # there are scopes defined for &quot;Read-only access to Google Calendar&quot; and
                    # &quot;Access to Cloud Platform&quot;. Users can consent to a scope for an application,
                    # giving it permission to access that data on their behalf.
                    #
                    # OAuth scope specifications should be fairly coarse grained; a user will need
                    # to see and understand the text description of what your scope means.
                    #
                    # In most cases: use one or at most two OAuth scopes for an entire family of
                    # products. If your product has multiple APIs, you should probably be sharing
                    # the OAuth scope across all of those APIs.
                    #
                    # When you need finer grained OAuth consent screens: talk with your product
                    # management about how developers will use them in practice.
                    #
                    # Please note that even though each of the canonical scopes is enough for a
                    # request to be accepted and passed to the backend, a request can still fail
                    # due to the backend requiring additional scopes or permissions.
                  &quot;canonicalScopes&quot;: &quot;A String&quot;, # The list of publicly documented OAuth scopes that are allowed access. An
                      # OAuth token containing any of these scopes will be accepted.
                      #
                      # Example:
                      #
                      #      canonical_scopes: https://www.googleapis.com/auth/calendar,
                      #                        https://www.googleapis.com/auth/calendar.read
                },
                &quot;allowWithoutCredential&quot;: True or False, # If true, the service accepts API keys without any other credential.
              },
            ],
          },
          &quot;apis&quot;: [ # A list of API interfaces exported by this service. Contains only the names,
              # versions, and method names of the interfaces.
            { # Api is a light-weight descriptor for an API Interface.
                #
                # Interfaces are also described as &quot;protocol buffer services&quot; in some contexts,
                # such as by the &quot;service&quot; keyword in a .proto file, but they are different
                # from API Services, which represent a concrete implementation of an interface
                # as opposed to simply a description of methods and bindings. They are also
                # sometimes simply referred to as &quot;APIs&quot; in other contexts, such as the name of
                # this message itself. See https://cloud.google.com/apis/design/glossary for
                # detailed terminology.
              &quot;options&quot;: [ # Any metadata attached to the interface.
                { # A protocol buffer option, which can be attached to a message, field,
                    # enumeration, etc.
                  &quot;value&quot;: { # The option&#x27;s value packed in an Any message. If the value is a primitive,
                      # the corresponding wrapper type defined in google/protobuf/wrappers.proto
                      # should be used. If the value is an enum, it should be stored as an int32
                      # value using the google.protobuf.Int32Value type.
                    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                  },
                  &quot;name&quot;: &quot;A String&quot;, # The option&#x27;s name. For protobuf built-in options (options defined in
                      # descriptor.proto), this is the short name. For example, `&quot;map_entry&quot;`.
                      # For custom options, it should be the fully-qualified name. For example,
                      # `&quot;google.api.http&quot;`.
                },
              ],
              &quot;version&quot;: &quot;A String&quot;, # A version string for this interface. If specified, must have the form
                  # `major-version.minor-version`, as in `1.10`. If the minor version is
                  # omitted, it defaults to zero. If the entire version field is empty, the
                  # major version is derived from the package name, as outlined below. If the
                  # field is not empty, the version in the package name will be verified to be
                  # consistent with what is provided here.
                  #
                  # The versioning schema uses [semantic
                  # versioning](http://semver.org) where the major version number
                  # indicates a breaking change and the minor version an additive,
                  # non-breaking change. Both version numbers are signals to users
                  # what to expect from different versions, and should be carefully
                  # chosen based on the product plan.
                  #
                  # The major version is also reflected in the package name of the
                  # interface, which must end in `v&lt;major-version&gt;`, as in
                  # `google.feature.v1`. For major versions 0 and 1, the suffix can
                  # be omitted. Zero major versions must only be used for
                  # experimental, non-GA interfaces.
              &quot;mixins&quot;: [ # Included interfaces. See Mixin.
                { # Declares an API Interface to be included in this interface. The including
                    # interface must redeclare all the methods from the included interface, but
                    # documentation and options are inherited as follows:
                    #
                    # - If after comment and whitespace stripping, the documentation
                    #   string of the redeclared method is empty, it will be inherited
                    #   from the original method.
                    #
                    # - Each annotation belonging to the service config (http,
                    #   visibility) which is not set in the redeclared method will be
                    #   inherited.
                    #
                    # - If an http annotation is inherited, the path pattern will be
                    #   modified as follows. Any version prefix will be replaced by the
                    #   version of the including interface plus the root path if
                    #   specified.
                    #
                    # Example of a simple mixin:
                    #
                    #     package google.acl.v1;
                    #     service AccessControl {
                    #       // Get the underlying ACL object.
                    #       rpc GetAcl(GetAclRequest) returns (Acl) {
                    #         option (google.api.http).get = &quot;/v1/{resource=**}:getAcl&quot;;
                    #       }
                    #     }
                    #
                    #     package google.storage.v2;
                    #     service Storage {
                    #       //       rpc GetAcl(GetAclRequest) returns (Acl);
                    #
                    #       // Get a data record.
                    #       rpc GetData(GetDataRequest) returns (Data) {
                    #         option (google.api.http).get = &quot;/v2/{resource=**}&quot;;
                    #       }
                    #     }
                    #
                    # Example of a mixin configuration:
                    #
                    #     apis:
                    #     - name: google.storage.v2.Storage
                    #       mixins:
                    #       - name: google.acl.v1.AccessControl
                    #
                    # The mixin construct implies that all methods in `AccessControl` are
                    # also declared with same name and request/response types in
                    # `Storage`. A documentation generator or annotation processor will
                    # see the effective `Storage.GetAcl` method after inherting
                    # documentation and annotations as follows:
                    #
                    #     service Storage {
                    #       // Get the underlying ACL object.
                    #       rpc GetAcl(GetAclRequest) returns (Acl) {
                    #         option (google.api.http).get = &quot;/v2/{resource=**}:getAcl&quot;;
                    #       }
                    #       ...
                    #     }
                    #
                    # Note how the version in the path pattern changed from `v1` to `v2`.
                    #
                    # If the `root` field in the mixin is specified, it should be a
                    # relative path under which inherited HTTP paths are placed. Example:
                    #
                    #     apis:
                    #     - name: google.storage.v2.Storage
                    #       mixins:
                    #       - name: google.acl.v1.AccessControl
                    #         root: acls
                    #
                    # This implies the following inherited HTTP annotation:
                    #
                    #     service Storage {
                    #       // Get the underlying ACL object.
                    #       rpc GetAcl(GetAclRequest) returns (Acl) {
                    #         option (google.api.http).get = &quot;/v2/acls/{resource=**}:getAcl&quot;;
                    #       }
                    #       ...
                    #     }
                  &quot;root&quot;: &quot;A String&quot;, # If non-empty specifies a path under which inherited HTTP paths
                      # are rooted.
                  &quot;name&quot;: &quot;A String&quot;, # The fully qualified name of the interface which is included.
                },
              ],
              &quot;sourceContext&quot;: { # `SourceContext` represents information about the source of a # Source context for the protocol buffer service represented by this
                  # message.
                  # protobuf element, like the file in which it is defined.
                &quot;fileName&quot;: &quot;A String&quot;, # The path-qualified name of the .proto file that contained the associated
                    # protobuf element.  For example: `&quot;google/protobuf/source_context.proto&quot;`.
              },
              &quot;name&quot;: &quot;A String&quot;, # The fully qualified name of this interface, including package name
                  # followed by the interface&#x27;s simple name.
              &quot;methods&quot;: [ # The methods of this interface, in unspecified order.
                { # Method represents a method of an API interface.
                  &quot;requestStreaming&quot;: True or False, # If true, the request is streamed.
                  &quot;responseTypeUrl&quot;: &quot;A String&quot;, # The URL of the output message type.
                  &quot;syntax&quot;: &quot;A String&quot;, # The source syntax of this method.
                  &quot;name&quot;: &quot;A String&quot;, # The simple name of this method.
                  &quot;responseStreaming&quot;: True or False, # If true, the response is streamed.
                  &quot;options&quot;: [ # Any metadata attached to the method.
                    { # A protocol buffer option, which can be attached to a message, field,
                        # enumeration, etc.
                      &quot;value&quot;: { # The option&#x27;s value packed in an Any message. If the value is a primitive,
                          # the corresponding wrapper type defined in google/protobuf/wrappers.proto
                          # should be used. If the value is an enum, it should be stored as an int32
                          # value using the google.protobuf.Int32Value type.
                        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                      },
                      &quot;name&quot;: &quot;A String&quot;, # The option&#x27;s name. For protobuf built-in options (options defined in
                          # descriptor.proto), this is the short name. For example, `&quot;map_entry&quot;`.
                          # For custom options, it should be the fully-qualified name. For example,
                          # `&quot;google.api.http&quot;`.
                    },
                  ],
                  &quot;requestTypeUrl&quot;: &quot;A String&quot;, # A URL of the input message type.
                },
              ],
              &quot;syntax&quot;: &quot;A String&quot;, # The source syntax of the service.
            },
          ],
          &quot;quota&quot;: { # Quota configuration helps to achieve fairness and budgeting in service # Quota configuration.
              # usage.
              #
              # The metric based quota configuration works this way:
              # - The service configuration defines a set of metrics.
              # - For API calls, the quota.metric_rules maps methods to metrics with
              #   corresponding costs.
              # - The quota.limits defines limits on the metrics, which will be used for
              #   quota checks at runtime.
              #
              # An example quota configuration in yaml format:
              #
              #    quota:
              #      limits:
              #
              #      - name: apiWriteQpsPerProject
              #        metric: library.googleapis.com/write_calls
              #        unit: &quot;1/min/{project}&quot;  # rate limit for consumer projects
              #        values:
              #          STANDARD: 10000
              #
              #
              #      # The metric rules bind all methods to the read_calls metric,
              #      # except for the UpdateBook and DeleteBook methods. These two methods
              #      # are mapped to the write_calls metric, with the UpdateBook method
              #      # consuming at twice rate as the DeleteBook method.
              #      metric_rules:
              #      - selector: &quot;*&quot;
              #        metric_costs:
              #          library.googleapis.com/read_calls: 1
              #      - selector: google.example.library.v1.LibraryService.UpdateBook
              #        metric_costs:
              #          library.googleapis.com/write_calls: 2
              #      - selector: google.example.library.v1.LibraryService.DeleteBook
              #        metric_costs:
              #          library.googleapis.com/write_calls: 1
              #
              #  Corresponding Metric definition:
              #
              #      metrics:
              #      - name: library.googleapis.com/read_calls
              #        display_name: Read requests
              #        metric_kind: DELTA
              #        value_type: INT64
              #
              #      - name: library.googleapis.com/write_calls
              #        display_name: Write requests
              #        metric_kind: DELTA
              #        value_type: INT64
              #
            &quot;metricRules&quot;: [ # List of `MetricRule` definitions, each one mapping a selected method to one
                # or more metrics.
              { # Bind API methods to metrics. Binding a method to a metric causes that
                  # metric&#x27;s configured quota behaviors to apply to the method call.
                &quot;selector&quot;: &quot;A String&quot;, # Selects the methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
                &quot;metricCosts&quot;: { # Metrics to update when the selected methods are called, and the associated
                    # cost applied to each metric.
                    #
                    # The key of the map is the metric name, and the values are the amount
                    # increased for the metric against which the quota limits are defined.
                    # The value must not be negative.
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
              },
            ],
            &quot;limits&quot;: [ # List of `QuotaLimit` definitions for the service.
              { # `QuotaLimit` defines a specific limit that applies over a specified duration
                  # for a limit type. There can be at most one limit for a duration and limit
                  # type combination defined within a `QuotaGroup`.
                &quot;values&quot;: { # Tiered limit values. You must specify this as a key:value pair, with an
                    # integer value that is the maximum number of requests allowed for the
                    # specified unit. Currently only STANDARD is supported.
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
                &quot;name&quot;: &quot;A String&quot;, # Name of the quota limit.
                    #
                    # The name must be provided, and it must be unique within the service. The
                    # name can only include alphanumeric characters as well as &#x27;-&#x27;.
                    #
                    # The maximum length of the limit name is 64 characters.
                &quot;unit&quot;: &quot;A String&quot;, # Specify the unit of the quota limit. It uses the same syntax as
                    # Metric.unit. The supported unit kinds are determined by the quota
                    # backend system.
                    #
                    # Here are some examples:
                    # * &quot;1/min/{project}&quot; for quota per minute per project.
                    #
                    # Note: the order of unit components is insignificant.
                    # The &quot;1&quot; at the beginning is required to follow the metric unit syntax.
                &quot;defaultLimit&quot;: &quot;A String&quot;, # Default number of tokens that can be consumed during the specified
                    # duration. This is the number of tokens assigned when a client
                    # application developer activates the service for his/her project.
                    #
                    # Specifying a value of 0 will block all requests. This can be used if you
                    # are provisioning quota to selected consumers and blocking others.
                    # Similarly, a value of -1 will indicate an unlimited quota. No other
                    # negative values are allowed.
                    #
                    # Used by group-based quotas only.
                &quot;freeTier&quot;: &quot;A String&quot;, # Free tier value displayed in the Developers Console for this limit.
                    # The free tier is the number of tokens that will be subtracted from the
                    # billed amount when billing is enabled.
                    # This field can only be set on a limit with duration &quot;1d&quot;, in a billable
                    # group; it is invalid on any other limit. If this field is not set, it
                    # defaults to 0, indicating that there is no free tier for this service.
                    #
                    # Used by group-based quotas only.
                &quot;maxLimit&quot;: &quot;A String&quot;, # Maximum number of tokens that can be consumed during the specified
                    # duration. Client application developers can override the default limit up
                    # to this maximum. If specified, this value cannot be set to a value less
                    # than the default limit. If not specified, it is set to the default limit.
                    #
                    # To allow clients to apply overrides with no upper bound, set this to -1,
                    # indicating unlimited maximum quota.
                    #
                    # Used by group-based quotas only.
                &quot;description&quot;: &quot;A String&quot;, # Optional. User-visible, extended description for this quota limit.
                    # Should be used only when more context is needed to understand this limit
                    # than provided by the limit&#x27;s display name (see: `display_name`).
                &quot;metric&quot;: &quot;A String&quot;, # The name of the metric this quota limit applies to. The quota limits with
                    # the same metric will be checked together during runtime. The metric must be
                    # defined within the service config.
                &quot;displayName&quot;: &quot;A String&quot;, # User-visible display name for this limit.
                    # Optional. If not set, the UI will provide a default display name based on
                    # the quota configuration. This field can be used to override the default
                    # display name generated from the configuration.
                &quot;duration&quot;: &quot;A String&quot;, # Duration of this limit in textual notation. Must be &quot;100s&quot; or &quot;1d&quot;.
                    #
                    # Used by group-based quotas only.
              },
            ],
          },
          &quot;documentation&quot;: { # `Documentation` provides the information for describing a service. # Additional API documentation. Contains only the summary and the
              # documentation URL.
              #
              # Example:
              # &lt;pre&gt;&lt;code&gt;documentation:
              #   summary: &gt;
              #     The Google Calendar API gives access
              #     to most calendar features.
              #   pages:
              #   - name: Overview
              #     content: &amp;#40;== include google/foo/overview.md ==&amp;#41;
              #   - name: Tutorial
              #     content: &amp;#40;== include google/foo/tutorial.md ==&amp;#41;
              #     subpages;
              #     - name: Java
              #       content: &amp;#40;== include google/foo/tutorial_java.md ==&amp;#41;
              #   rules:
              #   - selector: google.calendar.Calendar.Get
              #     description: &gt;
              #       ...
              #   - selector: google.calendar.Calendar.Put
              #     description: &gt;
              #       ...
              # &lt;/code&gt;&lt;/pre&gt;
              # Documentation is provided in markdown syntax. In addition to
              # standard markdown features, definition lists, tables and fenced
              # code blocks are supported. Section headers can be provided and are
              # interpreted relative to the section nesting of the context where
              # a documentation fragment is embedded.
              #
              # Documentation from the IDL is merged with documentation defined
              # via the config at normalization time, where documentation provided
              # by config rules overrides IDL provided.
              #
              # A number of constructs specific to the API platform are supported
              # in documentation text.
              #
              # In order to reference a proto element, the following
              # notation can be used:
              # &lt;pre&gt;&lt;code&gt;&amp;#91;fully.qualified.proto.name]&amp;#91;]&lt;/code&gt;&lt;/pre&gt;
              # To override the display text used for the link, this can be used:
              # &lt;pre&gt;&lt;code&gt;&amp;#91;display text]&amp;#91;fully.qualified.proto.name]&lt;/code&gt;&lt;/pre&gt;
              # Text can be excluded from doc using the following notation:
              # &lt;pre&gt;&lt;code&gt;&amp;#40;-- internal comment --&amp;#41;&lt;/code&gt;&lt;/pre&gt;
              #
              # A few directives are available in documentation. Note that
              # directives must appear on a single line to be properly
              # identified. The `include` directive includes a markdown file from
              # an external source:
              # &lt;pre&gt;&lt;code&gt;&amp;#40;== include path/to/file ==&amp;#41;&lt;/code&gt;&lt;/pre&gt;
              # The `resource_for` directive marks a message to be the resource of
              # a collection in REST view. If it is not specified, tools attempt
              # to infer the resource from the operations in a collection:
              # &lt;pre&gt;&lt;code&gt;&amp;#40;== resource_for v1.shelves.books ==&amp;#41;&lt;/code&gt;&lt;/pre&gt;
              # The directive `suppress_warning` does not directly affect documentation
              # and is documented together with service config validation.
            &quot;serviceRootUrl&quot;: &quot;A String&quot;, # Specifies the service root url if the default one (the service name
                # from the yaml file) is not suitable. This can be seen in any fully
                # specified service urls as well as sections that show a base that other
                # urls are relative to.
            &quot;rules&quot;: [ # A list of documentation rules that apply to individual API elements.
                #
                # **NOTE:** All service configuration rules follow &quot;last one wins&quot; order.
              { # A documentation rule provides information about individual API elements.
                &quot;selector&quot;: &quot;A String&quot;, # The selector is a comma-separated list of patterns. Each pattern is a
                    # qualified name of the element which may end in &quot;*&quot;, indicating a wildcard.
                    # Wildcards are only allowed at the end and for a whole component of the
                    # qualified name, i.e. &quot;foo.*&quot; is ok, but not &quot;foo.b*&quot; or &quot;foo.*.bar&quot;. A
                    # wildcard will match one or more components. To specify a default for all
                    # applicable elements, the whole pattern &quot;*&quot; is used.
                &quot;description&quot;: &quot;A String&quot;, # Description of the selected API(s).
                &quot;deprecationDescription&quot;: &quot;A String&quot;, # Deprecation description of the selected element(s). It can be provided if
                    # an element is marked as `deprecated`.
              },
            ],
            &quot;documentationRootUrl&quot;: &quot;A String&quot;, # The URL to the root of documentation.
            &quot;summary&quot;: &quot;A String&quot;, # A short summary of what the service does. Can only be provided by
                # plain text.
            &quot;overview&quot;: &quot;A String&quot;, # Declares a single overview page. For example:
                # &lt;pre&gt;&lt;code&gt;documentation:
                #   summary: ...
                #   overview: &amp;#40;== include overview.md ==&amp;#41;
                # &lt;/code&gt;&lt;/pre&gt;
                # This is a shortcut for the following declaration (using pages style):
                # &lt;pre&gt;&lt;code&gt;documentation:
                #   summary: ...
                #   pages:
                #   - name: Overview
                #     content: &amp;#40;== include overview.md ==&amp;#41;
                # &lt;/code&gt;&lt;/pre&gt;
                # Note: you cannot specify both `overview` field and `pages` field.
            &quot;pages&quot;: [ # The top level pages for the documentation set.
              { # Represents a documentation page. A page can contain subpages to represent
                  # nested documentation set structure.
                &quot;name&quot;: &quot;A String&quot;, # The name of the page. It will be used as an identity of the page to
                    # generate URI of the page, text of the link to this page in navigation,
                    # etc. The full page name (start from the root page name to this page
                    # concatenated with `.`) can be used as reference to the page in your
                    # documentation. For example:
                    # &lt;pre&gt;&lt;code&gt;pages:
                    # - name: Tutorial
                    #   content: &amp;#40;== include tutorial.md ==&amp;#41;
                    #   subpages:
                    #   - name: Java
                    #     content: &amp;#40;== include tutorial_java.md ==&amp;#41;
                    # &lt;/code&gt;&lt;/pre&gt;
                    # You can reference `Java` page using Markdown reference link syntax:
                    # `Java`.
                &quot;content&quot;: &quot;A String&quot;, # The Markdown content of the page. You can use &lt;code&gt;&amp;#40;== include {path}
                    # ==&amp;#41;&lt;/code&gt; to include content from a Markdown file.
                &quot;subpages&quot;: [ # Subpages of this page. The order of subpages specified here will be
                    # honored in the generated docset.
                  # Object with schema name: Page
                ],
              },
            ],
          },
        },
        &quot;parent&quot;: &quot;A String&quot;, # The resource name of the consumer.
            #
            # A valid name would be:
            # - projects/123
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token that can be passed to `ListServices` to resume a paginated
        # query.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

</body></html>