<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="serviceuser_v1.html">Google Service User API</a> . <a href="serviceuser_v1.services.html">services</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#search">search(pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Search available services.</p>
<p class="toc_element">
  <code><a href="#search_next">search_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="search">search(pageSize=None, pageToken=None, x__xgafv=None)</code>
  <pre>Search available services.

When no filter is specified, returns all accessible services. For
authenticated users, also returns all services the calling user has
"servicemanagement.services.bind" permission for.

Args:
  pageSize: integer, Requested size of the next page of data.
  pageToken: string, Token identifying which result to start with; returned by a previous list
call.
  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 SearchServices method.
    "services": [ # Services available publicly or available to the authenticated caller.
      { # The published version of a Service that is managed by
          # Google Service Management.
        "name": "A String", # The resource name of the service.
            #
            # A valid name would be:
            # - services/serviceuser.googleapis.com
        "service": { # `Service` is the root object of Google service configuration schema. It # The service's published configuration.
            # describes basic information about a service, such as the name and the
            # title, and delegates other aspects to sub-sections. Each sub-section is
            # either a proto message or a repeated proto message that configures a
            # specific aspect, such as auth. See each proto message definition for details.
            #
            # Example:
            #
            #     type: google.api.Service
            #     config_version: 3
            #     name: calendar.googleapis.com
            #     title: Google Calendar API
            #     apis:
            #     - name: google.calendar.v3.Calendar
            #     authentication:
            #       providers:
            #       - id: google_calendar_auth
            #         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
            #         issuer: https://securetoken.google.com
            #       rules:
            #       - selector: "*"
            #         requirements:
            #           provider_id: google_calendar_auth
          "control": { # Selects and configures the service controller used by the service.  The # Configuration for the service control plane.
              # service controller handles features like abuse, quota, billing, logging,
              # monitoring, etc.
            "environment": "A String", # The service control environment to use. If empty, no control plane
                # feature (like quota and billing) will be enabled.
          },
          "monitoredResources": [ # Defines the monitored resources used by this service. This is required
              # by the Service.monitoring and Service.logging configurations.
            { # An object that describes the schema of a MonitoredResource object using a
                # type name and a set of labels.  For example, the monitored resource
                # descriptor for Google Compute Engine VM instances has a type of
                # `"gce_instance"` and specifies the use of the labels `"instance_id"` and
                # `"zone"` to identify particular VM instances.
                #
                # Different APIs can support different monitored resource types. APIs generally
                # provide a `list` method that returns the monitored resource descriptors used
                # by the API.
              "type": "A String", # Required. The monitored resource type. For example, the type
                  # `"cloudsql_database"` represents databases in Google Cloud SQL.
                  # The maximum length of this value is 256 characters.
              "labels": [ # Required. A set of labels used to describe instances of this monitored
                  # resource type. For example, an individual Google Cloud SQL database is
                  # identified by values for the labels `"database_id"` and `"zone"`.
                { # A description of a label.
                  "valueType": "A String", # The type of data that can be assigned to the label.
                  "description": "A String", # A human-readable description for the label.
                  "key": "A String", # The label key.
                },
              ],
              "displayName": "A String", # Optional. A concise name for the monitored resource type that might be
                  # displayed in user interfaces. It should be a Title Cased Noun Phrase,
                  # without any article or other determiners. For example,
                  # `"Google Cloud SQL Database"`.
              "name": "A String", # Optional. The resource name of the monitored resource descriptor:
                  # `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where
                  # {type} is the value of the `type` field in this object and
                  # {project_id} is a project ID that provides API-specific context for
                  # accessing the type.  APIs that do not use project information can use the
                  # resource name format `"monitoredResourceDescriptors/{type}"`.
              "description": "A String", # Optional. A detailed description of the monitored resource type that might
                  # be used in documentation.
            },
          ],
          "logs": [ # Defines the logs used by this service.
            { # A description of a log type. Example in YAML format:
                #
                #     - name: library.googleapis.com/activity_history
                #       description: The history of borrowing and returning library items.
                #       display_name: Activity
                #       labels:
                #       - key: /customer_id
                #         description: Identifier of a library customer
              "labels": [ # The set of labels that are available to describe a specific log entry.
                  # Runtime requests that contain labels not specified here are
                  # considered invalid.
                { # A description of a label.
                  "valueType": "A String", # The type of data that can be assigned to the label.
                  "description": "A String", # A human-readable description for the label.
                  "key": "A String", # The label key.
                },
              ],
              "displayName": "A String", # The human-readable name for this log. This information appears on
                  # the user interface and should be concise.
              "name": "A String", # The name of the log. It must be less than 512 characters long and can
                  # include the following characters: upper- and lower-case alphanumeric
                  # characters [A-Za-z0-9], and punctuation characters including
                  # slash, underscore, hyphen, period [/_-.].
              "description": "A String", # A human-readable description of this log. This information appears in
                  # the documentation and can contain details.
            },
          ],
          "systemParameters": { # ### System parameter configuration # System parameter configuration.
              #
              # A system parameter is a special kind of parameter defined by the API
              # system, not by an individual API. It is typically mapped to an HTTP header
              # and/or a URL query parameter. This configuration specifies which methods
              # change the names of the system parameters.
            "rules": [ # Define system parameters.
                #
                # The parameters defined here will override the default parameters
                # implemented by the system. If this field is missing from the service
                # config, default system parameters will be used. Default system parameters
                # and names is implementation-dependent.
                #
                # Example: define api key for all methods
                #
                #     system_parameters
                #       rules:
                #         - selector: "*"
                #           parameters:
                #             - name: api_key
                #               url_query_parameter: api_key
                #
                #
                # Example: define 2 api key names for a specific method.
                #
                #     system_parameters
                #       rules:
                #         - selector: "/ListShelves"
                #           parameters:
                #             - name: api_key
                #               http_header: Api-Key1
                #             - name: api_key
                #               http_header: Api-Key2
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # Define a system parameter rule mapping system parameter definitions to
                  # methods.
                "parameters": [ # Define parameters. Multiple names may be defined for a parameter.
                    # For a given method call, only one of them should be used. If multiple
                    # names are used the behavior is implementation-dependent.
                    # If none of the specified names are present the behavior is
                    # parameter-dependent.
                  { # Define a parameter's name and location. The parameter may be passed as either
                      # an HTTP header or a URL query parameter, and if both are passed the behavior
                      # is implementation-dependent.
                    "urlQueryParameter": "A String", # Define the URL query parameter name to use for the parameter. It is case
                        # sensitive.
                    "httpHeader": "A String", # Define the HTTP header name to use for the parameter. It is case
                        # insensitive.
                    "name": "A String", # Define the name of the parameter, such as "api_key" . It is case sensitive.
                  },
                ],
                "selector": "A String", # Selects the methods to which this rule applies. Use '*' to indicate all
                    # methods in all APIs.
                    #
                    # Refer to selector for syntax details.
              },
            ],
          },
          "id": "A String", # A unique ID for a specific instance of this message, typically assigned
              # by the client for tracking purpose. If empty, the server may choose to
              # generate one instead.
          "backend": { # `Backend` defines the backend configuration for a service. # API backend configuration.
            "rules": [ # A list of API backend rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # A backend rule provides configuration for an individual API element.
                "selector": "A String", # Selects the methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
                "minDeadline": 3.14, # Minimum deadline in seconds needed for this method. Calls having deadline
                    # value lower than this will be rejected.
                "deadline": 3.14, # The number of seconds to wait for a response from a request.  The
                    # default depends on the deployment context.
                "address": "A String", # The address of the API backend.
              },
            ],
          },
          "monitoring": { # Monitoring configuration of the service. # Monitoring configuration.
              #
              # The example below shows how to configure monitored resources and metrics
              # for monitoring. In the example, a monitored resource and two metrics are
              # defined. The `library.googleapis.com/book/returned_count` metric is sent
              # to both producer and consumer projects, whereas the
              # `library.googleapis.com/book/overdue_count` metric is only sent to the
              # consumer project.
              #
              #     monitored_resources:
              #     - type: library.googleapis.com/branch
              #       labels:
              #       - key: /city
              #         description: The city where the library branch is located in.
              #       - key: /name
              #         description: The name of the branch.
              #     metrics:
              #     - name: library.googleapis.com/book/returned_count
              #       metric_kind: DELTA
              #       value_type: INT64
              #       labels:
              #       - key: /customer_id
              #     - name: library.googleapis.com/book/overdue_count
              #       metric_kind: GAUGE
              #       value_type: INT64
              #       labels:
              #       - key: /customer_id
              #     monitoring:
              #       producer_destinations:
              #       - monitored_resource: library.googleapis.com/branch
              #         metrics:
              #         - library.googleapis.com/book/returned_count
              #       consumer_destinations:
              #       - monitored_resource: library.googleapis.com/branch
              #         metrics:
              #         - library.googleapis.com/book/returned_count
              #         - library.googleapis.com/book/overdue_count
            "producerDestinations": [ # Monitoring configurations for sending metrics to the producer project.
                # There can be multiple producer destinations, each one must have a
                # different monitored resource type. A metric can be used in at most
                # one producer destination.
              { # Configuration of a specific monitoring destination (the producer project
                  # or the consumer project).
                "monitoredResource": "A String", # The monitored resource type. The type must be defined in
                    # Service.monitored_resources section.
                "metrics": [ # Names of the metrics to report to this monitoring destination.
                    # Each name must be defined in Service.metrics section.
                  "A String",
                ],
              },
            ],
            "consumerDestinations": [ # Monitoring configurations for sending metrics to the consumer project.
                # There can be multiple consumer destinations, each one must have a
                # different monitored resource type. A metric can be used in at most
                # one consumer destination.
              { # Configuration of a specific monitoring destination (the producer project
                  # or the consumer project).
                "monitoredResource": "A String", # The monitored resource type. The type must be defined in
                    # Service.monitored_resources section.
                "metrics": [ # Names of the metrics to report to this monitoring destination.
                    # Each name must be defined in Service.metrics section.
                  "A String",
                ],
              },
            ],
          },
          "title": "A String", # The product title associated with this service.
          "authentication": { # `Authentication` defines the authentication configuration for an API. # Auth configuration.
              #
              # 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: "*"
              #         requirements:
              #           provider_id: google_calendar_auth
            "rules": [ # A list of authentication rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow "last one wins" 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's an error to include more than one kind of credential in a single
                  # request.
                  #
                  # If a method doesn't have any auth requirements, request credentials will be
                  # ignored.
                "oauth": { # OAuth scopes are a way to define data and permissions on data. For example, # The requirements for OAuth credentials.
                    # there are scopes defined for "Read-only access to Google Calendar" and
                    # "Access to Cloud Platform". 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.
                  "canonicalScopes": "A String", # 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
                },
                "allowWithoutCredential": True or False, # Whether to allow requests without a credential. The credential can be
                    # an OAuth token, Google cookies (first-party auth) or EndUserCreds.
                    #
                    # For requests without credentials, if the service control environment is
                    # specified, each incoming request **must** be associated with a service
                    # consumer. This can be done by passing an API key that belongs to a consumer
                    # project.
                "requirements": [ # 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).
                    "providerId": "A String", # id from authentication provider.
                        #
                        # Example:
                        #
                        #     provider_id: bookstore_auth
                    "audiences": "A String", # 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
                        # "https://Service_name/API_name"
                        # will be accepted. For example, if no audiences are in the setting,
                        # LibraryService API will only accept JWTs with the following audience
                        # "https://library-example.googleapis.com/google.example.library.v1.LibraryService".
                        #
                        # Example:
                        #
                        #     audiences: bookstore_android.apps.googleusercontent.com,
                        #                bookstore_web.apps.googleusercontent.com
                  },
                ],
                "customAuth": { # Configuration for a custom authentication provider. # Configuration for custom authentication.
                  "provider": "A String", # A configuration string containing connection information for the
                      # authentication provider, typically formatted as a SmartService string
                      # (go/smartservice).
                },
                "selector": "A String", # Selects the methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
              },
            ],
            "providers": [ # Defines a set of authentication providers that a service supports.
              { # Configuration for an anthentication provider, including support for
                  # [JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).
                "audiences": "A String", # 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
                    # "https://Service_name/API_name"
                    # will be accepted. For example, if no audiences are in the setting,
                    # LibraryService API will only accept JWTs with the following audience
                    # "https://library-example.googleapis.com/google.example.library.v1.LibraryService".
                    #
                    # Example:
                    #
                    #     audiences: bookstore_android.apps.googleusercontent.com,
                    #                bookstore_web.apps.googleusercontent.com
                "jwksUri": "A String", # URL of the provider'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
                "id": "A String", # The unique identifier of the auth provider. It will be referred to by
                    # `AuthRequirement.provider_id`.
                    #
                    # Example: "bookstore_auth".
                "issuer": "A String", # 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
              },
            ],
          },
          "usage": { # Configuration controlling usage of a service. # Configuration controlling usage of this service.
            "rules": [ # A list of usage rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow "last one wins" 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: "*"
                  #         allow_unregistered_calls: true
                  #
                  # Example of a method that wants to allow unregistered calls.
                  #
                  #     usage:
                  #       rules:
                  #       - selector: "google.example.library.v1.LibraryService.CreateBook"
                  #         allow_unregistered_calls: true
                "selector": "A String", # Selects the methods to which this rule applies. Use '*' to indicate all
                    # methods in all APIs.
                    #
                    # Refer to selector for syntax details.
                "allowUnregisteredCalls": True or False, # True, if the method allows unregistered calls; false otherwise.
              },
            ],
            "producerNotificationChannel": "A String", # 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.
            "requirements": [ # Requirements that must be satisfied before a consumer project can use the
                # service. Each requirement is of the form <service.name>/<requirement-id>;
                # for example 'serviceusage.googleapis.com/billing-enabled'.
              "A String",
            ],
          },
          "configVersion": 42, # The version of the service configuration. The config version may
              # influence interpretation of the configuration, for example, to
              # determine defaults. This is documented together with applicable
              # options. The current default for the config version itself is `3`.
          "producerProjectId": "A String", # The id of the Google developer project that owns the service.
              # Members of this project can manage the service configuration,
              # manage consumption of the service, etc.
          "http": { # Defines the HTTP configuration for a service. It contains a list of # HTTP configuration.
              # HttpRule, each specifying the mapping of an RPC method
              # to one or more HTTP REST API methods.
            "rules": [ # A list of HTTP configuration rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # `HttpRule` defines the mapping of an RPC method to one or more HTTP
                  # REST APIs.  The mapping determines what portions of the request
                  # message are populated from the path, query parameters, or body of
                  # the HTTP request.  The mapping is typically specified as an
                  # `google.api.http` annotation, see "google/api/annotations.proto"
                  # for details.
                  #
                  # The mapping consists of a field specifying the path template and
                  # method kind.  The path template can refer to fields in the request
                  # message, as in the example below which describes a REST GET
                  # operation on a resource collection of messages:
                  #
                  #
                  #     service Messaging {
                  #       rpc GetMessage(GetMessageRequest) returns (Message) {
                  #         option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
                  #       }
                  #     }
                  #     message GetMessageRequest {
                  #       message SubMessage {
                  #         string subfield = 1;
                  #       }
                  #       string message_id = 1; // mapped to the URL
                  #       SubMessage sub = 2;    // `sub.subfield` is url-mapped
                  #     }
                  #     message Message {
                  #       string text = 1; // content of the resource
                  #     }
                  #
                  # The same http annotation can alternatively be expressed inside the
                  # `GRPC API Configuration` YAML file.
                  #
                  #     http:
                  #       rules:
                  #         - selector: <proto_package_name>.Messaging.GetMessage
                  #           get: /v1/messages/{message_id}/{sub.subfield}
                  #
                  # This definition enables an automatic, bidrectional mapping of HTTP
                  # JSON to RPC. Example:
                  #
                  # HTTP | RPC
                  # -----|-----
                  # `GET /v1/messages/123456/foo`  | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))`
                  #
                  # In general, not only fields but also field paths can be referenced
                  # from a path pattern. Fields mapped to the path pattern cannot be
                  # repeated and must have a primitive (non-message) type.
                  #
                  # Any fields in the request message which are not bound by the path
                  # pattern automatically become (optional) HTTP query
                  # parameters. Assume the following definition of the request message:
                  #
                  #
                  #     service Messaging {
                  #       rpc GetMessage(GetMessageRequest) returns (Message) {
                  #         option (google.api.http).get = "/v1/messages/{message_id}";
                  #       }
                  #     }
                  #     message GetMessageRequest {
                  #       message SubMessage {
                  #         string subfield = 1;
                  #       }
                  #       string message_id = 1; // mapped to the URL
                  #       int64 revision = 2;    // becomes a parameter
                  #       SubMessage sub = 3;    // `sub.subfield` becomes a parameter
                  #     }
                  #
                  #
                  # This enables a HTTP JSON to RPC mapping as below:
                  #
                  # HTTP | RPC
                  # -----|-----
                  # `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))`
                  #
                  # Note that fields which are mapped to HTTP parameters must have a
                  # primitive type or a repeated primitive type. Message types are not
                  # allowed. In the case of a repeated type, the parameter can be
                  # repeated in the URL, as in `...?param=A&param=B`.
                  #
                  # For HTTP method kinds which allow a request body, the `body` field
                  # specifies the mapping. Consider a REST update method on the
                  # message resource collection:
                  #
                  #
                  #     service Messaging {
                  #       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
                  #         option (google.api.http) = {
                  #           put: "/v1/messages/{message_id}"
                  #           body: "message"
                  #         };
                  #       }
                  #     }
                  #     message UpdateMessageRequest {
                  #       string message_id = 1; // mapped to the URL
                  #       Message message = 2;   // mapped to the body
                  #     }
                  #
                  #
                  # The following HTTP JSON to RPC mapping is enabled, where the
                  # representation of the JSON in the request body is determined by
                  # protos JSON encoding:
                  #
                  # HTTP | RPC
                  # -----|-----
                  # `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })`
                  #
                  # The special name `*` can be used in the body mapping to define that
                  # every field not bound by the path template should be mapped to the
                  # request body.  This enables the following alternative definition of
                  # the update method:
                  #
                  #     service Messaging {
                  #       rpc UpdateMessage(Message) returns (Message) {
                  #         option (google.api.http) = {
                  #           put: "/v1/messages/{message_id}"
                  #           body: "*"
                  #         };
                  #       }
                  #     }
                  #     message Message {
                  #       string message_id = 1;
                  #       string text = 2;
                  #     }
                  #
                  #
                  # The following HTTP JSON to RPC mapping is enabled:
                  #
                  # HTTP | RPC
                  # -----|-----
                  # `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")`
                  #
                  # Note that when using `*` in the body mapping, it is not possible to
                  # have HTTP parameters, as all fields not bound by the path end in
                  # the body. This makes this option more rarely used in practice of
                  # defining REST APIs. The common usage of `*` is in custom methods
                  # which don't use the URL at all for transferring data.
                  #
                  # It is possible to define multiple HTTP methods for one RPC by using
                  # the `additional_bindings` option. Example:
                  #
                  #     service Messaging {
                  #       rpc GetMessage(GetMessageRequest) returns (Message) {
                  #         option (google.api.http) = {
                  #           get: "/v1/messages/{message_id}"
                  #           additional_bindings {
                  #             get: "/v1/users/{user_id}/messages/{message_id}"
                  #           }
                  #         };
                  #       }
                  #     }
                  #     message GetMessageRequest {
                  #       string message_id = 1;
                  #       string user_id = 2;
                  #     }
                  #
                  #
                  # This enables the following two alternative HTTP JSON to RPC
                  # mappings:
                  #
                  # HTTP | RPC
                  # -----|-----
                  # `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
                  # `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")`
                  #
                  # # Rules for HTTP mapping
                  #
                  # The rules for mapping HTTP path, query parameters, and body fields
                  # to the request message are as follows:
                  #
                  # 1. The `body` field specifies either `*` or a field path, or is
                  #    omitted. If omitted, it assumes there is no HTTP body.
                  # 2. Leaf fields (recursive expansion of nested messages in the
                  #    request) can be classified into three types:
                  #     (a) Matched in the URL template.
                  #     (b) Covered by body (if body is `*`, everything except (a) fields;
                  #         else everything under the body field)
                  #     (c) All other fields.
                  # 3. URL query parameters found in the HTTP request are mapped to (c) fields.
                  # 4. Any body sent with an HTTP request can contain only (b) fields.
                  #
                  # The syntax of the path template is as follows:
                  #
                  #     Template = "/" Segments [ Verb ] ;
                  #     Segments = Segment { "/" Segment } ;
                  #     Segment  = "*" | "**" | LITERAL | Variable ;
                  #     Variable = "{" FieldPath [ "=" Segments ] "}" ;
                  #     FieldPath = IDENT { "." IDENT } ;
                  #     Verb     = ":" LITERAL ;
                  #
                  # The syntax `*` matches a single path segment. It follows the semantics of
                  # [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String
                  # Expansion.
                  #
                  # The syntax `**` matches zero or more path segments. It follows the semantics
                  # of [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.3 Reserved
                  # Expansion. NOTE: it must be the last segment in the path except the Verb.
                  #
                  # The syntax `LITERAL` matches literal text in the URL path.
                  #
                  # The syntax `Variable` matches the entire path as specified by its template;
                  # this nested template must not contain further variables. If a variable
                  # matches a single path segment, its template may be omitted, e.g. `{var}`
                  # is equivalent to `{var=*}`.
                  #
                  # NOTE: the field paths in variables and in the `body` must not refer to
                  # repeated fields or map fields.
                  #
                  # Use CustomHttpPattern to specify any HTTP method that is not included in the
                  # `pattern` field, such as HEAD, or "*" to leave the HTTP method unspecified for
                  # a given URL path rule. The wild-card rule is useful for services that provide
                  # content to Web (HTML) clients.
                "body": "A String", # The name of the request field whose value is mapped to the HTTP body, or
                    # `*` for mapping all fields not captured by the path pattern to the HTTP
                    # body. NOTE: the referred field must not be a repeated field and must be
                    # present at the top-level of request message type.
                "get": "A String", # Used for listing and getting information about resources.
                "restCollection": "A String", # Optional. The REST collection name is by default derived from the URL
                    # pattern. If specified, this field overrides the default collection name.
                    # Example:
                    #
                    #     rpc AddressesAggregatedList(AddressesAggregatedListRequest)
                    #         returns (AddressesAggregatedListResponse) {
                    #       option (google.api.http) = {
                    #         get: "/v1/projects/{project_id}/aggregated/addresses"
                    #         rest_collection: "projects.addresses"
                    #       };
                    #     }
                    #
                    # This method has the automatically derived collection name
                    # "projects.aggregated". Because, semantically, this rpc is actually an
                    # operation on the "projects.addresses" collection, the `rest_collection`
                    # field is configured to override the derived collection name.
                "additionalBindings": [ # Additional HTTP bindings for the selector. Nested bindings must
                    # not contain an `additional_bindings` field themselves (that is,
                    # the nesting may only be one level deep).
                  # Object with schema name: HttpRule
                ],
                "mediaUpload": { # Defines the Media configuration for a service in case of an upload. # Use this only for Scotty Requests. Do not use this for media support using
                    # Bytestream, add instead
                    # [][google.bytestream.RestByteStream] as an API to your
                    # configuration for Bytestream methods.
                    # Use this only for Scotty Requests. Do not use this for media support using
                    # Bytestream, add instead [][google.bytestream.RestByteStream] as an API to
                    # your configuration for Bytestream methods.
                  "startNotification": True or False, # Whether to receive a notification on the start of media upload.
                  "progressNotification": True or False, # Whether to receive a notification for progress changes of media upload.
                  "mimeTypes": [ # An array of mimetype patterns. Esf will only accept uploads that match one
                      # of the given patterns.
                    "A String",
                  ],
                  "enabled": True or False, # Whether upload is enabled.
                  "completeNotification": True or False, # A boolean that determines whether a notification for the completion of an
                      # upload should be sent to the backend. These notifications will not be seen
                      # by the client and will not consume quota.
                  "dropzone": "A String", # Name of the Scotty dropzone to use for the current API.
                  "maxSize": "A String", # Optional maximum acceptable size for an upload.
                      # The size is specified in bytes.
                  "uploadService": "A String", # DO NOT USE FIELDS BELOW THIS LINE UNTIL THIS WARNING IS REMOVED.
                      #
                      # Specify name of the upload service if one is used for upload.
                },
                "selector": "A String", # Selects methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
                "responseBody": "A String", # The name of the response field whose value is mapped to the HTTP body of
                    # response. Other response fields are ignored. This field is optional. When
                    # not set, the response message will be used as HTTP body of response.
                    # NOTE: the referred field must be not a repeated field and must be present
                    # at the top-level of response message type.
                "restMethodName": "A String", # Optional. The rest method name is by default derived from the URL
                    # pattern. If specified, this field overrides the default method name.
                    # Example:
                    #
                    #     rpc CreateResource(CreateResourceRequest)
                    #         returns (CreateResourceResponse) {
                    #       option (google.api.http) = {
                    #         post: "/v1/resources",
                    #         body: "resource",
                    #         rest_method_name: "insert"
                    #       };
                    #     }
                    #
                    # This method has the automatically derived rest method name "create", but
                    #  for backwards compatability with apiary, it is specified as insert.
                "mediaDownload": { # Defines the Media configuration for a service in case of a download. # Use this only for Scotty Requests. Do not use this for bytestream methods.
                    # For media support, add instead [][google.bytestream.RestByteStream] as an
                    # API to your configuration.
                    # Use this only for Scotty Requests. Do not use this for media support using
                    # Bytestream, add instead [][google.bytestream.RestByteStream] as an API to
                    # your configuration for Bytestream methods.
                  "useDirectDownload": True or False, # A boolean that determines if direct download from ESF should be used for
                      # download of this media.
                  "completeNotification": True or False, # A boolean that determines whether a notification for the completion of a
                      # download should be sent to the backend.
                  "enabled": True or False, # Whether download is enabled.
                  "maxDirectDownloadSize": "A String", # Optional maximum acceptable size for direct download.
                      # The size is specified in bytes.
                  "dropzone": "A String", # Name of the Scotty dropzone to use for the current API.
                  "downloadService": "A String", # DO NOT USE FIELDS BELOW THIS LINE UNTIL THIS WARNING IS REMOVED.
                      #
                      # Specify name of the download service if one is used for download.
                },
                "put": "A String", # Used for updating a resource.
                "patch": "A String", # Used for updating a resource.
                "post": "A String", # Used for creating a resource.
                "custom": { # A custom pattern is used for defining custom HTTP verb. # Custom pattern is used for defining custom verbs.
                  "path": "A String", # The path matched by this custom verb.
                  "kind": "A String", # The name of this custom HTTP verb.
                },
                "delete": "A String", # Used for deleting a resource.
              },
            ],
            "fullyDecodeReservedExpansion": True or False, # When set to true, URL path parmeters will be fully URI-decoded except in
                # cases of single segment matches in reserved expansion, where "%2F" will be
                # left encoded.
                #
                # The default behavior is to not decode RFC 6570 reserved characters in multi
                # segment matches.
          },
          "apis": [ # A list of API interfaces exported by this service. Only the `name` field
              # of the google.protobuf.Api needs to be provided by the configuration
              # author, as the remaining fields will be derived from the IDL during the
              # normalization process. It is an error to specify an API interface here
              # which cannot be resolved against the associated IDL files.
            { # Api is a light-weight descriptor for a protocol buffer service.
              "name": "A String", # The fully qualified name of this api, including package name
                  # followed by the api's simple name.
              "sourceContext": { # `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.
                "fileName": "A String", # The path-qualified name of the .proto file that contained the associated
                    # protobuf element.  For example: `"google/protobuf/source_context.proto"`.
              },
              "mixins": [ # Included APIs. See Mixin.
                { # Declares an API to be included in this API. The including API must
                    # redeclare all the methods from the included API, 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 API 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 = "/v1/{resource=**}:getAcl";
                    #       }
                    #     }
                    #
                    #     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 = "/v2/{resource=**}";
                    #       }
                    #     }
                    #
                    # 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 = "/v2/{resource=**}:getAcl";
                    #       }
                    #       ...
                    #     }
                    #
                    # 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 = "/v2/acls/{resource=**}:getAcl";
                    #       }
                    #       ...
                    #     }
                  "root": "A String", # If non-empty specifies a path under which inherited HTTP paths
                      # are rooted.
                  "name": "A String", # The fully qualified name of the API which is included.
                },
              ],
              "syntax": "A String", # The source syntax of the service.
              "version": "A String", # A version string for this api. 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
                  # API, which must end in `v<major-version>`, 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, none-GA apis.
              "options": [ # Any metadata attached to the API.
                { # A protocol buffer option, which can be attached to a message, field,
                    # enumeration, etc.
                  "name": "A String", # The option's name. For protobuf built-in options (options defined in
                      # descriptor.proto), this is the short name. For example, `"map_entry"`.
                      # For custom options, it should be the fully-qualified name. For example,
                      # `"google.api.http"`.
                  "value": { # The option'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.
                    "a_key": "", # Properties of the object. Contains field @type with type URL.
                  },
                },
              ],
              "methods": [ # The methods of this api, in unspecified order.
                { # Method represents a method of an api.
                  "name": "A String", # The simple name of this method.
                  "requestStreaming": True or False, # If true, the request is streamed.
                  "responseTypeUrl": "A String", # The URL of the output message type.
                  "requestTypeUrl": "A String", # A URL of the input message type.
                  "responseStreaming": True or False, # If true, the response is streamed.
                  "syntax": "A String", # The source syntax of this method.
                  "options": [ # Any metadata attached to the method.
                    { # A protocol buffer option, which can be attached to a message, field,
                        # enumeration, etc.
                      "name": "A String", # The option's name. For protobuf built-in options (options defined in
                          # descriptor.proto), this is the short name. For example, `"map_entry"`.
                          # For custom options, it should be the fully-qualified name. For example,
                          # `"google.api.http"`.
                      "value": { # The option'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.
                        "a_key": "", # Properties of the object. Contains field @type with type URL.
                      },
                    },
                  ],
                },
              ],
            },
          ],
          "customError": { # Customize service error responses.  For example, list any service # Custom error configuration.
              # specific protobuf types that can appear in error detail lists of
              # error responses.
              #
              # Example:
              #
              #     custom_error:
              #       types:
              #       - google.foo.v1.CustomError
              #       - google.foo.v1.AnotherError
            "rules": [ # The list of custom error rules that apply to individual API messages.
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # A custom error rule.
                "isErrorType": True or False, # Mark this message as possible payload in error response.  Otherwise,
                    # objects of this type will be filtered when they appear in error payload.
                "selector": "A String", # Selects messages to which this rule applies.
                    #
                    # Refer to selector for syntax details.
              },
            ],
            "types": [ # The list of custom error detail types, e.g. 'google.foo.v1.CustomError'.
              "A String",
            ],
          },
          "quota": { # Quota configuration helps to achieve fairness and budgeting in service # Quota configuration.
              # usage.
              #
              # The 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:
              #
              #      - name: apiWriteQpsPerProject
              #        metric: library.googleapis.com/write_calls
              #        unit: "1/min/{project}"  # 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: "*"
              #        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
            "metricRules": [ # 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's configured quota behaviors to apply to the method call.
                "metricCosts": { # 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.
                  "a_key": "A String",
                },
                "selector": "A String", # Selects the methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
              },
            ],
            "limits": [ # 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`.
                "displayName": "A String", # 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.
                "description": "A String", # 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's display name (see: `display_name`).
                "defaultLimit": "A String", # 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.
                "metric": "A String", # 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.
                    #
                    # Used by metric-based quotas only.
                "values": { # Tiered limit values, currently only STANDARD is supported.
                  "a_key": "A String",
                },
                "maxLimit": "A String", # 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.
                "duration": "A String", # Duration of this limit in textual notation. Example: "100s", "24h", "1d".
                    # For duration longer than a day, only multiple of days is supported. We
                    # support only "100s" and "1d" for now. Additional support will be added in
                    # the future. "0" indicates indefinite duration.
                    #
                    # Used by group-based quotas only.
                "freeTier": "A String", # 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 "1d", 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.
                "unit": "A String", # 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.
                    #
                    # The [Google Service Control](https://cloud.google.com/service-control)
                    # supports the following unit components:
                    # * One of the time intevals:
                    #   * "/min"  for quota every minute.
                    #   * "/d"  for quota every 24 hours, starting 00:00 US Pacific Time.
                    #   * Otherwise the quota won't be reset by time, such as storage limit.
                    # * One and only one of the granted containers:
                    #   * "/{project}" quota for a project
                    #
                    # Here are some examples:
                    # * "1/min/{project}" for quota per minute per project.
                    #
                    # Note: the order of unit components is insignificant.
                    # The "1" at the beginning is required to follow the metric unit syntax.
                    #
                    # Used by metric-based quotas only.
                "name": "A String", # Name of the quota limit. The name is used to refer to the limit when
                    # overriding the default limit on per-consumer basis.
                    #
                    # For metric-based quota limits, the name must be provided, and it must be
                    # unique within the service. The name can only include alphanumeric
                    # characters as well as '-'.
                    #
                    # The maximum length of the limit name is 64 characters.
                    #
                    # The name of a limit is used as a unique identifier for this limit.
                    # Therefore, once a limit has been put into use, its name should be
                    # immutable. You can use the display_name field to provide a user-friendly
                    # name for the limit. The display name can be evolved over time without
                    # affecting the identity of the limit.
              },
            ],
          },
          "visibility": { # `Visibility` defines restrictions for the visibility of service # API visibility configuration.
              # elements.  Restrictions are specified using visibility labels
              # (e.g., TRUSTED_TESTER) that are elsewhere linked to users and projects.
              #
              # Users and projects can have access to more than one visibility label. The
              # effective visibility for multiple labels is the union of each label's
              # elements, plus any unrestricted elements.
              #
              # If an element and its parents have no restrictions, visibility is
              # unconditionally granted.
              #
              # Example:
              #
              #     visibility:
              #       rules:
              #       - selector: google.calendar.Calendar.EnhancedSearch
              #         restriction: TRUSTED_TESTER
              #       - selector: google.calendar.Calendar.Delegate
              #         restriction: GOOGLE_INTERNAL
              #
              # Here, all methods are publicly visible except for the restricted methods
              # EnhancedSearch and Delegate.
            "rules": [ # A list of visibility rules that apply to individual API elements.
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # A visibility rule provides visibility configuration for an individual API
                  # element.
                "restriction": "A String", # A comma-separated list of visibility labels that apply to the `selector`.
                    # Any of the listed labels can be used to grant the visibility.
                    #
                    # If a rule has multiple labels, removing one of the labels but not all of
                    # them can break clients.
                    #
                    # Example:
                    #
                    #     visibility:
                    #       rules:
                    #       - selector: google.calendar.Calendar.EnhancedSearch
                    #         restriction: GOOGLE_INTERNAL, TRUSTED_TESTER
                    #
                    # Removing GOOGLE_INTERNAL from this restriction will break clients that
                    # rely on this method and only had access to it through GOOGLE_INTERNAL.
                "selector": "A String", # Selects methods, messages, fields, enums, etc. to which this rule applies.
                    #
                    # Refer to selector for syntax details.
              },
            ],
          },
          "metrics": [ # Defines the metrics used by this service.
            { # Defines a metric type and its schema. Once a metric descriptor is created,
                # deleting or altering it stops data collection and makes the metric type's
                # existing data unusable.
              "displayName": "A String", # A concise name for the metric, which can be displayed in user interfaces.
                  # Use sentence case without an ending period, for example "Request count".
              "name": "A String", # The resource name of the metric descriptor. Depending on the
                  # implementation, the name typically includes: (1) the parent resource name
                  # that defines the scope of the metric type or of its data; and (2) the
                  # metric's URL-encoded type, which also appears in the `type` field of this
                  # descriptor. For example, following is the resource name of a custom
                  # metric within the GCP project `my-project-id`:
                  #
                  #     "projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount"
              "metricKind": "A String", # Whether the metric records instantaneous values, changes to a value, etc.
                  # Some combinations of `metric_kind` and `value_type` might not be supported.
              "valueType": "A String", # Whether the measurement is an integer, a floating-point number, etc.
                  # Some combinations of `metric_kind` and `value_type` might not be supported.
              "labels": [ # The set of labels that can be used to describe a specific
                  # instance of this metric type. For example, the
                  # `appengine.googleapis.com/http/server/response_latencies` metric
                  # type has a label for the HTTP response code, `response_code`, so
                  # you can look at latencies for successful responses or just
                  # for responses that failed.
                { # A description of a label.
                  "valueType": "A String", # The type of data that can be assigned to the label.
                  "description": "A String", # A human-readable description for the label.
                  "key": "A String", # The label key.
                },
              ],
              "type": "A String", # The metric type, including its DNS name prefix. The type is not
                  # URL-encoded.  All user-defined custom metric types have the DNS name
                  # `custom.googleapis.com`.  Metric types should use a natural hierarchical
                  # grouping. For example:
                  #
                  #     "custom.googleapis.com/invoice/paid/amount"
                  #     "appengine.googleapis.com/http/server/response_latencies"
              "unit": "A String", # The unit in which the metric value is reported. It is only applicable
                  # if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The
                  # supported units are a subset of [The Unified Code for Units of
                  # Measure](http://unitsofmeasure.org/ucum.html) standard:
                  #
                  # **Basic units (UNIT)**
                  #
                  # * `bit`   bit
                  # * `By`    byte
                  # * `s`     second
                  # * `min`   minute
                  # * `h`     hour
                  # * `d`     day
                  #
                  # **Prefixes (PREFIX)**
                  #
                  # * `k`     kilo    (10**3)
                  # * `M`     mega    (10**6)
                  # * `G`     giga    (10**9)
                  # * `T`     tera    (10**12)
                  # * `P`     peta    (10**15)
                  # * `E`     exa     (10**18)
                  # * `Z`     zetta   (10**21)
                  # * `Y`     yotta   (10**24)
                  # * `m`     milli   (10**-3)
                  # * `u`     micro   (10**-6)
                  # * `n`     nano    (10**-9)
                  # * `p`     pico    (10**-12)
                  # * `f`     femto   (10**-15)
                  # * `a`     atto    (10**-18)
                  # * `z`     zepto   (10**-21)
                  # * `y`     yocto   (10**-24)
                  # * `Ki`    kibi    (2**10)
                  # * `Mi`    mebi    (2**20)
                  # * `Gi`    gibi    (2**30)
                  # * `Ti`    tebi    (2**40)
                  #
                  # **Grammar**
                  #
                  # The grammar includes the dimensionless unit `1`, such as `1/s`.
                  #
                  # The grammar also includes these connectors:
                  #
                  # * `/`    division (as an infix operator, e.g. `1/s`).
                  # * `.`    multiplication (as an infix operator, e.g. `GBy.d`)
                  #
                  # The grammar for a unit is as follows:
                  #
                  #     Expression = Component { "." Component } { "/" Component } ;
                  #
                  #     Component = [ PREFIX ] UNIT [ Annotation ]
                  #               | Annotation
                  #               | "1"
                  #               ;
                  #
                  #     Annotation = "{" NAME "}" ;
                  #
                  # Notes:
                  #
                  # * `Annotation` is just a comment if it follows a `UNIT` and is
                  #    equivalent to `1` if it is used alone. For examples,
                  #    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
                  # * `NAME` is a sequence of non-blank printable ASCII characters not
                  #    containing '{' or '}'.
              "description": "A String", # A detailed description of the metric, which can be used in documentation.
            },
          ],
          "enums": [ # A list of all enum types included in this API service.  Enums
              # referenced directly or indirectly by the `apis` are automatically
              # included.  Enums which are not referenced but shall be included
              # should be listed here by name. Example:
              #
              #     enums:
              #     - name: google.someapi.v1.SomeEnum
            { # Enum type definition.
              "syntax": "A String", # The source syntax.
              "sourceContext": { # `SourceContext` represents information about the source of a # The source context.
                  # protobuf element, like the file in which it is defined.
                "fileName": "A String", # The path-qualified name of the .proto file that contained the associated
                    # protobuf element.  For example: `"google/protobuf/source_context.proto"`.
              },
              "options": [ # Protocol buffer options.
                { # A protocol buffer option, which can be attached to a message, field,
                    # enumeration, etc.
                  "name": "A String", # The option's name. For protobuf built-in options (options defined in
                      # descriptor.proto), this is the short name. For example, `"map_entry"`.
                      # For custom options, it should be the fully-qualified name. For example,
                      # `"google.api.http"`.
                  "value": { # The option'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.
                    "a_key": "", # Properties of the object. Contains field @type with type URL.
                  },
                },
              ],
              "name": "A String", # Enum type name.
              "enumvalue": [ # Enum value definitions.
                { # Enum value definition.
                  "number": 42, # Enum value number.
                  "name": "A String", # Enum value name.
                  "options": [ # Protocol buffer options.
                    { # A protocol buffer option, which can be attached to a message, field,
                        # enumeration, etc.
                      "name": "A String", # The option's name. For protobuf built-in options (options defined in
                          # descriptor.proto), this is the short name. For example, `"map_entry"`.
                          # For custom options, it should be the fully-qualified name. For example,
                          # `"google.api.http"`.
                      "value": { # The option'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.
                        "a_key": "", # Properties of the object. Contains field @type with type URL.
                      },
                    },
                  ],
                },
              ],
            },
          ],
          "types": [ # A list of all proto message types included in this API service.
              # Types referenced directly or indirectly by the `apis` are
              # automatically included.  Messages which are not referenced but
              # shall be included, such as types used by the `google.protobuf.Any` type,
              # should be listed here by name. Example:
              #
              #     types:
              #     - name: google.protobuf.Int32
            { # A protocol buffer message type.
              "oneofs": [ # The list of types appearing in `oneof` definitions in this type.
                "A String",
              ],
              "name": "A String", # The fully qualified message name.
              "fields": [ # The list of fields.
                { # A single field of a message type.
                  "kind": "A String", # The field type.
                  "oneofIndex": 42, # The index of the field type in `Type.oneofs`, for message or enumeration
                      # types. The first type has index 1; zero means the type is not in the list.
                  "typeUrl": "A String", # The field type URL, without the scheme, for message or enumeration
                      # types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
                  "name": "A String", # The field name.
                  "defaultValue": "A String", # The string value of the default value of this field. Proto2 syntax only.
                  "jsonName": "A String", # The field JSON name.
                  "number": 42, # The field number.
                  "cardinality": "A String", # The field cardinality.
                  "options": [ # The protocol buffer options.
                    { # A protocol buffer option, which can be attached to a message, field,
                        # enumeration, etc.
                      "name": "A String", # The option's name. For protobuf built-in options (options defined in
                          # descriptor.proto), this is the short name. For example, `"map_entry"`.
                          # For custom options, it should be the fully-qualified name. For example,
                          # `"google.api.http"`.
                      "value": { # The option'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.
                        "a_key": "", # Properties of the object. Contains field @type with type URL.
                      },
                    },
                  ],
                  "packed": True or False, # Whether to use alternative packed wire representation.
                },
              ],
              "syntax": "A String", # The source syntax.
              "sourceContext": { # `SourceContext` represents information about the source of a # The source context.
                  # protobuf element, like the file in which it is defined.
                "fileName": "A String", # The path-qualified name of the .proto file that contained the associated
                    # protobuf element.  For example: `"google/protobuf/source_context.proto"`.
              },
              "options": [ # The protocol buffer options.
                { # A protocol buffer option, which can be attached to a message, field,
                    # enumeration, etc.
                  "name": "A String", # The option's name. For protobuf built-in options (options defined in
                      # descriptor.proto), this is the short name. For example, `"map_entry"`.
                      # For custom options, it should be the fully-qualified name. For example,
                      # `"google.api.http"`.
                  "value": { # The option'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.
                    "a_key": "", # Properties of the object. Contains field @type with type URL.
                  },
                },
              ],
            },
          ],
          "logging": { # Logging configuration of the service. # Logging configuration.
              #
              # The following example shows how to configure logs to be sent to the
              # producer and consumer projects. In the example, the `activity_history`
              # log is sent to both the producer and consumer projects, whereas the
              # `purchase_history` log is only sent to the producer project.
              #
              #     monitored_resources:
              #     - type: library.googleapis.com/branch
              #       labels:
              #       - key: /city
              #         description: The city where the library branch is located in.
              #       - key: /name
              #         description: The name of the branch.
              #     logs:
              #     - name: activity_history
              #       labels:
              #       - key: /customer_id
              #     - name: purchase_history
              #     logging:
              #       producer_destinations:
              #       - monitored_resource: library.googleapis.com/branch
              #         logs:
              #         - activity_history
              #         - purchase_history
              #       consumer_destinations:
              #       - monitored_resource: library.googleapis.com/branch
              #         logs:
              #         - activity_history
            "producerDestinations": [ # Logging configurations for sending logs to the producer project.
                # There can be multiple producer destinations, each one must have a
                # different monitored resource type. A log can be used in at most
                # one producer destination.
              { # Configuration of a specific logging destination (the producer project
                  # or the consumer project).
                "monitoredResource": "A String", # The monitored resource type. The type must be defined in the
                    # Service.monitored_resources section.
                "logs": [ # Names of the logs to be sent to this destination. Each name must
                    # be defined in the Service.logs section. If the log name is
                    # not a domain scoped name, it will be automatically prefixed with
                    # the service name followed by "/".
                  "A String",
                ],
              },
            ],
            "consumerDestinations": [ # Logging configurations for sending logs to the consumer project.
                # There can be multiple consumer destinations, each one must have a
                # different monitored resource type. A log can be used in at most
                # one consumer destination.
              { # Configuration of a specific logging destination (the producer project
                  # or the consumer project).
                "monitoredResource": "A String", # The monitored resource type. The type must be defined in the
                    # Service.monitored_resources section.
                "logs": [ # Names of the logs to be sent to this destination. Each name must
                    # be defined in the Service.logs section. If the log name is
                    # not a domain scoped name, it will be automatically prefixed with
                    # the service name followed by "/".
                  "A String",
                ],
              },
            ],
          },
          "name": "A String", # The DNS address at which this service is available,
              # e.g. `calendar.googleapis.com`.
          "documentation": { # `Documentation` provides the information for describing a service. # Additional API documentation.
              #
              # Example:
              # <pre><code>documentation:
              #   summary: >
              #     The Google Calendar API gives access
              #     to most calendar features.
              #   pages:
              #   - name: Overview
              #     content: &#40;== include google/foo/overview.md ==&#41;
              #   - name: Tutorial
              #     content: &#40;== include google/foo/tutorial.md ==&#41;
              #     subpages;
              #     - name: Java
              #       content: &#40;== include google/foo/tutorial_java.md ==&#41;
              #   rules:
              #   - selector: google.calendar.Calendar.Get
              #     description: >
              #       ...
              #   - selector: google.calendar.Calendar.Put
              #     description: >
              #       ...
              # </code></pre>
              # 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:
              # <pre><code>&#91;fully.qualified.proto.name]&#91;]</code></pre>
              # To override the display text used for the link, this can be used:
              # <pre><code>&#91;display text]&#91;fully.qualified.proto.name]</code></pre>
              # Text can be excluded from doc using the following notation:
              # <pre><code>&#40;-- internal comment --&#41;</code></pre>
              # Comments can be made conditional using a visibility label. The below
              # text will be only rendered if the `BETA` label is available:
              # <pre><code>&#40;--BETA: comment for BETA users --&#41;</code></pre>
              # 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:
              # <pre><code>&#40;== include path/to/file ==&#41;</code></pre>
              # 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:
              # <pre><code>&#40;== resource_for v1.shelves.books ==&#41;</code></pre>
              # The directive `suppress_warning` does not directly affect documentation
              # and is documented together with service config validation.
            "rules": [ # A list of documentation rules that apply to individual API elements.
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # A documentation rule provides information about individual API elements.
                "description": "A String", # Description of the selected API(s).
                "deprecationDescription": "A String", # Deprecation description of the selected element(s). It can be provided if an
                    # element is marked as `deprecated`.
                "selector": "A String", # The selector is a comma-separated list of patterns. Each pattern is a
                    # qualified name of the element which may end in "*", indicating a wildcard.
                    # Wildcards are only allowed at the end and for a whole component of the
                    # qualified name, i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". To
                    # specify a default for all applicable elements, the whole pattern "*"
                    # is used.
              },
            ],
            "documentationRootUrl": "A String", # The URL to the root of documentation.
            "overview": "A String", # Declares a single overview page. For example:
                # <pre><code>documentation:
                #   summary: ...
                #   overview: &#40;== include overview.md ==&#41;
                # </code></pre>
                # This is a shortcut for the following declaration (using pages style):
                # <pre><code>documentation:
                #   summary: ...
                #   pages:
                #   - name: Overview
                #     content: &#40;== include overview.md ==&#41;
                # </code></pre>
                # Note: you cannot specify both `overview` field and `pages` field.
            "pages": [ # The top level pages for the documentation set.
              { # Represents a documentation page. A page can contain subpages to represent
                  # nested documentation set structure.
                "content": "A String", # The Markdown content of the page. You can use <code>&#40;== include {path} ==&#41;</code>
                    # to include content from a Markdown file.
                "subpages": [ # Subpages of this page. The order of subpages specified here will be
                    # honored in the generated docset.
                  # Object with schema name: Page
                ],
                "name": "A String", # 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:
                    # <pre><code>pages:
                    # - name: Tutorial
                    #   content: &#40;== include tutorial.md ==&#41;
                    #   subpages:
                    #   - name: Java
                    #     content: &#40;== include tutorial_java.md ==&#41;
                    # </code></pre>
                    # You can reference `Java` page using Markdown reference link syntax:
                    # `Java`.
              },
            ],
            "summary": "A String", # A short summary of what the service does. Can only be provided by
                # plain text.
          },
          "sourceInfo": { # Source information used to create a Service Config # Output only. The source information for this configuration if available.
            "sourceFiles": [ # All files used during config generation.
              {
                "a_key": "", # Properties of the object. Contains field @type with type URL.
              },
            ],
          },
          "systemTypes": [ # A list of all proto message types included in this API service.
              # It serves similar purpose as [google.api.Service.types], except that
              # these types are not needed by user-defined APIs. Therefore, they will not
              # show up in the generated discovery doc. This field should only be used
              # to define system APIs in ESF.
            { # A protocol buffer message type.
              "oneofs": [ # The list of types appearing in `oneof` definitions in this type.
                "A String",
              ],
              "name": "A String", # The fully qualified message name.
              "fields": [ # The list of fields.
                { # A single field of a message type.
                  "kind": "A String", # The field type.
                  "oneofIndex": 42, # The index of the field type in `Type.oneofs`, for message or enumeration
                      # types. The first type has index 1; zero means the type is not in the list.
                  "typeUrl": "A String", # The field type URL, without the scheme, for message or enumeration
                      # types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
                  "name": "A String", # The field name.
                  "defaultValue": "A String", # The string value of the default value of this field. Proto2 syntax only.
                  "jsonName": "A String", # The field JSON name.
                  "number": 42, # The field number.
                  "cardinality": "A String", # The field cardinality.
                  "options": [ # The protocol buffer options.
                    { # A protocol buffer option, which can be attached to a message, field,
                        # enumeration, etc.
                      "name": "A String", # The option's name. For protobuf built-in options (options defined in
                          # descriptor.proto), this is the short name. For example, `"map_entry"`.
                          # For custom options, it should be the fully-qualified name. For example,
                          # `"google.api.http"`.
                      "value": { # The option'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.
                        "a_key": "", # Properties of the object. Contains field @type with type URL.
                      },
                    },
                  ],
                  "packed": True or False, # Whether to use alternative packed wire representation.
                },
              ],
              "syntax": "A String", # The source syntax.
              "sourceContext": { # `SourceContext` represents information about the source of a # The source context.
                  # protobuf element, like the file in which it is defined.
                "fileName": "A String", # The path-qualified name of the .proto file that contained the associated
                    # protobuf element.  For example: `"google/protobuf/source_context.proto"`.
              },
              "options": [ # The protocol buffer options.
                { # A protocol buffer option, which can be attached to a message, field,
                    # enumeration, etc.
                  "name": "A String", # The option's name. For protobuf built-in options (options defined in
                      # descriptor.proto), this is the short name. For example, `"map_entry"`.
                      # For custom options, it should be the fully-qualified name. For example,
                      # `"google.api.http"`.
                  "value": { # The option'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.
                    "a_key": "", # Properties of the object. Contains field @type with type URL.
                  },
                },
              ],
            },
          ],
          "context": { # `Context` defines which contexts an API requests. # Context configuration.
              #
              # Example:
              #
              #     context:
              #       rules:
              #       - selector: "*"
              #         requested:
              #         - google.rpc.context.ProjectContext
              #         - google.rpc.context.OriginContext
              #
              # The above specifies that all methods in the API request
              # `google.rpc.context.ProjectContext` and
              # `google.rpc.context.OriginContext`.
              #
              # Available context types are defined in package
              # `google.rpc.context`.
            "rules": [ # A list of RPC context rules that apply to individual API methods.
                #
                # **NOTE:** All service configuration rules follow "last one wins" order.
              { # A context rule provides information about the context for an individual API
                  # element.
                "provided": [ # A list of full type names of provided contexts.
                  "A String",
                ],
                "requested": [ # A list of full type names of requested contexts.
                  "A String",
                ],
                "selector": "A String", # Selects the methods to which this rule applies.
                    #
                    # Refer to selector for syntax details.
              },
            ],
          },
          "endpoints": [ # Configuration for network endpoints.  If this is empty, then an endpoint
              # with the same name as the service is automatically generated to service all
              # defined APIs.
            { # `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 'google.example.library.v1.Library'
                #       # 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
              "features": [ # The list of features enabled on this endpoint.
                "A String",
              ],
              "apis": [ # The list of APIs served by this endpoint.
                  #
                  # If no APIs are specified this translates to "all APIs" exported by the
                  # service, as defined in the top-level service configuration.
                "A String",
              ],
              "allowCors": 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.
              "name": "A String", # The canonical name of this endpoint.
              "target": "A String", # 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, "8.8.8.8" or "myservice.appspot.com".
              "aliases": [ # DEPRECATED: This field is no longer supported. Instead of using aliases,
                  # please specify multiple google.api.Endpoint for each of the intented
                  # alias.
                  #
                  # Additional names that this endpoint will be hosted on.
                "A String",
              ],
            },
          ],
          "experimental": { # Experimental service configuration. These configuration options can # Experimental configuration.
              # only be used by whitelisted users.
            "authorization": { # Configuration of authorization. # Authorization configuration.
                #
                # This section determines the authorization provider, if unspecified, then no
                # authorization check will be done.
                #
                # Example:
                #
                #     experimental:
                #       authorization:
                #         provider: firebaserules.googleapis.com
              "provider": "A String", # The name of the authorization provider, such as
                  # firebaserules.googleapis.com.
            },
          },
        },
      },
    ],
    "nextPageToken": "A String", # Token that can be passed to `ListAvailableServices` to resume a paginated
        # query.
  }</pre>
</div>

<div class="method">
    <code class="details" id="search_next">search_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 'execute()' on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

</body></html>