<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="pubsub_v1beta1a.html">Cloud Pub/Sub API</a> . <a href="pubsub_v1beta1a.subscriptions.html">subscriptions</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#acknowledge">acknowledge(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Acknowledges a particular received message: the Pub/Sub system can remove</p>
<p class="toc_element">
  <code><a href="#create">create(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a subscription on a given topic for a given subscriber.</p>
<p class="toc_element">
  <code><a href="#delete">delete(subscription, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes an existing subscription. All pending messages in the subscription</p>
<p class="toc_element">
  <code><a href="#get">get(subscription, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the configuration details of a subscription.</p>
<p class="toc_element">
  <code><a href="#list">list(pageToken=None, maxResults=None, query=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists matching subscriptions.</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="#modifyAckDeadline">modifyAckDeadline(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Modifies the Ack deadline for a message received from a pull request.</p>
<p class="toc_element">
  <code><a href="#modifyPushConfig">modifyPushConfig(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Modifies the <code>PushConfig</code> for a specified subscription.</p>
<p class="toc_element">
  <code><a href="#pull">pull(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Pulls a single message from the server.</p>
<p class="toc_element">
  <code><a href="#pullBatch">pullBatch(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Pulls messages from the server. Returns an empty list if there are no</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="acknowledge">acknowledge(body=None, x__xgafv=None)</code>
  <pre>Acknowledges a particular received message: the Pub/Sub system can remove
the given message from the subscription. Acknowledging a message whose
Ack deadline has expired may succeed, but the message could have been
already redelivered. Acknowledging a message more than once will not
result in an error. This is only used for messages received via pull.

Args:
  body: object, The request body.
    The object takes the form of:

{ # Request for the Acknowledge method.
    &quot;subscription&quot;: &quot;A String&quot;, # The subscription whose message is being acknowledged.
    &quot;ackId&quot;: [ # The acknowledgment ID for the message being acknowledged. This was
        # returned by the Pub/Sub system in the Pull response.
      &quot;A String&quot;,
    ],
  }

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

Returns:
  An object of the form:

    { # An empty message that you can re-use to avoid defining duplicated empty
      # messages in your project. A typical example is to use it as argument or the
      # return value of a service API. For instance:
      #
      #   service Foo {
      #     rpc Bar (proto2.Empty) returns (proto2.Empty) { };
      #   };
      #
      # BEGIN GOOGLE-INTERNAL
      # The difference between this one and net/rpc/empty-message.proto is that
      # 1) The generated message here is in proto2 C++ API.
      # 2) The proto2.Empty has minimum dependencies
      #    (no message_set or net/rpc dependencies)
      # END GOOGLE-INTERNAL
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(body=None, x__xgafv=None)</code>
  <pre>Creates a subscription on a given topic for a given subscriber.
If the subscription already exists, returns ALREADY_EXISTS.
If the corresponding topic doesn&#x27;t exist, returns NOT_FOUND.

If the name is not provided in the request, the server will assign a random
name for this subscription on the same project as the topic.

Args:
  body: object, The request body.
    The object takes the form of:

{ # A subscription resource.
  &quot;ackDeadlineSeconds&quot;: 42, # For either push or pull delivery, the value is the maximum time after a
      # subscriber receives a message before the subscriber should acknowledge or
      # Nack the message. If the Ack deadline for a message passes without an
      # Ack or a Nack, the Pub/Sub system will eventually redeliver the message.
      # If a subscriber acknowledges after the deadline, the Pub/Sub system may
      # accept the Ack, but it is possible that the message has been already
      # delivered again. Multiple Acks to the message are allowed and will
      # succeed.
      # 
      # For push delivery, this value is used to set the request timeout for
      # the call to the push endpoint.
      # 
      # For pull delivery, this value is used as the initial value for the Ack
      # deadline. It may be overridden for each message using its corresponding
      # ack_id with &lt;code&gt;ModifyAckDeadline&lt;/code&gt;.
      # While a message is outstanding (i.e. it has been delivered to a pull
      # subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub
      # system will not deliver that message to another pull subscriber
      # (on a best-effort basis).
  &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
      # used to configure it.
    &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
        # For example, a Webhook endpoint might use &quot;https://example.com/push&quot;.
  },
  &quot;name&quot;: &quot;A String&quot;, # Name of the subscription.
  &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages.
}

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

Returns:
  An object of the form:

    { # A subscription resource.
    &quot;ackDeadlineSeconds&quot;: 42, # For either push or pull delivery, the value is the maximum time after a
        # subscriber receives a message before the subscriber should acknowledge or
        # Nack the message. If the Ack deadline for a message passes without an
        # Ack or a Nack, the Pub/Sub system will eventually redeliver the message.
        # If a subscriber acknowledges after the deadline, the Pub/Sub system may
        # accept the Ack, but it is possible that the message has been already
        # delivered again. Multiple Acks to the message are allowed and will
        # succeed.
        #
        # For push delivery, this value is used to set the request timeout for
        # the call to the push endpoint.
        #
        # For pull delivery, this value is used as the initial value for the Ack
        # deadline. It may be overridden for each message using its corresponding
        # ack_id with &lt;code&gt;ModifyAckDeadline&lt;/code&gt;.
        # While a message is outstanding (i.e. it has been delivered to a pull
        # subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub
        # system will not deliver that message to another pull subscriber
        # (on a best-effort basis).
    &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
        # used to configure it.
      &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use &quot;https://example.com/push&quot;.
    },
    &quot;name&quot;: &quot;A String&quot;, # Name of the subscription.
    &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages.
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(subscription, x__xgafv=None)</code>
  <pre>Deletes an existing subscription. All pending messages in the subscription
are immediately dropped. Calls to Pull after deletion will return
NOT_FOUND.

Args:
  subscription: string, The subscription to delete. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An empty message that you can re-use to avoid defining duplicated empty
      # messages in your project. A typical example is to use it as argument or the
      # return value of a service API. For instance:
      #
      #   service Foo {
      #     rpc Bar (proto2.Empty) returns (proto2.Empty) { };
      #   };
      #
      # BEGIN GOOGLE-INTERNAL
      # The difference between this one and net/rpc/empty-message.proto is that
      # 1) The generated message here is in proto2 C++ API.
      # 2) The proto2.Empty has minimum dependencies
      #    (no message_set or net/rpc dependencies)
      # END GOOGLE-INTERNAL
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(subscription, x__xgafv=None)</code>
  <pre>Gets the configuration details of a subscription.

Args:
  subscription: string, The name of the subscription to get. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A subscription resource.
    &quot;ackDeadlineSeconds&quot;: 42, # For either push or pull delivery, the value is the maximum time after a
        # subscriber receives a message before the subscriber should acknowledge or
        # Nack the message. If the Ack deadline for a message passes without an
        # Ack or a Nack, the Pub/Sub system will eventually redeliver the message.
        # If a subscriber acknowledges after the deadline, the Pub/Sub system may
        # accept the Ack, but it is possible that the message has been already
        # delivered again. Multiple Acks to the message are allowed and will
        # succeed.
        #
        # For push delivery, this value is used to set the request timeout for
        # the call to the push endpoint.
        #
        # For pull delivery, this value is used as the initial value for the Ack
        # deadline. It may be overridden for each message using its corresponding
        # ack_id with &lt;code&gt;ModifyAckDeadline&lt;/code&gt;.
        # While a message is outstanding (i.e. it has been delivered to a pull
        # subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub
        # system will not deliver that message to another pull subscriber
        # (on a best-effort basis).
    &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
        # used to configure it.
      &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use &quot;https://example.com/push&quot;.
    },
    &quot;name&quot;: &quot;A String&quot;, # Name of the subscription.
    &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(pageToken=None, maxResults=None, query=None, x__xgafv=None)</code>
  <pre>Lists matching subscriptions.

Args:
  pageToken: string, The value obtained in the last &lt;code&gt;ListSubscriptionsResponse&lt;/code&gt;
for continuation.
  maxResults: integer, Maximum number of subscriptions to return.
  query: string, A valid label query expression.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for the ListSubscriptions method.
    &quot;subscription&quot;: [ # The subscriptions that match the request.
      { # A subscription resource.
        &quot;ackDeadlineSeconds&quot;: 42, # For either push or pull delivery, the value is the maximum time after a
            # subscriber receives a message before the subscriber should acknowledge or
            # Nack the message. If the Ack deadline for a message passes without an
            # Ack or a Nack, the Pub/Sub system will eventually redeliver the message.
            # If a subscriber acknowledges after the deadline, the Pub/Sub system may
            # accept the Ack, but it is possible that the message has been already
            # delivered again. Multiple Acks to the message are allowed and will
            # succeed.
            #
            # For push delivery, this value is used to set the request timeout for
            # the call to the push endpoint.
            #
            # For pull delivery, this value is used as the initial value for the Ack
            # deadline. It may be overridden for each message using its corresponding
            # ack_id with &lt;code&gt;ModifyAckDeadline&lt;/code&gt;.
            # While a message is outstanding (i.e. it has been delivered to a pull
            # subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub
            # system will not deliver that message to another pull subscriber
            # (on a best-effort basis).
        &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
            # used to configure it.
          &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
              # For example, a Webhook endpoint might use &quot;https://example.com/push&quot;.
        },
        &quot;name&quot;: &quot;A String&quot;, # Name of the subscription.
        &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages.
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # If not empty, indicates that there are more subscriptions that match the
        # request and this value should be passed to the next
        # &lt;code&gt;ListSubscriptionsRequest&lt;/code&gt; to continue.
  }</pre>
</div>

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

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

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

<div class="method">
    <code class="details" id="modifyAckDeadline">modifyAckDeadline(body=None, x__xgafv=None)</code>
  <pre>Modifies the Ack deadline for a message received from a pull request.

Args:
  body: object, The request body.
    The object takes the form of:

{ # Request for the ModifyAckDeadline method.
    &quot;ackId&quot;: &quot;A String&quot;, # The acknowledgment ID. Either this or ack_ids must be populated,
        # not both.
    &quot;ackDeadlineSeconds&quot;: 42, # The new ack deadline with respect to the time this request was sent to the
        # Pub/Sub system. Must be &gt;= 0. For example, if the value is 10, the new ack
        # deadline will expire 10 seconds after the ModifyAckDeadline call was made.
        # Specifying zero may immediately make the message available for another pull
        # request.
    &quot;subscription&quot;: &quot;A String&quot;, # Next Index: 5
        # The name of the subscription from which messages are being pulled.
    &quot;ackIds&quot;: [ # List of acknowledgment IDs. Either this field or ack_id
        # should be populated, not both.
      &quot;A String&quot;,
    ],
  }

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

Returns:
  An object of the form:

    { # An empty message that you can re-use to avoid defining duplicated empty
      # messages in your project. A typical example is to use it as argument or the
      # return value of a service API. For instance:
      #
      #   service Foo {
      #     rpc Bar (proto2.Empty) returns (proto2.Empty) { };
      #   };
      #
      # BEGIN GOOGLE-INTERNAL
      # The difference between this one and net/rpc/empty-message.proto is that
      # 1) The generated message here is in proto2 C++ API.
      # 2) The proto2.Empty has minimum dependencies
      #    (no message_set or net/rpc dependencies)
      # END GOOGLE-INTERNAL
  }</pre>
</div>

<div class="method">
    <code class="details" id="modifyPushConfig">modifyPushConfig(body=None, x__xgafv=None)</code>
  <pre>Modifies the &lt;code&gt;PushConfig&lt;/code&gt; for a specified subscription.
This method can be used to suspend the flow of messages to an endpoint
by clearing the &lt;code&gt;PushConfig&lt;/code&gt; field in the request. Messages
will be accumulated for delivery even if no push configuration is
defined or while the configuration is modified.

Args:
  body: object, The request body.
    The object takes the form of:

{ # Request for the ModifyPushConfig method.
    &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # An empty &lt;code&gt;push_config&lt;/code&gt; indicates that the Pub/Sub system should
        # pause pushing messages from the given subscription.
      &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use &quot;https://example.com/push&quot;.
    },
    &quot;subscription&quot;: &quot;A String&quot;, # The name of the subscription.
  }

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

Returns:
  An object of the form:

    { # An empty message that you can re-use to avoid defining duplicated empty
      # messages in your project. A typical example is to use it as argument or the
      # return value of a service API. For instance:
      #
      #   service Foo {
      #     rpc Bar (proto2.Empty) returns (proto2.Empty) { };
      #   };
      #
      # BEGIN GOOGLE-INTERNAL
      # The difference between this one and net/rpc/empty-message.proto is that
      # 1) The generated message here is in proto2 C++ API.
      # 2) The proto2.Empty has minimum dependencies
      #    (no message_set or net/rpc dependencies)
      # END GOOGLE-INTERNAL
  }</pre>
</div>

<div class="method">
    <code class="details" id="pull">pull(body=None, x__xgafv=None)</code>
  <pre>Pulls a single message from the server.
If return_immediately is true, and no messages are available in the
subscription, this method returns FAILED_PRECONDITION. The system is free
to return an UNAVAILABLE error if no messages are available in a
reasonable amount of time (to reduce system load).

Args:
  body: object, The request body.
    The object takes the form of:

{ # Request for the Pull method.
    &quot;returnImmediately&quot;: True or False, # If this is specified as true the system will respond immediately even if
        # it is not able to return a message in the Pull response. Otherwise the
        # system is allowed to wait until at least one message is available rather
        # than returning FAILED_PRECONDITION. The client may cancel the request if
        # it does not wish to wait any longer for the response.
    &quot;subscription&quot;: &quot;A String&quot;, # The subscription from which a message should be pulled.
  }

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

Returns:
  An object of the form:

    { # Either a &lt;code&gt;PubsubMessage&lt;/code&gt; or a truncation event. One of these two
      # must be populated.
    &quot;pubsubEvent&quot;: { # An event indicating a received message or truncation event. # A pubsub message or truncation event.
      &quot;subscription&quot;: &quot;A String&quot;, # The subscription that received the event.
      &quot;deleted&quot;: True or False, # Indicates that this subscription has been deleted. (Note that pull
          # subscribers will always receive NOT_FOUND in response in their pull
          # request on the subscription, rather than seeing this boolean.)
      &quot;message&quot;: { # A message data and its labels. # A received message.
        &quot;messageId&quot;: &quot;A String&quot;, # ID of this message assigned by the server at publication time. Guaranteed
            # to be unique within the topic. This value may be read by a subscriber
            # that receives a PubsubMessage via a Pull call or a push delivery. It must
            # not be populated by a publisher in a Publish call.
        &quot;data&quot;: &quot;A String&quot;, # The message payload.
        &quot;publishTime&quot;: &quot;A String&quot;, # The time at which the message was published.
            # The time is milliseconds since the UNIX epoch.
        &quot;label&quot;: [ # Optional list of labels for this message. Keys in this collection must
            # be unique.
          { # A key-value pair applied to a given object.
            &quot;key&quot;: &quot;A String&quot;, # The key of a label is a syntactically valid URL (as per RFC 1738) with
                # the &quot;scheme&quot; and initial slashes omitted and with the additional
                # restrictions noted below.  Each key should be globally unique.  The
                # &quot;host&quot; portion is called the &quot;namespace&quot; and is not necessarily
                # resolvable to a network endpoint.  Instead, the namespace indicates what
                # system or entity defines the semantics of the label.  Namespaces do not
                # restrict the set of objects to which a label may be associated.
                #
                # Keys are defined by the following grammar:
                #
                #   key          = hostname &quot;/&quot; kpath
                #   kpath        = ksegment *[ &quot;/&quot; ksegment ]
                #   ksegment     = alphadigit | *[ alphadigit | &quot;-&quot; | &quot;_&quot; | &quot;.&quot; ]
                #
                # where &quot;hostname&quot; and &quot;alphadigit&quot; are defined as in RFC 1738.
                #
                # Example key:
                #   spanner.google.com/universe
            &quot;strValue&quot;: &quot;A String&quot;, # A string value.
            &quot;numValue&quot;: &quot;A String&quot;, # An integer value.
          },
        ],
      },
      &quot;truncated&quot;: True or False, # Indicates that this subscription has been truncated.
    },
    &quot;ackId&quot;: &quot;A String&quot;, # This ID must be used to acknowledge the received event or message.
  }</pre>
</div>

<div class="method">
    <code class="details" id="pullBatch">pullBatch(body=None, x__xgafv=None)</code>
  <pre>Pulls messages from the server. Returns an empty list if there are no
messages available in the backlog. The system is free to return UNAVAILABLE
if there are too many pull requests outstanding for the given subscription.

Args:
  body: object, The request body.
    The object takes the form of:

{ # Request for the PullBatch method.
    &quot;subscription&quot;: &quot;A String&quot;, # The subscription from which messages should be pulled.
    &quot;returnImmediately&quot;: True or False, # If this is specified as true the system will respond immediately even if
        # it is not able to return a message in the Pull response. Otherwise the
        # system is allowed to wait until at least one message is available rather
        # than returning no messages. The client may cancel the request if it does
        # not wish to wait any longer for the response.
    &quot;maxEvents&quot;: 42, # The maximum number of PubsubEvents returned for this request. The Pub/Sub
        # system may return fewer than the number of events specified.
  }

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

Returns:
  An object of the form:

    { # Response for the PullBatch method.
    &quot;pullResponses&quot;: [ # Received Pub/Sub messages or status events. The Pub/Sub system will return
        # zero messages if there are no more messages available in the backlog. The
        # Pub/Sub system may return fewer than the max_events requested even if
        # there are more messages available in the backlog.
      { # Either a &lt;code&gt;PubsubMessage&lt;/code&gt; or a truncation event. One of these two
          # must be populated.
        &quot;pubsubEvent&quot;: { # An event indicating a received message or truncation event. # A pubsub message or truncation event.
          &quot;subscription&quot;: &quot;A String&quot;, # The subscription that received the event.
          &quot;deleted&quot;: True or False, # Indicates that this subscription has been deleted. (Note that pull
              # subscribers will always receive NOT_FOUND in response in their pull
              # request on the subscription, rather than seeing this boolean.)
          &quot;message&quot;: { # A message data and its labels. # A received message.
            &quot;messageId&quot;: &quot;A String&quot;, # ID of this message assigned by the server at publication time. Guaranteed
                # to be unique within the topic. This value may be read by a subscriber
                # that receives a PubsubMessage via a Pull call or a push delivery. It must
                # not be populated by a publisher in a Publish call.
            &quot;data&quot;: &quot;A String&quot;, # The message payload.
            &quot;publishTime&quot;: &quot;A String&quot;, # The time at which the message was published.
                # The time is milliseconds since the UNIX epoch.
            &quot;label&quot;: [ # Optional list of labels for this message. Keys in this collection must
                # be unique.
              { # A key-value pair applied to a given object.
                &quot;key&quot;: &quot;A String&quot;, # The key of a label is a syntactically valid URL (as per RFC 1738) with
                    # the &quot;scheme&quot; and initial slashes omitted and with the additional
                    # restrictions noted below.  Each key should be globally unique.  The
                    # &quot;host&quot; portion is called the &quot;namespace&quot; and is not necessarily
                    # resolvable to a network endpoint.  Instead, the namespace indicates what
                    # system or entity defines the semantics of the label.  Namespaces do not
                    # restrict the set of objects to which a label may be associated.
                    #
                    # Keys are defined by the following grammar:
                    #
                    #   key          = hostname &quot;/&quot; kpath
                    #   kpath        = ksegment *[ &quot;/&quot; ksegment ]
                    #   ksegment     = alphadigit | *[ alphadigit | &quot;-&quot; | &quot;_&quot; | &quot;.&quot; ]
                    #
                    # where &quot;hostname&quot; and &quot;alphadigit&quot; are defined as in RFC 1738.
                    #
                    # Example key:
                    #   spanner.google.com/universe
                &quot;strValue&quot;: &quot;A String&quot;, # A string value.
                &quot;numValue&quot;: &quot;A String&quot;, # An integer value.
              },
            ],
          },
          &quot;truncated&quot;: True or False, # Indicates that this subscription has been truncated.
        },
        &quot;ackId&quot;: &quot;A String&quot;, # This ID must be used to acknowledge the received event or message.
      },
    ],
  }</pre>
</div>

</body></html>