<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="servicemanagement_v1.html">Google Service Management API</a> . <a href="servicemanagement_v1.services.html">services</a> . <a href="servicemanagement_v1.services.configs.html">configs</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(serviceName, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new service configuration (version) for a managed service.</p>
<p class="toc_element">
  <code><a href="#get">get(serviceName, configId, x__xgafv=None, view=None)</a></code></p>
<p class="firstline">Gets a service configuration (version) for a managed service.</p>
<p class="toc_element">
  <code><a href="#list">list(serviceName, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists the history of the service configuration for a managed service,</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#submit">submit(serviceName, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new service configuration (version) for a managed service based</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(serviceName, body, x__xgafv=None)</code>
  <pre>Creates a new service configuration (version) for a managed service.
This method only stores the service configuration. To roll out the service
configuration to backend systems please call
CreateServiceRollout.

Args:
  serviceName: string, The name of the service.  See the [overview](/service-management/overview)
for naming requirements.  For example: `example.googleapis.com`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # `Service` is the root object of Google service configuration schema. It
    # 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
        },
        "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
          },
        ],
        "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.
        "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
        "allowUnregisteredCalls": True or False, # True, if the method allows unregistered calls; false otherwise.
        "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.
      },
    ],
    "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.
          "progressNotification": True or False, # Whether to receive a notification for progress changes of media upload.
          "startNotification": True or False, # Whether to receive a notification on the start of media upload.
          "mimeTypes": [ # An array of mimetype patterns. Esf will only accept uploads that match one
              # of the given patterns.
            "A String",
          ],
          "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.
          "enabled": True or False, # Whether upload is enabled.
          "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.
          "maxSize": "A String", # Optional maximum acceptable size for an upload.
              # The size is specified in bytes.
          "dropzone": "A String", # Name of the Scotty dropzone to use for the current API.
        },
        "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.
          "enabled": True or False, # Whether download is enabled.
          "completeNotification": True or False, # A boolean that determines whether a notification for the completion of a
              # download should be sent to the backend.
          "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".
      "description": "A String", # A detailed description of the metric, which can be used in documentation.
      "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 '}'.
      "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"
    },
  ],
  "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.
      "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"`.
      },
      "enumvalue": [ # Enum value definitions.
        { # Enum value definition.
          "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 value name.
          "number": 42, # Enum value number.
        },
      ],
      "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.
      "syntax": "A String", # The source syntax.
    },
  ],
  "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",
        ],
        "selector": "A String", # Selects the methods to which this rule applies.
            #
            # Refer to selector for syntax details.
        "requested": [ # A list of full type names of requested contexts.
          "A String",
        ],
      },
    ],
  },
  "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
      "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".
      "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.
      "features": [ # The list of features enabled on this endpoint.
        "A String",
      ],
      "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.
    },
  },
}

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

Returns:
  An object of the form:

    { # `Service` is the root object of Google service configuration schema. It
      # 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
          },
          "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
            },
          ],
          "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.
          "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
          "allowUnregisteredCalls": True or False, # True, if the method allows unregistered calls; false otherwise.
          "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.
        },
      ],
      "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.
            "progressNotification": True or False, # Whether to receive a notification for progress changes of media upload.
            "startNotification": True or False, # Whether to receive a notification on the start of media upload.
            "mimeTypes": [ # An array of mimetype patterns. Esf will only accept uploads that match one
                # of the given patterns.
              "A String",
            ],
            "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.
            "enabled": True or False, # Whether upload is enabled.
            "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.
            "maxSize": "A String", # Optional maximum acceptable size for an upload.
                # The size is specified in bytes.
            "dropzone": "A String", # Name of the Scotty dropzone to use for the current API.
          },
          "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.
            "enabled": True or False, # Whether download is enabled.
            "completeNotification": True or False, # A boolean that determines whether a notification for the completion of a
                # download should be sent to the backend.
            "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".
        "description": "A String", # A detailed description of the metric, which can be used in documentation.
        "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 '}'.
        "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"
      },
    ],
    "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.
        "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"`.
        },
        "enumvalue": [ # Enum value definitions.
          { # Enum value definition.
            "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 value name.
            "number": 42, # Enum value number.
          },
        ],
        "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.
        "syntax": "A String", # The source syntax.
      },
    ],
    "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",
          ],
          "selector": "A String", # Selects the methods to which this rule applies.
              #
              # Refer to selector for syntax details.
          "requested": [ # A list of full type names of requested contexts.
            "A String",
          ],
        },
      ],
    },
    "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
        "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".
        "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.
        "features": [ # The list of features enabled on this endpoint.
          "A String",
        ],
        "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.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(serviceName, configId, x__xgafv=None, view=None)</code>
  <pre>Gets a service configuration (version) for a managed service.

Args:
  serviceName: string, The name of the service.  See the [overview](/service-management/overview)
for naming requirements.  For example: `example.googleapis.com`. (required)
  configId: string, The id of the service configuration resource. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format
  view: string, Specifies which parts of the Service Config should be returned in the
response.

Returns:
  An object of the form:

    { # `Service` is the root object of Google service configuration schema. It
      # 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
          },
          "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
            },
          ],
          "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.
          "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
          "allowUnregisteredCalls": True or False, # True, if the method allows unregistered calls; false otherwise.
          "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.
        },
      ],
      "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.
            "progressNotification": True or False, # Whether to receive a notification for progress changes of media upload.
            "startNotification": True or False, # Whether to receive a notification on the start of media upload.
            "mimeTypes": [ # An array of mimetype patterns. Esf will only accept uploads that match one
                # of the given patterns.
              "A String",
            ],
            "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.
            "enabled": True or False, # Whether upload is enabled.
            "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.
            "maxSize": "A String", # Optional maximum acceptable size for an upload.
                # The size is specified in bytes.
            "dropzone": "A String", # Name of the Scotty dropzone to use for the current API.
          },
          "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.
            "enabled": True or False, # Whether download is enabled.
            "completeNotification": True or False, # A boolean that determines whether a notification for the completion of a
                # download should be sent to the backend.
            "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".
        "description": "A String", # A detailed description of the metric, which can be used in documentation.
        "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 '}'.
        "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"
      },
    ],
    "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.
        "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"`.
        },
        "enumvalue": [ # Enum value definitions.
          { # Enum value definition.
            "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 value name.
            "number": 42, # Enum value number.
          },
        ],
        "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.
        "syntax": "A String", # The source syntax.
      },
    ],
    "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",
          ],
          "selector": "A String", # Selects the methods to which this rule applies.
              #
              # Refer to selector for syntax details.
          "requested": [ # A list of full type names of requested contexts.
            "A String",
          ],
        },
      ],
    },
    "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
        "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".
        "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.
        "features": [ # The list of features enabled on this endpoint.
          "A String",
        ],
        "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.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(serviceName, pageSize=None, pageToken=None, x__xgafv=None)</code>
  <pre>Lists the history of the service configuration for a managed service,
from the newest to the oldest.

Args:
  serviceName: string, The name of the service.  See the [overview](/service-management/overview)
for naming requirements.  For example: `example.googleapis.com`. (required)
  pageSize: integer, The max number of items to include in the response list.
  pageToken: string, The token of the page to retrieve.
  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 ListServiceConfigs method.
    "nextPageToken": "A String", # The token of the next page of results.
    "serviceConfigs": [ # The list of service configuration resources.
      { # `Service` is the root object of Google service configuration schema. It
          # 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
              },
              "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
                },
              ],
              "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.
              "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
              "allowUnregisteredCalls": True or False, # True, if the method allows unregistered calls; false otherwise.
              "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.
            },
          ],
          "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.
                "progressNotification": True or False, # Whether to receive a notification for progress changes of media upload.
                "startNotification": True or False, # Whether to receive a notification on the start of media upload.
                "mimeTypes": [ # An array of mimetype patterns. Esf will only accept uploads that match one
                    # of the given patterns.
                  "A String",
                ],
                "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.
                "enabled": True or False, # Whether upload is enabled.
                "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.
                "maxSize": "A String", # Optional maximum acceptable size for an upload.
                    # The size is specified in bytes.
                "dropzone": "A String", # Name of the Scotty dropzone to use for the current API.
              },
              "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.
                "enabled": True or False, # Whether download is enabled.
                "completeNotification": True or False, # A boolean that determines whether a notification for the completion of a
                    # download should be sent to the backend.
                "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".
            "description": "A String", # A detailed description of the metric, which can be used in documentation.
            "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 '}'.
            "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"
          },
        ],
        "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.
            "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"`.
            },
            "enumvalue": [ # Enum value definitions.
              { # Enum value definition.
                "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 value name.
                "number": 42, # Enum value number.
              },
            ],
            "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.
            "syntax": "A String", # The source syntax.
          },
        ],
        "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",
              ],
              "selector": "A String", # Selects the methods to which this rule applies.
                  #
                  # Refer to selector for syntax details.
              "requested": [ # A list of full type names of requested contexts.
                "A String",
              ],
            },
          ],
        },
        "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
            "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".
            "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.
            "features": [ # The list of features enabled on this endpoint.
              "A String",
            ],
            "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.
          },
        },
      },
    ],
  }</pre>
</div>

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

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

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

<div class="method">
    <code class="details" id="submit">submit(serviceName, body, x__xgafv=None)</code>
  <pre>Creates a new service configuration (version) for a managed service based
on
user-supplied configuration source files (for example: OpenAPI
Specification). This method stores the source configurations as well as the
generated service configuration. To rollout the service configuration to
other services,
please call CreateServiceRollout.

Operation<response: SubmitConfigSourceResponse>

Args:
  serviceName: string, The name of the service.  See the [overview](/service-management/overview)
for naming requirements.  For example: `example.googleapis.com`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request message for SubmitConfigSource method.
    "validateOnly": True or False, # Optional. If set, this will result in the generation of a
        # `google.api.Service` configuration based on the `ConfigSource` provided,
        # but the generated config and the sources will NOT be persisted.
    "configSource": { # Represents a source file which is used to generate the service configuration # The source configuration for the service.
        # defined by `google.api.Service`.
      "files": [ # Set of source configuration files that are used to generate a service
          # configuration (`google.api.Service`).
        { # Generic specification of a source configuration file
          "fileContents": "A String", # The bytes that constitute the file.
          "fileType": "A String", # The type of configuration file this represents.
          "filePath": "A String", # The file name of the configuration file (full or relative path).
        },
      ],
      "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.
    },
  }

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

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    "error": { # The `Status` type defines a logical error model that is suitable for different # The error result of the operation in case of failure or cancellation.
        # programming environments, including REST APIs and RPC APIs. It is used by
        # [gRPC](https://github.com/grpc). The error model is designed to be:
        #
        # - Simple to use and understand for most users
        # - Flexible enough to meet unexpected needs
        #
        # # Overview
        #
        # The `Status` message contains three pieces of data: error code, error message,
        # and error details. The error code should be an enum value of
        # google.rpc.Code, but it may accept additional error codes if needed.  The
        # error message should be a developer-facing English message that helps
        # developers *understand* and *resolve* the error. If a localized user-facing
        # error message is needed, put the localized message in the error details or
        # localize it in the client. The optional error details may contain arbitrary
        # information about the error. There is a predefined set of error detail types
        # in the package `google.rpc` that can be used for common error conditions.
        #
        # # Language mapping
        #
        # The `Status` message is the logical representation of the error model, but it
        # is not necessarily the actual wire format. When the `Status` message is
        # exposed in different client libraries and different wire protocols, it can be
        # mapped differently. For example, it will likely be mapped to some exceptions
        # in Java, but more likely mapped to some error codes in C.
        #
        # # Other uses
        #
        # The error model and the `Status` message can be used in a variety of
        # environments, either with or without APIs, to provide a
        # consistent developer experience across different environments.
        #
        # Example uses of this error model include:
        #
        # - Partial errors. If a service needs to return partial errors to the client,
        #     it may embed the `Status` in the normal response to indicate the partial
        #     errors.
        #
        # - Workflow errors. A typical workflow has multiple steps. Each step may
        #     have a `Status` message for error reporting.
        #
        # - Batch operations. If a client uses batch request and batch response, the
        #     `Status` message should be used directly inside batch response, one for
        #     each error sub-response.
        #
        # - Asynchronous operations. If an API call embeds asynchronous operation
        #     results in its response, the status of those operations should be
        #     represented directly using the `Status` message.
        #
        # - Logging. If some API errors are stored in logs, the message `Status` could
        #     be used directly after any stripping needed for security/privacy reasons.
      "message": "A String", # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There will be a
          # common set of message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "done": True or False, # If the value is `false`, it means the operation is still in progress.
        # If true, the operation is completed, and either `error` or `response` is
        # available.
    "response": { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
    "name": "A String", # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should have the format of `operations/some/unique/name`.
    "metadata": { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      "a_key": "", # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

</body></html>