<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_v1.html">Cloud Pub/Sub API</a> . <a href="pubsub_v1.projects.html">projects</a> . <a href="pubsub_v1.projects.subscriptions.html">subscriptions</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#acknowledge">acknowledge(subscription, body, x__xgafv=None)</a></code></p>
<p class="firstline">Acknowledges the messages associated with the `ack_ids` in the</p>
<p class="toc_element">
  <code><a href="#create">create(name, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a subscription to a given topic. See the</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 messages retained 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="#getIamPolicy">getIamPolicy(resource, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the access control policy for a resource.</p>
<p class="toc_element">
  <code><a href="#list">list(project, pageSize=None, pageToken=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(subscription, body, x__xgafv=None)</a></code></p>
<p class="firstline">Modifies the ack deadline for a specific message. This method is useful</p>
<p class="toc_element">
  <code><a href="#modifyPushConfig">modifyPushConfig(subscription, body, x__xgafv=None)</a></code></p>
<p class="firstline">Modifies the `PushConfig` for a specified subscription.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body, x__xgafv=None)</a></code></p>
<p class="firstline">Updates an existing subscription. Note that certain properties of a</p>
<p class="toc_element">
  <code><a href="#pull">pull(subscription, body, x__xgafv=None)</a></code></p>
<p class="firstline">Pulls messages from the server. The server may return `UNAVAILABLE` if</p>
<p class="toc_element">
  <code><a href="#seek">seek(subscription, body, x__xgafv=None)</a></code></p>
<p class="firstline">Seeks an existing subscription to a point in time or to a given snapshot,</p>
<p class="toc_element">
  <code><a href="#setIamPolicy">setIamPolicy(resource, body, x__xgafv=None)</a></code></p>
<p class="firstline">Sets the access control policy on the specified resource. Replaces any</p>
<p class="toc_element">
  <code><a href="#testIamPermissions">testIamPermissions(resource, body, x__xgafv=None)</a></code></p>
<p class="firstline">Returns permissions that a caller has on the specified resource.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="acknowledge">acknowledge(subscription, body, x__xgafv=None)</code>
  <pre>Acknowledges the messages associated with the `ack_ids` in the
`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages
from the subscription.

Acknowledging a message whose ack deadline has expired may succeed,
but such a message may be redelivered later. Acknowledging a message more
than once will not result in an error.

Args:
  subscription: string, The subscription whose message is being acknowledged.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for the Acknowledge method.
    "ackIds": [ # The acknowledgment ID for the messages being acknowledged that was returned
        # by the Pub/Sub system in the `Pull` response. Must not be empty.
      "A String",
    ],
  }

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

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(name, body, x__xgafv=None)</code>
  <pre>Creates a subscription to a given topic. See the
<a href="https://cloud.google.com/pubsub/docs/admin#resource_names">
resource name rules</a>.
If the subscription already exists, returns `ALREADY_EXISTS`.
If the corresponding topic doesn'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, conforming
to the
[resource name
format](https://cloud.google.com/pubsub/docs/admin#resource_names). The
generated name is populated in the returned Subscription object. Note that
for REST API requests, you must specify a name in the request.

Args:
  name: string, The name of the subscription. It must have the format
`"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
start with a letter, and contain only letters (`[A-Za-z]`), numbers
(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
in length, and it must not start with `"goog"`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # A subscription resource.
  "name": "A String", # The name of the subscription. It must have the format
      # `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
      # start with a letter, and contain only letters (`[A-Za-z]`), numbers
      # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
      # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
      # in length, and it must not start with `"goog"`.
  "ackDeadlineSeconds": 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
      # the subscriber to acknowledge receipt before resending the message. In the
      # interval after the message is delivered and before it is acknowledged, it
      # is considered to be <i>outstanding</i>. During that time period, the
      # message will not be redelivered (on a best-effort basis).
      # 
      # For pull subscriptions, this value is used as the initial value for the ack
      # deadline. To override this value for a given message, call
      # `ModifyAckDeadline` with the corresponding `ack_id` if using
      # non-streaming pull or send the `ack_id` in a
      # `StreamingModifyAckDeadlineRequest` if using streaming pull.
      # The minimum custom deadline you can specify is 10 seconds.
      # The maximum custom deadline you can specify is 600 seconds (10 minutes).
      # If this parameter is 0, a default value of 10 seconds is used.
      # 
      # For push delivery, this value is also used to set the request timeout for
      # the call to the push endpoint.
      # 
      # If the subscriber never acknowledges the message, the Pub/Sub
      # system will eventually redeliver the message.
  "labels": { # See <a href="https://cloud.google.com/pubsub/docs/labels"> Creating and
      # managing labels</a>.
    "a_key": "A String",
  },
  "pushConfig": { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
      # used to configure it. An empty `pushConfig` signifies that the subscriber
      # will pull and ack messages using API methods.
    "attributes": { # Endpoint configuration attributes.
        #
        # Every endpoint has a set of API supported attributes that can be used to
        # control different aspects of the message delivery.
        #
        # The currently supported attribute is `x-goog-version`, which you can
        # use to change the format of the pushed message. This attribute
        # indicates the version of the data expected by the endpoint. This
        # controls the shape of the pushed message (i.e., its fields and metadata).
        # The endpoint version is based on the version of the Pub/Sub API.
        #
        # If not present during the `CreateSubscription` call, it will default to
        # the version of the API used to make such call. If not present during a
        # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
        # calls will always return a valid version, even if the subscription was
        # created without this attribute.
        #
        # The possible values for this attribute are:
        #
        # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
        # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
      "a_key": "A String",
    },
    "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
        # `Authorization` header in the HTTP request for every pushed message.
        # [OpenID Connect
        # token](https://developers.google.com/identity/protocols/OpenIDConnect).
      "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
          # identifies the recipients that the JWT is intended for. The audience
          # value is a single case-sensitive string. Having multiple values (array)
          # for the audience field is not supported. More info about the OIDC JWT
          # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
          # Note: if not specified, the Push endpoint URL will be used.
      "serviceAccountEmail": "A String", # [Service account
          # email](https://cloud.google.com/iam/docs/service-accounts)
          # to be used for generating the OIDC token. The caller (for
          # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
          # have the iam.serviceAccounts.actAs permission for the service account.
    },
    "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
        # For example, a Webhook endpoint might use "https://example.com/push".
  },
  "topic": "A String", # The name of the topic from which this subscription is receiving messages.
      # Format is `projects/{project}/topics/{topic}`.
      # The value of this field will be `_deleted-topic_` if the topic has been
      # deleted.
  "messageRetentionDuration": "A String", # How long to retain unacknowledged messages in the subscription's backlog,
      # from the moment a message is published.
      # If `retain_acked_messages` is true, then this also configures the retention
      # of acknowledged messages, and thus configures how far back in time a `Seek`
      # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
      # minutes.
  "retainAckedMessages": True or False, # Indicates whether to retain acknowledged messages. If true, then
      # messages are not expunged from the subscription's backlog, even if they are
      # acknowledged, until they fall out of the `message_retention_duration`
      # window. This must be true if you would like to
      # <a
      # href="https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time">
      # Seek to a timestamp</a>.
  "expirationPolicy": { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription's expiration.
      # A subscription is considered active as long as any connected subscriber is
      # successfully consuming messages from the subscription or is issuing
      # operations on the subscription. If `expiration_policy` is not set, a
      # *default policy* with `ttl` of 31 days will be used. The minimum allowed
      # value for `expiration_policy.ttl` is 1 day.
      # automatic resource deletion).
    "ttl": "A String", # Specifies the "time-to-live" duration for an associated resource. The
        # resource expires if it is not active for a period of `ttl`. The definition
        # of "activity" depends on the type of the associated resource. The minimum
        # and maximum allowed values for `ttl` depend on the type of the associated
        # resource, as well. If `ttl` is not set, the associated resource never
        # expires.
  },
}

  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.
    "name": "A String", # The name of the subscription. It must have the format
        # `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
        # start with a letter, and contain only letters (`[A-Za-z]`), numbers
        # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
        # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
        # in length, and it must not start with `"goog"`.
    "ackDeadlineSeconds": 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
        # the subscriber to acknowledge receipt before resending the message. In the
        # interval after the message is delivered and before it is acknowledged, it
        # is considered to be <i>outstanding</i>. During that time period, the
        # message will not be redelivered (on a best-effort basis).
        #
        # For pull subscriptions, this value is used as the initial value for the ack
        # deadline. To override this value for a given message, call
        # `ModifyAckDeadline` with the corresponding `ack_id` if using
        # non-streaming pull or send the `ack_id` in a
        # `StreamingModifyAckDeadlineRequest` if using streaming pull.
        # The minimum custom deadline you can specify is 10 seconds.
        # The maximum custom deadline you can specify is 600 seconds (10 minutes).
        # If this parameter is 0, a default value of 10 seconds is used.
        #
        # For push delivery, this value is also used to set the request timeout for
        # the call to the push endpoint.
        #
        # If the subscriber never acknowledges the message, the Pub/Sub
        # system will eventually redeliver the message.
    "labels": { # See <a href="https://cloud.google.com/pubsub/docs/labels"> Creating and
        # managing labels</a>.
      "a_key": "A String",
    },
    "pushConfig": { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
        # used to configure it. An empty `pushConfig` signifies that the subscriber
        # will pull and ack messages using API methods.
      "attributes": { # Endpoint configuration attributes.
          #
          # Every endpoint has a set of API supported attributes that can be used to
          # control different aspects of the message delivery.
          #
          # The currently supported attribute is `x-goog-version`, which you can
          # use to change the format of the pushed message. This attribute
          # indicates the version of the data expected by the endpoint. This
          # controls the shape of the pushed message (i.e., its fields and metadata).
          # The endpoint version is based on the version of the Pub/Sub API.
          #
          # If not present during the `CreateSubscription` call, it will default to
          # the version of the API used to make such call. If not present during a
          # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
          # calls will always return a valid version, even if the subscription was
          # created without this attribute.
          #
          # The possible values for this attribute are:
          #
          # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
          # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
        "a_key": "A String",
      },
      "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
          # `Authorization` header in the HTTP request for every pushed message.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
        "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
            # identifies the recipients that the JWT is intended for. The audience
            # value is a single case-sensitive string. Having multiple values (array)
            # for the audience field is not supported. More info about the OIDC JWT
            # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
            # Note: if not specified, the Push endpoint URL will be used.
        "serviceAccountEmail": "A String", # [Service account
            # email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating the OIDC token. The caller (for
            # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
            # have the iam.serviceAccounts.actAs permission for the service account.
      },
      "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use "https://example.com/push".
    },
    "topic": "A String", # The name of the topic from which this subscription is receiving messages.
        # Format is `projects/{project}/topics/{topic}`.
        # The value of this field will be `_deleted-topic_` if the topic has been
        # deleted.
    "messageRetentionDuration": "A String", # How long to retain unacknowledged messages in the subscription's backlog,
        # from the moment a message is published.
        # If `retain_acked_messages` is true, then this also configures the retention
        # of acknowledged messages, and thus configures how far back in time a `Seek`
        # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
        # minutes.
    "retainAckedMessages": True or False, # Indicates whether to retain acknowledged messages. If true, then
        # messages are not expunged from the subscription's backlog, even if they are
        # acknowledged, until they fall out of the `message_retention_duration`
        # window. This must be true if you would like to
        # <a
        # href="https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time">
        # Seek to a timestamp</a>.
    "expirationPolicy": { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription's expiration.
        # A subscription is considered active as long as any connected subscriber is
        # successfully consuming messages from the subscription or is issuing
        # operations on the subscription. If `expiration_policy` is not set, a
        # *default policy* with `ttl` of 31 days will be used. The minimum allowed
        # value for `expiration_policy.ttl` is 1 day.
        # automatic resource deletion).
      "ttl": "A String", # Specifies the "time-to-live" duration for an associated resource. The
          # resource expires if it is not active for a period of `ttl`. The definition
          # of "activity" depends on the type of the associated resource. The minimum
          # and maximum allowed values for `ttl` depend on the type of the associated
          # resource, as well. If `ttl` is not set, the associated resource never
          # expires.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(subscription, x__xgafv=None)</code>
  <pre>Deletes an existing subscription. All messages retained in the subscription
are immediately dropped. Calls to `Pull` after deletion will return
`NOT_FOUND`. After a subscription is deleted, a new one may be created with
the same name, but the new one has no association with the old
subscription or its topic unless the same topic is specified.

Args:
  subscription: string, The subscription to delete.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</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.
Format is `projects/{project}/subscriptions/{sub}`. (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.
    "name": "A String", # The name of the subscription. It must have the format
        # `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
        # start with a letter, and contain only letters (`[A-Za-z]`), numbers
        # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
        # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
        # in length, and it must not start with `"goog"`.
    "ackDeadlineSeconds": 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
        # the subscriber to acknowledge receipt before resending the message. In the
        # interval after the message is delivered and before it is acknowledged, it
        # is considered to be <i>outstanding</i>. During that time period, the
        # message will not be redelivered (on a best-effort basis).
        #
        # For pull subscriptions, this value is used as the initial value for the ack
        # deadline. To override this value for a given message, call
        # `ModifyAckDeadline` with the corresponding `ack_id` if using
        # non-streaming pull or send the `ack_id` in a
        # `StreamingModifyAckDeadlineRequest` if using streaming pull.
        # The minimum custom deadline you can specify is 10 seconds.
        # The maximum custom deadline you can specify is 600 seconds (10 minutes).
        # If this parameter is 0, a default value of 10 seconds is used.
        #
        # For push delivery, this value is also used to set the request timeout for
        # the call to the push endpoint.
        #
        # If the subscriber never acknowledges the message, the Pub/Sub
        # system will eventually redeliver the message.
    "labels": { # See <a href="https://cloud.google.com/pubsub/docs/labels"> Creating and
        # managing labels</a>.
      "a_key": "A String",
    },
    "pushConfig": { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
        # used to configure it. An empty `pushConfig` signifies that the subscriber
        # will pull and ack messages using API methods.
      "attributes": { # Endpoint configuration attributes.
          #
          # Every endpoint has a set of API supported attributes that can be used to
          # control different aspects of the message delivery.
          #
          # The currently supported attribute is `x-goog-version`, which you can
          # use to change the format of the pushed message. This attribute
          # indicates the version of the data expected by the endpoint. This
          # controls the shape of the pushed message (i.e., its fields and metadata).
          # The endpoint version is based on the version of the Pub/Sub API.
          #
          # If not present during the `CreateSubscription` call, it will default to
          # the version of the API used to make such call. If not present during a
          # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
          # calls will always return a valid version, even if the subscription was
          # created without this attribute.
          #
          # The possible values for this attribute are:
          #
          # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
          # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
        "a_key": "A String",
      },
      "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
          # `Authorization` header in the HTTP request for every pushed message.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
        "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
            # identifies the recipients that the JWT is intended for. The audience
            # value is a single case-sensitive string. Having multiple values (array)
            # for the audience field is not supported. More info about the OIDC JWT
            # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
            # Note: if not specified, the Push endpoint URL will be used.
        "serviceAccountEmail": "A String", # [Service account
            # email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating the OIDC token. The caller (for
            # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
            # have the iam.serviceAccounts.actAs permission for the service account.
      },
      "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use "https://example.com/push".
    },
    "topic": "A String", # The name of the topic from which this subscription is receiving messages.
        # Format is `projects/{project}/topics/{topic}`.
        # The value of this field will be `_deleted-topic_` if the topic has been
        # deleted.
    "messageRetentionDuration": "A String", # How long to retain unacknowledged messages in the subscription's backlog,
        # from the moment a message is published.
        # If `retain_acked_messages` is true, then this also configures the retention
        # of acknowledged messages, and thus configures how far back in time a `Seek`
        # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
        # minutes.
    "retainAckedMessages": True or False, # Indicates whether to retain acknowledged messages. If true, then
        # messages are not expunged from the subscription's backlog, even if they are
        # acknowledged, until they fall out of the `message_retention_duration`
        # window. This must be true if you would like to
        # <a
        # href="https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time">
        # Seek to a timestamp</a>.
    "expirationPolicy": { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription's expiration.
        # A subscription is considered active as long as any connected subscriber is
        # successfully consuming messages from the subscription or is issuing
        # operations on the subscription. If `expiration_policy` is not set, a
        # *default policy* with `ttl` of 31 days will be used. The minimum allowed
        # value for `expiration_policy.ttl` is 1 day.
        # automatic resource deletion).
      "ttl": "A String", # Specifies the "time-to-live" duration for an associated resource. The
          # resource expires if it is not active for a period of `ttl`. The definition
          # of "activity" depends on the type of the associated resource. The minimum
          # and maximum allowed values for `ttl` depend on the type of the associated
          # resource, as well. If `ttl` is not set, the associated resource never
          # expires.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="getIamPolicy">getIamPolicy(resource, x__xgafv=None)</code>
  <pre>Gets the access control policy for a resource.
Returns an empty policy if the resource exists and does not have a policy
set.

Args:
  resource: string, REQUIRED: The resource for which the policy is being requested.
See the operation documentation for the appropriate value for this field. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **JSON Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # **YAML Example**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
      #       role: roles/owner
      #     - members:
      #       - user:sean@example.com
      #       role: roles/viewer
      #
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam/docs).
    "bindings": [ # Associates a list of `members` to a `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@gmail.com` .
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
        "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
            # NOTE: An unsatisfied condition will not allow user access via current
            # binding. Different bindings, including their conditions, are examined
            # independently.
            #
            #     title: "User account presence"
            #     description: "Determines whether the request has a user account"
            #     expression: "size(request.user) > 0"
          "location": "A String", # An optional string indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          "expression": "A String", # Textual representation of an expression in
              # Common Expression Language syntax.
              #
              # The application context of the containing message determines which
              # well-known feature set of CEL is supported.
          "description": "A String", # An optional description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          "title": "A String", # An optional title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
        },
      },
    ],
    "version": 42, # Deprecated.
    "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
  }</pre>
</div>

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

Args:
  project: string, The name of the project in which to list subscriptions.
Format is `projects/{project-id}`. (required)
  pageSize: integer, Maximum number of subscriptions to return.
  pageToken: string, The value returned by the last `ListSubscriptionsResponse`; indicates that
this is a continuation of a prior `ListSubscriptions` call, and that the
system should return the next page of data.
  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.
    "nextPageToken": "A String", # If not empty, indicates that there may be more subscriptions that match
        # the request; this value should be passed in a new
        # `ListSubscriptionsRequest` to get more subscriptions.
    "subscriptions": [ # The subscriptions that match the request.
      { # A subscription resource.
        "name": "A String", # The name of the subscription. It must have the format
            # `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
            # start with a letter, and contain only letters (`[A-Za-z]`), numbers
            # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
            # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
            # in length, and it must not start with `"goog"`.
        "ackDeadlineSeconds": 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
            # the subscriber to acknowledge receipt before resending the message. In the
            # interval after the message is delivered and before it is acknowledged, it
            # is considered to be <i>outstanding</i>. During that time period, the
            # message will not be redelivered (on a best-effort basis).
            #
            # For pull subscriptions, this value is used as the initial value for the ack
            # deadline. To override this value for a given message, call
            # `ModifyAckDeadline` with the corresponding `ack_id` if using
            # non-streaming pull or send the `ack_id` in a
            # `StreamingModifyAckDeadlineRequest` if using streaming pull.
            # The minimum custom deadline you can specify is 10 seconds.
            # The maximum custom deadline you can specify is 600 seconds (10 minutes).
            # If this parameter is 0, a default value of 10 seconds is used.
            #
            # For push delivery, this value is also used to set the request timeout for
            # the call to the push endpoint.
            #
            # If the subscriber never acknowledges the message, the Pub/Sub
            # system will eventually redeliver the message.
        "labels": { # See <a href="https://cloud.google.com/pubsub/docs/labels"> Creating and
            # managing labels</a>.
          "a_key": "A String",
        },
        "pushConfig": { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
            # used to configure it. An empty `pushConfig` signifies that the subscriber
            # will pull and ack messages using API methods.
          "attributes": { # Endpoint configuration attributes.
              #
              # Every endpoint has a set of API supported attributes that can be used to
              # control different aspects of the message delivery.
              #
              # The currently supported attribute is `x-goog-version`, which you can
              # use to change the format of the pushed message. This attribute
              # indicates the version of the data expected by the endpoint. This
              # controls the shape of the pushed message (i.e., its fields and metadata).
              # The endpoint version is based on the version of the Pub/Sub API.
              #
              # If not present during the `CreateSubscription` call, it will default to
              # the version of the API used to make such call. If not present during a
              # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
              # calls will always return a valid version, even if the subscription was
              # created without this attribute.
              #
              # The possible values for this attribute are:
              #
              # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
              # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
            "a_key": "A String",
          },
          "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
              # `Authorization` header in the HTTP request for every pushed message.
              # [OpenID Connect
              # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
                # identifies the recipients that the JWT is intended for. The audience
                # value is a single case-sensitive string. Having multiple values (array)
                # for the audience field is not supported. More info about the OIDC JWT
                # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
                # Note: if not specified, the Push endpoint URL will be used.
            "serviceAccountEmail": "A String", # [Service account
                # email](https://cloud.google.com/iam/docs/service-accounts)
                # to be used for generating the OIDC token. The caller (for
                # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
                # have the iam.serviceAccounts.actAs permission for the service account.
          },
          "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
              # For example, a Webhook endpoint might use "https://example.com/push".
        },
        "topic": "A String", # The name of the topic from which this subscription is receiving messages.
            # Format is `projects/{project}/topics/{topic}`.
            # The value of this field will be `_deleted-topic_` if the topic has been
            # deleted.
        "messageRetentionDuration": "A String", # How long to retain unacknowledged messages in the subscription's backlog,
            # from the moment a message is published.
            # If `retain_acked_messages` is true, then this also configures the retention
            # of acknowledged messages, and thus configures how far back in time a `Seek`
            # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
            # minutes.
        "retainAckedMessages": True or False, # Indicates whether to retain acknowledged messages. If true, then
            # messages are not expunged from the subscription's backlog, even if they are
            # acknowledged, until they fall out of the `message_retention_duration`
            # window. This must be true if you would like to
            # <a
            # href="https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time">
            # Seek to a timestamp</a>.
        "expirationPolicy": { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription's expiration.
            # A subscription is considered active as long as any connected subscriber is
            # successfully consuming messages from the subscription or is issuing
            # operations on the subscription. If `expiration_policy` is not set, a
            # *default policy* with `ttl` of 31 days will be used. The minimum allowed
            # value for `expiration_policy.ttl` is 1 day.
            # automatic resource deletion).
          "ttl": "A String", # Specifies the "time-to-live" duration for an associated resource. The
              # resource expires if it is not active for a period of `ttl`. The definition
              # of "activity" depends on the type of the associated resource. The minimum
              # and maximum allowed values for `ttl` depend on the type of the associated
              # resource, as well. If `ttl` is not set, the associated resource never
              # expires.
        },
      },
    ],
  }</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="modifyAckDeadline">modifyAckDeadline(subscription, body, x__xgafv=None)</code>
  <pre>Modifies the ack deadline for a specific message. This method is useful
to indicate that more time is needed to process a message by the
subscriber, or to make the message available for redelivery if the
processing was interrupted. Note that this does not modify the
subscription-level `ackDeadlineSeconds` used for subsequent messages.

Args:
  subscription: string, The name of the subscription.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for the ModifyAckDeadline method.
    "ackDeadlineSeconds": 42, # The new ack deadline with respect to the time this request was sent to
        # the Pub/Sub system. For example, if the value is 10, the new
        # ack deadline will expire 10 seconds after the `ModifyAckDeadline` call
        # was made. Specifying zero might immediately make the message available for
        # delivery to another subscriber client. This typically results in an
        # increase in the rate of message redeliveries (that is, duplicates).
        # The minimum deadline you can specify is 0 seconds.
        # The maximum deadline you can specify is 600 seconds (10 minutes).
    "ackIds": [ # List of acknowledgment IDs.
      "A String",
    ],
  }

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

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="modifyPushConfig">modifyPushConfig(subscription, body, x__xgafv=None)</code>
  <pre>Modifies the `PushConfig` for a specified subscription.

This may be used to change a push subscription to a pull one (signified by
an empty `PushConfig`) or vice versa, or change the endpoint URL and other
attributes of a push subscription. Messages will accumulate for delivery
continuously through the call regardless of changes to the `PushConfig`.

Args:
  subscription: string, The name of the subscription.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for the ModifyPushConfig method.
    "pushConfig": { # Configuration for a push delivery endpoint. # The push configuration for future deliveries.
        # 
        # An empty `pushConfig` indicates that the Pub/Sub system should
        # stop pushing messages from the given subscription and allow
        # messages to be pulled and acknowledged - effectively pausing
        # the subscription if `Pull` or `StreamingPull` is not called.
      "attributes": { # Endpoint configuration attributes.
          #
          # Every endpoint has a set of API supported attributes that can be used to
          # control different aspects of the message delivery.
          #
          # The currently supported attribute is `x-goog-version`, which you can
          # use to change the format of the pushed message. This attribute
          # indicates the version of the data expected by the endpoint. This
          # controls the shape of the pushed message (i.e., its fields and metadata).
          # The endpoint version is based on the version of the Pub/Sub API.
          #
          # If not present during the `CreateSubscription` call, it will default to
          # the version of the API used to make such call. If not present during a
          # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
          # calls will always return a valid version, even if the subscription was
          # created without this attribute.
          #
          # The possible values for this attribute are:
          #
          # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
          # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
        "a_key": "A String",
      },
      "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
          # `Authorization` header in the HTTP request for every pushed message.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
        "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
            # identifies the recipients that the JWT is intended for. The audience
            # value is a single case-sensitive string. Having multiple values (array)
            # for the audience field is not supported. More info about the OIDC JWT
            # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
            # Note: if not specified, the Push endpoint URL will be used.
        "serviceAccountEmail": "A String", # [Service account
            # email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating the OIDC token. The caller (for
            # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
            # have the iam.serviceAccounts.actAs permission for the service account.
      },
      "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use "https://example.com/push".
    },
  }

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

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body, x__xgafv=None)</code>
  <pre>Updates an existing subscription. Note that certain properties of a
subscription, such as its topic, are not modifiable.

Args:
  name: string, The name of the subscription. It must have the format
`"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
start with a letter, and contain only letters (`[A-Za-z]`), numbers
(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
in length, and it must not start with `"goog"`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for the UpdateSubscription method.
    "updateMask": "A String", # Indicates which fields in the provided subscription to update.
        # Must be specified and non-empty.
    "subscription": { # A subscription resource. # The updated subscription object.
      "name": "A String", # The name of the subscription. It must have the format
          # `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
          # start with a letter, and contain only letters (`[A-Za-z]`), numbers
          # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
          # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
          # in length, and it must not start with `"goog"`.
      "ackDeadlineSeconds": 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
          # the subscriber to acknowledge receipt before resending the message. In the
          # interval after the message is delivered and before it is acknowledged, it
          # is considered to be <i>outstanding</i>. During that time period, the
          # message will not be redelivered (on a best-effort basis).
          #
          # For pull subscriptions, this value is used as the initial value for the ack
          # deadline. To override this value for a given message, call
          # `ModifyAckDeadline` with the corresponding `ack_id` if using
          # non-streaming pull or send the `ack_id` in a
          # `StreamingModifyAckDeadlineRequest` if using streaming pull.
          # The minimum custom deadline you can specify is 10 seconds.
          # The maximum custom deadline you can specify is 600 seconds (10 minutes).
          # If this parameter is 0, a default value of 10 seconds is used.
          #
          # For push delivery, this value is also used to set the request timeout for
          # the call to the push endpoint.
          #
          # If the subscriber never acknowledges the message, the Pub/Sub
          # system will eventually redeliver the message.
      "labels": { # See <a href="https://cloud.google.com/pubsub/docs/labels"> Creating and
          # managing labels</a>.
        "a_key": "A String",
      },
      "pushConfig": { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
          # used to configure it. An empty `pushConfig` signifies that the subscriber
          # will pull and ack messages using API methods.
        "attributes": { # Endpoint configuration attributes.
            #
            # Every endpoint has a set of API supported attributes that can be used to
            # control different aspects of the message delivery.
            #
            # The currently supported attribute is `x-goog-version`, which you can
            # use to change the format of the pushed message. This attribute
            # indicates the version of the data expected by the endpoint. This
            # controls the shape of the pushed message (i.e., its fields and metadata).
            # The endpoint version is based on the version of the Pub/Sub API.
            #
            # If not present during the `CreateSubscription` call, it will default to
            # the version of the API used to make such call. If not present during a
            # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
            # calls will always return a valid version, even if the subscription was
            # created without this attribute.
            #
            # The possible values for this attribute are:
            #
            # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
            # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
          "a_key": "A String",
        },
        "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
            # `Authorization` header in the HTTP request for every pushed message.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
              # identifies the recipients that the JWT is intended for. The audience
              # value is a single case-sensitive string. Having multiple values (array)
              # for the audience field is not supported. More info about the OIDC JWT
              # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
              # Note: if not specified, the Push endpoint URL will be used.
          "serviceAccountEmail": "A String", # [Service account
              # email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating the OIDC token. The caller (for
              # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
              # have the iam.serviceAccounts.actAs permission for the service account.
        },
        "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
            # For example, a Webhook endpoint might use "https://example.com/push".
      },
      "topic": "A String", # The name of the topic from which this subscription is receiving messages.
          # Format is `projects/{project}/topics/{topic}`.
          # The value of this field will be `_deleted-topic_` if the topic has been
          # deleted.
      "messageRetentionDuration": "A String", # How long to retain unacknowledged messages in the subscription's backlog,
          # from the moment a message is published.
          # If `retain_acked_messages` is true, then this also configures the retention
          # of acknowledged messages, and thus configures how far back in time a `Seek`
          # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
          # minutes.
      "retainAckedMessages": True or False, # Indicates whether to retain acknowledged messages. If true, then
          # messages are not expunged from the subscription's backlog, even if they are
          # acknowledged, until they fall out of the `message_retention_duration`
          # window. This must be true if you would like to
          # <a
          # href="https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time">
          # Seek to a timestamp</a>.
      "expirationPolicy": { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription's expiration.
          # A subscription is considered active as long as any connected subscriber is
          # successfully consuming messages from the subscription or is issuing
          # operations on the subscription. If `expiration_policy` is not set, a
          # *default policy* with `ttl` of 31 days will be used. The minimum allowed
          # value for `expiration_policy.ttl` is 1 day.
          # automatic resource deletion).
        "ttl": "A String", # Specifies the "time-to-live" duration for an associated resource. The
            # resource expires if it is not active for a period of `ttl`. The definition
            # of "activity" depends on the type of the associated resource. The minimum
            # and maximum allowed values for `ttl` depend on the type of the associated
            # resource, as well. If `ttl` is not set, the associated resource never
            # expires.
      },
    },
  }

  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.
    "name": "A String", # The name of the subscription. It must have the format
        # `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
        # start with a letter, and contain only letters (`[A-Za-z]`), numbers
        # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
        # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
        # in length, and it must not start with `"goog"`.
    "ackDeadlineSeconds": 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
        # the subscriber to acknowledge receipt before resending the message. In the
        # interval after the message is delivered and before it is acknowledged, it
        # is considered to be <i>outstanding</i>. During that time period, the
        # message will not be redelivered (on a best-effort basis).
        #
        # For pull subscriptions, this value is used as the initial value for the ack
        # deadline. To override this value for a given message, call
        # `ModifyAckDeadline` with the corresponding `ack_id` if using
        # non-streaming pull or send the `ack_id` in a
        # `StreamingModifyAckDeadlineRequest` if using streaming pull.
        # The minimum custom deadline you can specify is 10 seconds.
        # The maximum custom deadline you can specify is 600 seconds (10 minutes).
        # If this parameter is 0, a default value of 10 seconds is used.
        #
        # For push delivery, this value is also used to set the request timeout for
        # the call to the push endpoint.
        #
        # If the subscriber never acknowledges the message, the Pub/Sub
        # system will eventually redeliver the message.
    "labels": { # See <a href="https://cloud.google.com/pubsub/docs/labels"> Creating and
        # managing labels</a>.
      "a_key": "A String",
    },
    "pushConfig": { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
        # used to configure it. An empty `pushConfig` signifies that the subscriber
        # will pull and ack messages using API methods.
      "attributes": { # Endpoint configuration attributes.
          #
          # Every endpoint has a set of API supported attributes that can be used to
          # control different aspects of the message delivery.
          #
          # The currently supported attribute is `x-goog-version`, which you can
          # use to change the format of the pushed message. This attribute
          # indicates the version of the data expected by the endpoint. This
          # controls the shape of the pushed message (i.e., its fields and metadata).
          # The endpoint version is based on the version of the Pub/Sub API.
          #
          # If not present during the `CreateSubscription` call, it will default to
          # the version of the API used to make such call. If not present during a
          # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
          # calls will always return a valid version, even if the subscription was
          # created without this attribute.
          #
          # The possible values for this attribute are:
          #
          # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
          # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
        "a_key": "A String",
      },
      "oidcToken": { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
          # `Authorization` header in the HTTP request for every pushed message.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
        "audience": "A String", # Audience to be used when generating OIDC token. The audience claim
            # identifies the recipients that the JWT is intended for. The audience
            # value is a single case-sensitive string. Having multiple values (array)
            # for the audience field is not supported. More info about the OIDC JWT
            # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
            # Note: if not specified, the Push endpoint URL will be used.
        "serviceAccountEmail": "A String", # [Service account
            # email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating the OIDC token. The caller (for
            # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
            # have the iam.serviceAccounts.actAs permission for the service account.
      },
      "pushEndpoint": "A String", # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use "https://example.com/push".
    },
    "topic": "A String", # The name of the topic from which this subscription is receiving messages.
        # Format is `projects/{project}/topics/{topic}`.
        # The value of this field will be `_deleted-topic_` if the topic has been
        # deleted.
    "messageRetentionDuration": "A String", # How long to retain unacknowledged messages in the subscription's backlog,
        # from the moment a message is published.
        # If `retain_acked_messages` is true, then this also configures the retention
        # of acknowledged messages, and thus configures how far back in time a `Seek`
        # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
        # minutes.
    "retainAckedMessages": True or False, # Indicates whether to retain acknowledged messages. If true, then
        # messages are not expunged from the subscription's backlog, even if they are
        # acknowledged, until they fall out of the `message_retention_duration`
        # window. This must be true if you would like to
        # <a
        # href="https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time">
        # Seek to a timestamp</a>.
    "expirationPolicy": { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription's expiration.
        # A subscription is considered active as long as any connected subscriber is
        # successfully consuming messages from the subscription or is issuing
        # operations on the subscription. If `expiration_policy` is not set, a
        # *default policy* with `ttl` of 31 days will be used. The minimum allowed
        # value for `expiration_policy.ttl` is 1 day.
        # automatic resource deletion).
      "ttl": "A String", # Specifies the "time-to-live" duration for an associated resource. The
          # resource expires if it is not active for a period of `ttl`. The definition
          # of "activity" depends on the type of the associated resource. The minimum
          # and maximum allowed values for `ttl` depend on the type of the associated
          # resource, as well. If `ttl` is not set, the associated resource never
          # expires.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="pull">pull(subscription, body, x__xgafv=None)</code>
  <pre>Pulls messages from the server. The server may return `UNAVAILABLE` if
there are too many concurrent pull requests pending for the given
subscription.

Args:
  subscription: string, The subscription from which messages should be pulled.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for the `Pull` method.
    "returnImmediately": True or False, # If this field set to true, the system will respond immediately even if
        # it there are no messages available to return in the `Pull` response.
        # Otherwise, the system may wait (for a bounded amount of time) until at
        # least one message is available, rather than returning no messages.
    "maxMessages": 42, # The maximum number of messages returned for this request. The Pub/Sub
        # system may return fewer than the number 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 `Pull` method.
    "receivedMessages": [ # Received Pub/Sub messages. The list will be empty if there are no more
        # messages available in the backlog. For JSON, the response can be entirely
        # empty. The Pub/Sub system may return fewer than the `maxMessages` requested
        # even if there are more messages available in the backlog.
      { # A message and its corresponding acknowledgment ID.
        "ackId": "A String", # This ID can be used to acknowledge the received message.
        "message": { # A message that is published by publishers and consumed by subscribers. The # The message.
            # message must contain either a non-empty data field or at least one attribute.
            # Note that client libraries represent this object differently
            # depending on the language. See the corresponding
            # <a href="https://cloud.google.com/pubsub/docs/reference/libraries">client
            # library documentation</a> for more information. See
            # <a href="https://cloud.google.com/pubsub/quotas">Quotas and limits</a>
            # for more information about message limits.
          "attributes": { # Optional attributes for this message.
            "a_key": "A String",
          },
          "data": "A String", # The message data field. If this field is empty, the message must contain
              # at least one attribute.
          "publishTime": "A String", # The time at which the message was published, populated by the server when
              # it receives the `Publish` call. It must not be populated by the
              # publisher in a `Publish` call.
          "messageId": "A String", # ID of this message, assigned by the server when the message is published.
              # 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 the publisher in a `Publish` call.
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="seek">seek(subscription, body, x__xgafv=None)</code>
  <pre>Seeks an existing subscription to a point in time or to a given snapshot,
whichever is provided in the request. Snapshots are used in
<a href="https://cloud.google.com/pubsub/docs/replay-overview">Seek</a>
operations, which allow
you to manage message acknowledgments in bulk. That is, you can set the
acknowledgment state of messages in an existing subscription to the state
captured by a snapshot. Note that both the subscription and the snapshot
must be on the same topic.

Args:
  subscription: string, The subscription to affect. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for the `Seek` method.
    "snapshot": "A String", # The snapshot to seek to. The snapshot's topic must be the same as that of
        # the provided subscription.
        # Format is `projects/{project}/snapshots/{snap}`.
    "time": "A String", # The time to seek to.
        # Messages retained in the subscription that were published before this
        # time are marked as acknowledged, and messages retained in the
        # subscription that were published after this time are marked as
        # unacknowledged. Note that this operation affects only those messages
        # retained in the subscription (configured by the combination of
        # `message_retention_duration` and `retain_acked_messages`). For example,
        # if `time` corresponds to a point before the message retention
        # window (or to a point before the system's notion of the subscription
        # creation time), only retained messages will be marked as unacknowledged,
        # and already-expunged messages will not be restored.
  }

  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 `Seek` method (this response is empty).
  }</pre>
</div>

<div class="method">
    <code class="details" id="setIamPolicy">setIamPolicy(resource, body, x__xgafv=None)</code>
  <pre>Sets the access control policy on the specified resource. Replaces any
existing policy.

Args:
  resource: string, REQUIRED: The resource for which the policy is being specified.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request message for `SetIamPolicy` method.
    "policy": { # Defines an Identity and Access Management (IAM) policy. It is used to # REQUIRED: The complete policy to be applied to the `resource`. The size of
        # the policy is limited to a few 10s of KB. An empty policy is a
        # valid policy but certain Cloud Platform services (such as Projects)
        # might reject them.
        # specify access control policies for Cloud Platform resources.
        #
        #
        # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
        # `members` to a `role`, where the members can be user accounts, Google groups,
        # Google domains, and service accounts. A `role` is a named list of permissions
        # defined by IAM.
        #
        # **JSON Example**
        #
        #     {
        #       "bindings": [
        #         {
        #           "role": "roles/owner",
        #           "members": [
        #             "user:mike@example.com",
        #             "group:admins@example.com",
        #             "domain:google.com",
        #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        #           ]
        #         },
        #         {
        #           "role": "roles/viewer",
        #           "members": ["user:sean@example.com"]
        #         }
        #       ]
        #     }
        #
        # **YAML Example**
        #
        #     bindings:
        #     - members:
        #       - user:mike@example.com
        #       - group:admins@example.com
        #       - domain:google.com
        #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
        #       role: roles/owner
        #     - members:
        #       - user:sean@example.com
        #       role: roles/viewer
        #
        #
        # For a description of IAM and its features, see the
        # [IAM developer's guide](https://cloud.google.com/iam/docs).
      "bindings": [ # Associates a list of `members` to a `role`.
          # `bindings` with no members will result in an error.
        { # Associates `members` with a `role`.
          "role": "A String", # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
          "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
              # `members` can have the following values:
              #
              # * `allUsers`: A special identifier that represents anyone who is
              #    on the internet; with or without a Google account.
              #
              # * `allAuthenticatedUsers`: A special identifier that represents anyone
              #    who is authenticated with a Google account or a service account.
              #
              # * `user:{emailid}`: An email address that represents a specific Google
              #    account. For example, `alice@gmail.com` .
              #
              #
              # * `serviceAccount:{emailid}`: An email address that represents a service
              #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
              #
              # * `group:{emailid}`: An email address that represents a Google group.
              #    For example, `admins@example.com`.
              #
              #
              # * `domain:{domain}`: The G Suite domain (primary) that represents all the
              #    users of that domain. For example, `google.com` or `example.com`.
              #
            "A String",
          ],
          "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
              # NOTE: An unsatisfied condition will not allow user access via current
              # binding. Different bindings, including their conditions, are examined
              # independently.
              #
              #     title: "User account presence"
              #     description: "Determines whether the request has a user account"
              #     expression: "size(request.user) > 0"
            "location": "A String", # An optional string indicating the location of the expression for error
                # reporting, e.g. a file name and a position in the file.
            "expression": "A String", # Textual representation of an expression in
                # Common Expression Language syntax.
                #
                # The application context of the containing message determines which
                # well-known feature set of CEL is supported.
            "description": "A String", # An optional description of the expression. This is a longer text which
                # describes the expression, e.g. when hovered over it in a UI.
            "title": "A String", # An optional title for the expression, i.e. a short string describing
                # its purpose. This can be used e.g. in UIs which allow to enter the
                # expression.
          },
        },
      ],
      "version": 42, # Deprecated.
      "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
          # prevent simultaneous updates of a policy from overwriting each other.
          # It is strongly suggested that systems make use of the `etag` in the
          # read-modify-write cycle to perform policy updates in order to avoid race
          # conditions: An `etag` is returned in the response to `getIamPolicy`, and
          # systems are expected to put that etag in the request to `setIamPolicy` to
          # ensure that their change will be applied to the same version of the policy.
          #
          # If no `etag` is provided in the call to `setIamPolicy`, then the existing
          # policy is overwritten blindly.
    },
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **JSON Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # **YAML Example**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
      #       role: roles/owner
      #     - members:
      #       - user:sean@example.com
      #       role: roles/viewer
      #
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam/docs).
    "bindings": [ # Associates a list of `members` to a `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@gmail.com` .
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
        "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
            # NOTE: An unsatisfied condition will not allow user access via current
            # binding. Different bindings, including their conditions, are examined
            # independently.
            #
            #     title: "User account presence"
            #     description: "Determines whether the request has a user account"
            #     expression: "size(request.user) > 0"
          "location": "A String", # An optional string indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          "expression": "A String", # Textual representation of an expression in
              # Common Expression Language syntax.
              #
              # The application context of the containing message determines which
              # well-known feature set of CEL is supported.
          "description": "A String", # An optional description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          "title": "A String", # An optional title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
        },
      },
    ],
    "version": 42, # Deprecated.
    "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
  }</pre>
</div>

<div class="method">
    <code class="details" id="testIamPermissions">testIamPermissions(resource, body, x__xgafv=None)</code>
  <pre>Returns permissions that a caller has on the specified resource.
If the resource does not exist, this will return an empty set of
permissions, not a NOT_FOUND error.

Note: This operation is designed to be used for building permission-aware
UIs and command-line tools, not for authorization checking. This operation
may "fail open" without warning.

Args:
  resource: string, REQUIRED: The resource for which the policy detail is being requested.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request message for `TestIamPermissions` method.
    "permissions": [ # The set of permissions to check for the `resource`. Permissions with
        # wildcards (such as '*' or 'storage.*') are not allowed. For more
        # information see
        # [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).
      "A String",
    ],
  }

  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 `TestIamPermissions` method.
    "permissions": [ # A subset of `TestPermissionsRequest.permissions` that the caller is
        # allowed.
      "A String",
    ],
  }</pre>
</div>

</body></html>