<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="cloudtasks_v2.html">Cloud Tasks API</a> . <a href="cloudtasks_v2.projects.html">projects</a> . <a href="cloudtasks_v2.projects.locations.html">locations</a> . <a href="cloudtasks_v2.projects.locations.queues.html">queues</a> . <a href="cloudtasks_v2.projects.locations.queues.tasks.html">tasks</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a task and adds it to a queue.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a task.</p>
<p class="toc_element">
  <code><a href="#get">get(name, responseView=None, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a task.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, responseView=None, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists the tasks in a queue.</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="#run">run(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Forces a task to run now.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates a task and adds it to a queue.

Tasks cannot be updated after creation; there is no UpdateTask command.

* The maximum task size is 100KB.

Args:
  parent: string, Required. The queue name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`

The queue must already exist. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for CreateTask.
    &quot;responseView&quot;: &quot;A String&quot;, # The response_view specifies which subset of the Task will be
        # returned.
        # 
        # By default response_view is BASIC; not all
        # information is retrieved by default because some data, such as
        # payloads, might be desirable to return only when needed because
        # of its large size or because of the sensitivity of data that it
        # contains.
        # 
        # Authorization for FULL requires
        # `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
        # permission on the Task resource.
    &quot;task&quot;: { # A unit of scheduled work. # Required. The task to add.
        # 
        # Task names have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`.
        # The user can optionally specify a task name. If a
        # name is not specified then the system will generate a random
        # unique task id, which will be set in the task returned in the
        # response.
        # 
        # If schedule_time is not set or is in the
        # past then Cloud Tasks will set it to the current time.
        # 
        # Task De-duplication:
        # 
        # Explicitly specifying a task ID enables task de-duplication.  If
        # a task&#x27;s ID is identical to that of an existing task or a task
        # that was deleted or executed recently then the call will fail
        # with ALREADY_EXISTS.
        # If the task&#x27;s queue was created using Cloud Tasks, then another task with
        # the same name can&#x27;t be created for ~1hour after the original task was
        # deleted or executed. If the task&#x27;s queue was created using queue.yaml or
        # queue.xml, then another task with the same name can&#x27;t be created
        # for ~9days after the original task was deleted or executed.
        # 
        # Because there is an extra lookup cost to identify duplicate task
        # names, these CreateTask calls have significantly
        # increased latency. Using hashed strings for the task id or for
        # the prefix of the task id is recommended. Choosing task ids that
        # are sequential or have sequential prefixes, for example using a
        # timestamp, causes an increase in latency and error rates in all
        # task commands. The infrastructure relies on an approximately
        # uniform distribution of task ids to store and serve tasks
        # efficiently.
      &quot;httpRequest&quot;: { # HTTP request. # HTTP request that is sent to the worker.
          #
          # An HTTP task is a task that has HttpRequest set.
          #
          # The task will be pushed to the worker as an HTTP request. If the worker
          # or the redirected worker acknowledges the task by returning a successful HTTP
          # response code ([`200` - `299`]), the task will be removed from the queue. If
          # any other HTTP response code is returned or no response is received, the
          # task will be retried according to the following:
          #
          # * User-specified throttling: retry configuration,
          #   rate limits, and the queue&#x27;s state.
          #
          # * System throttling: To prevent the worker from overloading, Cloud Tasks may
          #   temporarily reduce the queue&#x27;s effective rate. User-specified settings
          #   will not be changed.
          #
          #  System throttling happens because:
          #
          #   * Cloud Tasks backs off on all errors. Normally the backoff specified in
          #     rate limits will be used. But if the worker returns
          #     `429` (Too Many Requests), `503` (Service Unavailable), or the rate of
          #     errors is high, Cloud Tasks will use a higher backoff rate. The retry
          #     specified in the `Retry-After` HTTP response header is considered.
          #
          #   * To prevent traffic spikes and to smooth sudden increases in traffic,
          #     dispatches ramp up slowly when the queue is newly created or idle and
          #     if large numbers of tasks suddenly become available to dispatch (due to
          #     spikes in create task rates, the queue being unpaused, or many tasks
          #     that are scheduled at the same time).
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the queue. The
              # caller must have iam.serviceAccounts.actAs permission for the service
              # account.
        },
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values.
            # Headers can be set when the
            # task is created.
            #
            # These headers represent a subset of the headers that will accompany the
            # task&#x27;s HTTP request. Some HTTP request headers will be ignored or replaced.
            #
            # A partial list of headers that will be ignored or replaced is:
            #
            # * Host: This will be computed by Cloud Tasks and derived from
            #   HttpRequest.url.
            # * Content-Length: This will be computed by Cloud Tasks.
            # * User-Agent: This will be set to `&quot;Google-Cloud-Tasks&quot;`.
            # * X-Google-*: Google use only.
            # * X-AppEngine-*: Google use only.
            #
            # `Content-Type` won&#x27;t be set by Cloud Tasks. You can explicitly set
            # `Content-Type` to a media type when the
            #  task is created.
            #  For example, `Content-Type` can be set to `&quot;application/octet-stream&quot;` or
            #  `&quot;application/json&quot;`.
            #
            # Headers which can have multiple values (according to RFC2616) can be
            # specified using comma-separated values.
            #
            # The size of the headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;url&quot;: &quot;A String&quot;, # Required. The full url path that the request will be sent to.
            #
            # This string must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples
            # are: `http://acme.com` and `https://acme.com/sales:8080`. Cloud Tasks will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
            #
            # The `Location` header response from a redirect response [`300` - `399`]
            # may be followed. The redirect is not counted as a separate attempt.
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the queue. The
              # caller must have iam.serviceAccounts.actAs permission for the service
              # account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
            #
            # A request body is allowed only if the
            # HTTP method is POST, PUT, or PATCH. It is an
            # error to set body on a task with an incompatible HttpMethod.
      },
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateTask.
          #
          # The task name.
          #
          # The task name must have the following format:
          # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
          #
          # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), colons (:), or periods (.).
          #    For more information, see
          #    [Identifying
          #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
          # * `LOCATION_ID` is the canonical ID for the task&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
          #   hyphens (-). The maximum length is 100 characters.
          # * `TASK_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #   hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;dispatchDeadline&quot;: &quot;A String&quot;, # The deadline for requests sent to the worker. If the worker does not
          # respond by this deadline then the request is cancelled and the attempt
          # is marked as a `DEADLINE_EXCEEDED` failure. Cloud Tasks will retry the
          # task according to the RetryConfig.
          #
          # Note that when the request is cancelled, Cloud Tasks will stop listing for
          # the response, but whether the worker stops processing depends on the
          # worker. For example, if the worker is stuck, it may not react to cancelled
          # requests.
          #
          # The default and maximum values depend on the type of request:
          #
          # * For HTTP tasks, the default is 10 minutes. The deadline
          #   must be in the interval [15 seconds, 30 minutes].
          #
          # * For App Engine tasks, 0 indicates that the
          #   request has the default deadline. The default deadline depends on the
          #   [scaling
          #   type](https://cloud.google.com/appengine/docs/standard/go/how-instances-are-managed#instance_scaling)
          #   of the service: 10 minutes for standard apps with automatic scaling, 24
          #   hours for standard apps with manual and basic scaling, and 60 minutes for
          #   flex apps. If the request deadline is set, it must be in the interval [15
          #   seconds, 24 hours 15 seconds]. Regardless of the task&#x27;s
          #   `dispatch_deadline`, the app handler will not run for longer than than
          #   the service&#x27;s timeout. We recommend setting the `dispatch_deadline` to
          #   at most a few seconds more than the app handler&#x27;s timeout. For more
          #   information see
          #   [Timeouts](https://cloud.google.com/tasks/docs/creating-appengine-handlers#timeouts).
          #
          # `dispatch_deadline` will be truncated to the nearest millisecond. The
          # deadline is an approximate deadline.
      &quot;dispatchCount&quot;: 42, # Output only. The number of attempts dispatched.
          #
          # This count includes attempts which have been dispatched but haven&#x27;t
          # received a response.
      &quot;firstAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s first attempt.
          #
          # Only dispatch_time will be set.
          # The other Attempt information is not retained by Cloud Tasks.
        &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
            #
            # `response_time` will be truncated to the nearest microsecond.
        &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
            #
            # If `response_time` is unset, then the task has not been attempted or is
            # currently running and the `response_status` field is meaningless.
            # different programming environments, including REST APIs and RPC APIs. It is
            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
            # three pieces of data: error code, error message, and error details.
            #
            # You can find out more about this error model and how to work with it in the
            # [API Design Guide](https://cloud.google.com/apis/design/errors).
          &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
          ],
          &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
          &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
              # user-facing error message should be localized and sent in the
              # google.rpc.Status.details field, or localized by the client.
        },
        &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
            #
            # `schedule_time` will be truncated to the nearest microsecond.
        &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
            #
            # `dispatch_time` will be truncated to the nearest microsecond.
      },
      &quot;lastAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s last attempt.
        &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
            #
            # `response_time` will be truncated to the nearest microsecond.
        &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
            #
            # If `response_time` is unset, then the task has not been attempted or is
            # currently running and the `response_status` field is meaningless.
            # different programming environments, including REST APIs and RPC APIs. It is
            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
            # three pieces of data: error code, error message, and error details.
            #
            # You can find out more about this error model and how to work with it in the
            # [API Design Guide](https://cloud.google.com/apis/design/errors).
          &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
          ],
          &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
          &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
              # user-facing error message should be localized and sent in the
              # google.rpc.Status.details field, or localized by the client.
        },
        &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
            #
            # `schedule_time` will be truncated to the nearest microsecond.
        &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
            #
            # `dispatch_time` will be truncated to the nearest microsecond.
      },
      &quot;responseCount&quot;: 42, # Output only. The number of attempts which have received a response.
      &quot;appEngineHttpRequest&quot;: { # App Engine HTTP request. # HTTP request that is sent to the App Engine app handler.
          #
          # An App Engine task is a task that has AppEngineHttpRequest set.
          #
          # The message defines the HTTP request that is sent to an App Engine app when
          # the task is dispatched.
          #
          # Using AppEngineHttpRequest requires
          # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
          # Google IAM permission for the project
          # and the following scope:
          #
          # `https://www.googleapis.com/auth/cloud-platform`
          #
          # The task will be delivered to the App Engine app which belongs to the same
          # project as the queue. For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and how routing is affected by
          # [dispatch
          # files](https://cloud.google.com/appengine/docs/python/config/dispatchref).
          # Traffic is encrypted during transport and never leaves Google datacenters.
          # Because this traffic is carried over a communication mechanism internal to
          # Google, you cannot explicitly set the protocol (for example, HTTP or HTTPS).
          # The request to the handler, however, will appear to have used the HTTP
          # protocol.
          #
          # The AppEngineRouting used to construct the URL that the task is
          # delivered to can be set at the queue-level or task-level:
          #
          # * If app_engine_routing_override is set on the
          #   queue, this value is used for all
          #   tasks in the queue, no matter what the setting is for the task-level
          #   app_engine_routing.
          #
          #
          # The `url` that the task will be sent to is:
          #
          # * `url =` host `+`
          #   relative_uri
          #
          # Tasks can be dispatched to secure app handlers, unsecure app handlers, and
          # URIs restricted with
          # [`login:
          # admin`](https://cloud.google.com/appengine/docs/standard/python/config/appref).
          # Because tasks are not run as any user, they cannot be dispatched to URIs
          # restricted with
          # [`login:
          # required`](https://cloud.google.com/appengine/docs/standard/python/config/appref)
          # Task dispatches also do not follow redirects.
          #
          # The task attempt has succeeded if the app&#x27;s request handler returns an HTTP
          # response code in the range [`200` - `299`]. The task attempt has failed if
          # the app&#x27;s handler returns a non-2xx response code or Cloud Tasks does
          # not receive response before the deadline. Failed
          # tasks will be retried according to the
          # retry configuration. `503` (Service Unavailable) is
          # considered an App Engine system error instead of an application error and
          # will cause Cloud Tasks&#x27; traffic congestion control to temporarily throttle
          # the queue&#x27;s dispatches. Unlike other types of task targets, a `429` (Too Many
          # Requests) response from an app handler does not cause traffic congestion
          # control to throttle the queue.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values.
            # Headers can be set when the
            # task is created.
            # Repeated headers are not supported but a header value can contain commas.
            #
            # Cloud Tasks sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Tasks will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            #
            # If the task has a body, Cloud
            # Tasks sets the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explicitly
            #   setting `Content-Type` to a particular media type when the
            #   task is created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Tasks. This value is
            #   output only.   It cannot be changed.
            #
            # The headers below cannot be set or overridden:
            #
            # * `Host`
            # * `X-Google-*`
            # * `X-AppEngine-*`
            #
            # In addition, Cloud Tasks sets some headers when the task is dispatched,
            # such as headers containing information about the task; see
            # [request
            # headers](https://cloud.google.com/tasks/docs/creating-appengine-handlers#reading_request_headers).
            # These headers are set only when the task is dispatched, so they are not
            # visible when the task is returned in a Cloud Tasks response.
            #
            # Although there is no specific limit for the maximum number of headers or
            # the size, there is a limit on the maximum size of the Task. For more
            # information, see the CreateTask documentation.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # Task-level setting for App Engine routing.
            #
            # * If app_engine_routing_override is set on the
            #   queue, this value is used for all
            #   tasks in the queue, no matter what the setting is for the task-level
            #   app_engine_routing.
            #
            # Defines routing characteristics specific to App Engine - service, version,
            # and instance.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
            #
            # Using AppEngineRouting requires
            # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
            # Google IAM permission for the project
            # and the following scope:
            #
            # `https://www.googleapis.com/auth/cloud-platform`
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the task is sent to the service which is the default
              # service when the task is attempted.
              #
              # For some queues or tasks which were created using the App Engine
              # Task Queue API, host is not parsable
              # into service,
              # version, and
              # instance. For example, some tasks
              # which were created using the App Engine SDK use a custom domain
              # name; custom domains are not parsed by Cloud Tasks. If
              # host is not parsable, then
              # service,
              # version, and
              # instance are the empty string.
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the task is sent to an instance which is available when
              # the task is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the task is sent to the version which is the default
              # version when the task is attempted.
              #
              # For some queues or tasks which were created using the App Engine
              # Task Queue API, host is not parsable
              # into service,
              # version, and
              # instance. For example, some tasks
              # which were created using the App Engine SDK use a custom domain
              # name; custom domains are not parsed by Cloud Tasks. If
              # host is not parsable, then
              # service,
              # version, and
              # instance are the empty string.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
              #
              # The host is constructed from the domain name of the app associated with
              # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
              # service, version,
              # and instance. Tasks which were created using
              # the App Engine SDK might have a custom domain name.
              #
              # For more information, see
              # [How Requests are
              # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
            #
            # The app&#x27;s request handler for the task&#x27;s target URL must be able to handle
            # HTTP requests with this http_method, otherwise the task attempt fails with
            # error code 405 (Method Not Allowed). See [Writing a push task request
            # handler](https://cloud.google.com/appengine/docs/java/taskqueue/push/creating-handlers#writing_a_push_task_request_handler)
            # and the App Engine documentation for your runtime on [How Requests are
            # Handled](https://cloud.google.com/appengine/docs/standard/python3/how-requests-are-handled).
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
            #
            # A request body is allowed only if the HTTP method is POST or PUT. It is
            # an error to set a body on a task with an incompatible HttpMethod.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URI must begin with &quot;/&quot; and must be a valid HTTP relative URI.
            # It can contain a path and query string arguments.
            # If the relative URI is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
      },
      &quot;view&quot;: &quot;A String&quot;, # Output only. The view specifies which subset of the Task has
          # been returned.
      &quot;scheduleTime&quot;: &quot;A String&quot;, # The time when the task is scheduled to be attempted or retried.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time that the task was created.
          #
          # `create_time` will be truncated to the nearest second.
    },
  }

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

Returns:
  An object of the form:

    { # A unit of scheduled work.
    &quot;httpRequest&quot;: { # HTTP request. # HTTP request that is sent to the worker.
        #
        # An HTTP task is a task that has HttpRequest set.
        #
        # The task will be pushed to the worker as an HTTP request. If the worker
        # or the redirected worker acknowledges the task by returning a successful HTTP
        # response code ([`200` - `299`]), the task will be removed from the queue. If
        # any other HTTP response code is returned or no response is received, the
        # task will be retried according to the following:
        #
        # * User-specified throttling: retry configuration,
        #   rate limits, and the queue&#x27;s state.
        #
        # * System throttling: To prevent the worker from overloading, Cloud Tasks may
        #   temporarily reduce the queue&#x27;s effective rate. User-specified settings
        #   will not be changed.
        #
        #  System throttling happens because:
        #
        #   * Cloud Tasks backs off on all errors. Normally the backoff specified in
        #     rate limits will be used. But if the worker returns
        #     `429` (Too Many Requests), `503` (Service Unavailable), or the rate of
        #     errors is high, Cloud Tasks will use a higher backoff rate. The retry
        #     specified in the `Retry-After` HTTP response header is considered.
        #
        #   * To prevent traffic spikes and to smooth sudden increases in traffic,
        #     dispatches ramp up slowly when the queue is newly created or idle and
        #     if large numbers of tasks suddenly become available to dispatch (due to
        #     spikes in create task rates, the queue being unpaused, or many tasks
        #     that are scheduled at the same time).
      &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
          # will be generated and attached as an `Authorization` header in the HTTP
          # request.
          #
          # This type of authorization should generally only be used when calling
          # Google APIs hosted on *.googleapis.com.
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
          # This type of authorization should generally only be used when calling Google
          # APIs hosted on *.googleapis.com.
        &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
            # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
            # will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OAuth token.
            # The service account must be within the same project as the queue. The
            # caller must have iam.serviceAccounts.actAs permission for the service
            # account.
      },
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values.
          # Headers can be set when the
          # task is created.
          #
          # These headers represent a subset of the headers that will accompany the
          # task&#x27;s HTTP request. Some HTTP request headers will be ignored or replaced.
          #
          # A partial list of headers that will be ignored or replaced is:
          #
          # * Host: This will be computed by Cloud Tasks and derived from
          #   HttpRequest.url.
          # * Content-Length: This will be computed by Cloud Tasks.
          # * User-Agent: This will be set to `&quot;Google-Cloud-Tasks&quot;`.
          # * X-Google-*: Google use only.
          # * X-AppEngine-*: Google use only.
          #
          # `Content-Type` won&#x27;t be set by Cloud Tasks. You can explicitly set
          # `Content-Type` to a media type when the
          #  task is created.
          #  For example, `Content-Type` can be set to `&quot;application/octet-stream&quot;` or
          #  `&quot;application/json&quot;`.
          #
          # Headers which can have multiple values (according to RFC2616) can be
          # specified using comma-separated values.
          #
          # The size of the headers must be less than 80KB.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;url&quot;: &quot;A String&quot;, # Required. The full url path that the request will be sent to.
          #
          # This string must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples
          # are: `http://acme.com` and `https://acme.com/sales:8080`. Cloud Tasks will
          # encode some characters for safety and compatibility. The maximum allowed
          # URL length is 2083 characters after encoding.
          #
          # The `Location` header response from a redirect response [`300` - `399`]
          # may be followed. The redirect is not counted as a separate attempt.
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
          # token will be generated and attached as an `Authorization` header in the
          # HTTP request.
          #
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OIDC token.
            # The service account must be within the same project as the queue. The
            # caller must have iam.serviceAccounts.actAs permission for the service
            # account.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
          #
          # A request body is allowed only if the
          # HTTP method is POST, PUT, or PATCH. It is an
          # error to set body on a task with an incompatible HttpMethod.
    },
    &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateTask.
        #
        # The task name.
        #
        # The task name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the task&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
        # * `TASK_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
        #   hyphens (-), or underscores (_). The maximum length is 500 characters.
    &quot;dispatchDeadline&quot;: &quot;A String&quot;, # The deadline for requests sent to the worker. If the worker does not
        # respond by this deadline then the request is cancelled and the attempt
        # is marked as a `DEADLINE_EXCEEDED` failure. Cloud Tasks will retry the
        # task according to the RetryConfig.
        #
        # Note that when the request is cancelled, Cloud Tasks will stop listing for
        # the response, but whether the worker stops processing depends on the
        # worker. For example, if the worker is stuck, it may not react to cancelled
        # requests.
        #
        # The default and maximum values depend on the type of request:
        #
        # * For HTTP tasks, the default is 10 minutes. The deadline
        #   must be in the interval [15 seconds, 30 minutes].
        #
        # * For App Engine tasks, 0 indicates that the
        #   request has the default deadline. The default deadline depends on the
        #   [scaling
        #   type](https://cloud.google.com/appengine/docs/standard/go/how-instances-are-managed#instance_scaling)
        #   of the service: 10 minutes for standard apps with automatic scaling, 24
        #   hours for standard apps with manual and basic scaling, and 60 minutes for
        #   flex apps. If the request deadline is set, it must be in the interval [15
        #   seconds, 24 hours 15 seconds]. Regardless of the task&#x27;s
        #   `dispatch_deadline`, the app handler will not run for longer than than
        #   the service&#x27;s timeout. We recommend setting the `dispatch_deadline` to
        #   at most a few seconds more than the app handler&#x27;s timeout. For more
        #   information see
        #   [Timeouts](https://cloud.google.com/tasks/docs/creating-appengine-handlers#timeouts).
        #
        # `dispatch_deadline` will be truncated to the nearest millisecond. The
        # deadline is an approximate deadline.
    &quot;dispatchCount&quot;: 42, # Output only. The number of attempts dispatched.
        #
        # This count includes attempts which have been dispatched but haven&#x27;t
        # received a response.
    &quot;firstAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s first attempt.
        #
        # Only dispatch_time will be set.
        # The other Attempt information is not retained by Cloud Tasks.
      &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
          #
          # `response_time` will be truncated to the nearest microsecond.
      &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
          #
          # If `response_time` is unset, then the task has not been attempted or is
          # currently running and the `response_status` field is meaningless.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
          #
          # `dispatch_time` will be truncated to the nearest microsecond.
    },
    &quot;lastAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s last attempt.
      &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
          #
          # `response_time` will be truncated to the nearest microsecond.
      &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
          #
          # If `response_time` is unset, then the task has not been attempted or is
          # currently running and the `response_status` field is meaningless.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
          #
          # `dispatch_time` will be truncated to the nearest microsecond.
    },
    &quot;responseCount&quot;: 42, # Output only. The number of attempts which have received a response.
    &quot;appEngineHttpRequest&quot;: { # App Engine HTTP request. # HTTP request that is sent to the App Engine app handler.
        #
        # An App Engine task is a task that has AppEngineHttpRequest set.
        #
        # The message defines the HTTP request that is sent to an App Engine app when
        # the task is dispatched.
        #
        # Using AppEngineHttpRequest requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
        #
        # The task will be delivered to the App Engine app which belongs to the same
        # project as the queue. For more information, see
        # [How Requests are
        # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
        # and how routing is affected by
        # [dispatch
        # files](https://cloud.google.com/appengine/docs/python/config/dispatchref).
        # Traffic is encrypted during transport and never leaves Google datacenters.
        # Because this traffic is carried over a communication mechanism internal to
        # Google, you cannot explicitly set the protocol (for example, HTTP or HTTPS).
        # The request to the handler, however, will appear to have used the HTTP
        # protocol.
        #
        # The AppEngineRouting used to construct the URL that the task is
        # delivered to can be set at the queue-level or task-level:
        #
        # * If app_engine_routing_override is set on the
        #   queue, this value is used for all
        #   tasks in the queue, no matter what the setting is for the task-level
        #   app_engine_routing.
        #
        #
        # The `url` that the task will be sent to is:
        #
        # * `url =` host `+`
        #   relative_uri
        #
        # Tasks can be dispatched to secure app handlers, unsecure app handlers, and
        # URIs restricted with
        # [`login:
        # admin`](https://cloud.google.com/appengine/docs/standard/python/config/appref).
        # Because tasks are not run as any user, they cannot be dispatched to URIs
        # restricted with
        # [`login:
        # required`](https://cloud.google.com/appengine/docs/standard/python/config/appref)
        # Task dispatches also do not follow redirects.
        #
        # The task attempt has succeeded if the app&#x27;s request handler returns an HTTP
        # response code in the range [`200` - `299`]. The task attempt has failed if
        # the app&#x27;s handler returns a non-2xx response code or Cloud Tasks does
        # not receive response before the deadline. Failed
        # tasks will be retried according to the
        # retry configuration. `503` (Service Unavailable) is
        # considered an App Engine system error instead of an application error and
        # will cause Cloud Tasks&#x27; traffic congestion control to temporarily throttle
        # the queue&#x27;s dispatches. Unlike other types of task targets, a `429` (Too Many
        # Requests) response from an app handler does not cause traffic congestion
        # control to throttle the queue.
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values.
          # Headers can be set when the
          # task is created.
          # Repeated headers are not supported but a header value can contain commas.
          #
          # Cloud Tasks sets some headers to default values:
          #
          # * `User-Agent`: By default, this header is
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
          #   This header can be modified, but Cloud Tasks will append
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
          #   modified `User-Agent`.
          #
          # If the task has a body, Cloud
          # Tasks sets the following headers:
          #
          # * `Content-Type`: By default, the `Content-Type` header is set to
          #   `&quot;application/octet-stream&quot;`. The default can be overridden by explicitly
          #   setting `Content-Type` to a particular media type when the
          #   task is created.
          #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
          # * `Content-Length`: This is computed by Cloud Tasks. This value is
          #   output only.   It cannot be changed.
          #
          # The headers below cannot be set or overridden:
          #
          # * `Host`
          # * `X-Google-*`
          # * `X-AppEngine-*`
          #
          # In addition, Cloud Tasks sets some headers when the task is dispatched,
          # such as headers containing information about the task; see
          # [request
          # headers](https://cloud.google.com/tasks/docs/creating-appengine-handlers#reading_request_headers).
          # These headers are set only when the task is dispatched, so they are not
          # visible when the task is returned in a Cloud Tasks response.
          #
          # Although there is no specific limit for the maximum number of headers or
          # the size, there is a limit on the maximum size of the Task. For more
          # information, see the CreateTask documentation.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;appEngineRouting&quot;: { # App Engine Routing. # Task-level setting for App Engine routing.
          #
          # * If app_engine_routing_override is set on the
          #   queue, this value is used for all
          #   tasks in the queue, no matter what the setting is for the task-level
          #   app_engine_routing.
          #
          # Defines routing characteristics specific to App Engine - service, version,
          # and instance.
          #
          # For more information about services, versions, and instances see
          # [An Overview of App
          # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
          # [Microservices Architecture on Google App
          # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          #
          # Using AppEngineRouting requires
          # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
          # Google IAM permission for the project
          # and the following scope:
          #
          # `https://www.googleapis.com/auth/cloud-platform`
        &quot;service&quot;: &quot;A String&quot;, # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        &quot;instance&quot;: &quot;A String&quot;, # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;version&quot;: &quot;A String&quot;, # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
            #
            # The host is constructed from the domain name of the app associated with
            # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
            # service, version,
            # and instance. Tasks which were created using
            # the App Engine SDK might have a custom domain name.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
          #
          # The app&#x27;s request handler for the task&#x27;s target URL must be able to handle
          # HTTP requests with this http_method, otherwise the task attempt fails with
          # error code 405 (Method Not Allowed). See [Writing a push task request
          # handler](https://cloud.google.com/appengine/docs/java/taskqueue/push/creating-handlers#writing_a_push_task_request_handler)
          # and the App Engine documentation for your runtime on [How Requests are
          # Handled](https://cloud.google.com/appengine/docs/standard/python3/how-requests-are-handled).
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
          #
          # A request body is allowed only if the HTTP method is POST or PUT. It is
          # an error to set a body on a task with an incompatible HttpMethod.
      &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
          #
          # The relative URI must begin with &quot;/&quot; and must be a valid HTTP relative URI.
          # It can contain a path and query string arguments.
          # If the relative URI is empty, then the root path &quot;/&quot; will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
    },
    &quot;view&quot;: &quot;A String&quot;, # Output only. The view specifies which subset of the Task has
        # been returned.
    &quot;scheduleTime&quot;: &quot;A String&quot;, # The time when the task is scheduled to be attempted or retried.
        #
        # `schedule_time` will be truncated to the nearest microsecond.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time that the task was created.
        #
        # `create_time` will be truncated to the nearest second.
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a task.

A task can be deleted if it is scheduled or dispatched. A task
cannot be deleted if it has executed successfully or permanently
failed.

Args:
  name: string, Required. The task name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID` (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A 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(name, responseView=None, x__xgafv=None)</code>
  <pre>Gets a task.

Args:
  name: string, Required. The task name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID` (required)
  responseView: string, The response_view specifies which subset of the Task will be
returned.

By default response_view is BASIC; not all
information is retrieved by default because some data, such as
payloads, might be desirable to return only when needed because
of its large size or because of the sensitivity of data that it
contains.

Authorization for FULL requires
`cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
permission on the Task resource.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A unit of scheduled work.
    &quot;httpRequest&quot;: { # HTTP request. # HTTP request that is sent to the worker.
        #
        # An HTTP task is a task that has HttpRequest set.
        #
        # The task will be pushed to the worker as an HTTP request. If the worker
        # or the redirected worker acknowledges the task by returning a successful HTTP
        # response code ([`200` - `299`]), the task will be removed from the queue. If
        # any other HTTP response code is returned or no response is received, the
        # task will be retried according to the following:
        #
        # * User-specified throttling: retry configuration,
        #   rate limits, and the queue&#x27;s state.
        #
        # * System throttling: To prevent the worker from overloading, Cloud Tasks may
        #   temporarily reduce the queue&#x27;s effective rate. User-specified settings
        #   will not be changed.
        #
        #  System throttling happens because:
        #
        #   * Cloud Tasks backs off on all errors. Normally the backoff specified in
        #     rate limits will be used. But if the worker returns
        #     `429` (Too Many Requests), `503` (Service Unavailable), or the rate of
        #     errors is high, Cloud Tasks will use a higher backoff rate. The retry
        #     specified in the `Retry-After` HTTP response header is considered.
        #
        #   * To prevent traffic spikes and to smooth sudden increases in traffic,
        #     dispatches ramp up slowly when the queue is newly created or idle and
        #     if large numbers of tasks suddenly become available to dispatch (due to
        #     spikes in create task rates, the queue being unpaused, or many tasks
        #     that are scheduled at the same time).
      &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
          # will be generated and attached as an `Authorization` header in the HTTP
          # request.
          #
          # This type of authorization should generally only be used when calling
          # Google APIs hosted on *.googleapis.com.
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
          # This type of authorization should generally only be used when calling Google
          # APIs hosted on *.googleapis.com.
        &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
            # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
            # will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OAuth token.
            # The service account must be within the same project as the queue. The
            # caller must have iam.serviceAccounts.actAs permission for the service
            # account.
      },
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values.
          # Headers can be set when the
          # task is created.
          #
          # These headers represent a subset of the headers that will accompany the
          # task&#x27;s HTTP request. Some HTTP request headers will be ignored or replaced.
          #
          # A partial list of headers that will be ignored or replaced is:
          #
          # * Host: This will be computed by Cloud Tasks and derived from
          #   HttpRequest.url.
          # * Content-Length: This will be computed by Cloud Tasks.
          # * User-Agent: This will be set to `&quot;Google-Cloud-Tasks&quot;`.
          # * X-Google-*: Google use only.
          # * X-AppEngine-*: Google use only.
          #
          # `Content-Type` won&#x27;t be set by Cloud Tasks. You can explicitly set
          # `Content-Type` to a media type when the
          #  task is created.
          #  For example, `Content-Type` can be set to `&quot;application/octet-stream&quot;` or
          #  `&quot;application/json&quot;`.
          #
          # Headers which can have multiple values (according to RFC2616) can be
          # specified using comma-separated values.
          #
          # The size of the headers must be less than 80KB.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;url&quot;: &quot;A String&quot;, # Required. The full url path that the request will be sent to.
          #
          # This string must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples
          # are: `http://acme.com` and `https://acme.com/sales:8080`. Cloud Tasks will
          # encode some characters for safety and compatibility. The maximum allowed
          # URL length is 2083 characters after encoding.
          #
          # The `Location` header response from a redirect response [`300` - `399`]
          # may be followed. The redirect is not counted as a separate attempt.
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
          # token will be generated and attached as an `Authorization` header in the
          # HTTP request.
          #
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OIDC token.
            # The service account must be within the same project as the queue. The
            # caller must have iam.serviceAccounts.actAs permission for the service
            # account.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
          #
          # A request body is allowed only if the
          # HTTP method is POST, PUT, or PATCH. It is an
          # error to set body on a task with an incompatible HttpMethod.
    },
    &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateTask.
        #
        # The task name.
        #
        # The task name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the task&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
        # * `TASK_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
        #   hyphens (-), or underscores (_). The maximum length is 500 characters.
    &quot;dispatchDeadline&quot;: &quot;A String&quot;, # The deadline for requests sent to the worker. If the worker does not
        # respond by this deadline then the request is cancelled and the attempt
        # is marked as a `DEADLINE_EXCEEDED` failure. Cloud Tasks will retry the
        # task according to the RetryConfig.
        #
        # Note that when the request is cancelled, Cloud Tasks will stop listing for
        # the response, but whether the worker stops processing depends on the
        # worker. For example, if the worker is stuck, it may not react to cancelled
        # requests.
        #
        # The default and maximum values depend on the type of request:
        #
        # * For HTTP tasks, the default is 10 minutes. The deadline
        #   must be in the interval [15 seconds, 30 minutes].
        #
        # * For App Engine tasks, 0 indicates that the
        #   request has the default deadline. The default deadline depends on the
        #   [scaling
        #   type](https://cloud.google.com/appengine/docs/standard/go/how-instances-are-managed#instance_scaling)
        #   of the service: 10 minutes for standard apps with automatic scaling, 24
        #   hours for standard apps with manual and basic scaling, and 60 minutes for
        #   flex apps. If the request deadline is set, it must be in the interval [15
        #   seconds, 24 hours 15 seconds]. Regardless of the task&#x27;s
        #   `dispatch_deadline`, the app handler will not run for longer than than
        #   the service&#x27;s timeout. We recommend setting the `dispatch_deadline` to
        #   at most a few seconds more than the app handler&#x27;s timeout. For more
        #   information see
        #   [Timeouts](https://cloud.google.com/tasks/docs/creating-appengine-handlers#timeouts).
        #
        # `dispatch_deadline` will be truncated to the nearest millisecond. The
        # deadline is an approximate deadline.
    &quot;dispatchCount&quot;: 42, # Output only. The number of attempts dispatched.
        #
        # This count includes attempts which have been dispatched but haven&#x27;t
        # received a response.
    &quot;firstAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s first attempt.
        #
        # Only dispatch_time will be set.
        # The other Attempt information is not retained by Cloud Tasks.
      &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
          #
          # `response_time` will be truncated to the nearest microsecond.
      &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
          #
          # If `response_time` is unset, then the task has not been attempted or is
          # currently running and the `response_status` field is meaningless.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
          #
          # `dispatch_time` will be truncated to the nearest microsecond.
    },
    &quot;lastAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s last attempt.
      &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
          #
          # `response_time` will be truncated to the nearest microsecond.
      &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
          #
          # If `response_time` is unset, then the task has not been attempted or is
          # currently running and the `response_status` field is meaningless.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
          #
          # `dispatch_time` will be truncated to the nearest microsecond.
    },
    &quot;responseCount&quot;: 42, # Output only. The number of attempts which have received a response.
    &quot;appEngineHttpRequest&quot;: { # App Engine HTTP request. # HTTP request that is sent to the App Engine app handler.
        #
        # An App Engine task is a task that has AppEngineHttpRequest set.
        #
        # The message defines the HTTP request that is sent to an App Engine app when
        # the task is dispatched.
        #
        # Using AppEngineHttpRequest requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
        #
        # The task will be delivered to the App Engine app which belongs to the same
        # project as the queue. For more information, see
        # [How Requests are
        # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
        # and how routing is affected by
        # [dispatch
        # files](https://cloud.google.com/appengine/docs/python/config/dispatchref).
        # Traffic is encrypted during transport and never leaves Google datacenters.
        # Because this traffic is carried over a communication mechanism internal to
        # Google, you cannot explicitly set the protocol (for example, HTTP or HTTPS).
        # The request to the handler, however, will appear to have used the HTTP
        # protocol.
        #
        # The AppEngineRouting used to construct the URL that the task is
        # delivered to can be set at the queue-level or task-level:
        #
        # * If app_engine_routing_override is set on the
        #   queue, this value is used for all
        #   tasks in the queue, no matter what the setting is for the task-level
        #   app_engine_routing.
        #
        #
        # The `url` that the task will be sent to is:
        #
        # * `url =` host `+`
        #   relative_uri
        #
        # Tasks can be dispatched to secure app handlers, unsecure app handlers, and
        # URIs restricted with
        # [`login:
        # admin`](https://cloud.google.com/appengine/docs/standard/python/config/appref).
        # Because tasks are not run as any user, they cannot be dispatched to URIs
        # restricted with
        # [`login:
        # required`](https://cloud.google.com/appengine/docs/standard/python/config/appref)
        # Task dispatches also do not follow redirects.
        #
        # The task attempt has succeeded if the app&#x27;s request handler returns an HTTP
        # response code in the range [`200` - `299`]. The task attempt has failed if
        # the app&#x27;s handler returns a non-2xx response code or Cloud Tasks does
        # not receive response before the deadline. Failed
        # tasks will be retried according to the
        # retry configuration. `503` (Service Unavailable) is
        # considered an App Engine system error instead of an application error and
        # will cause Cloud Tasks&#x27; traffic congestion control to temporarily throttle
        # the queue&#x27;s dispatches. Unlike other types of task targets, a `429` (Too Many
        # Requests) response from an app handler does not cause traffic congestion
        # control to throttle the queue.
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values.
          # Headers can be set when the
          # task is created.
          # Repeated headers are not supported but a header value can contain commas.
          #
          # Cloud Tasks sets some headers to default values:
          #
          # * `User-Agent`: By default, this header is
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
          #   This header can be modified, but Cloud Tasks will append
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
          #   modified `User-Agent`.
          #
          # If the task has a body, Cloud
          # Tasks sets the following headers:
          #
          # * `Content-Type`: By default, the `Content-Type` header is set to
          #   `&quot;application/octet-stream&quot;`. The default can be overridden by explicitly
          #   setting `Content-Type` to a particular media type when the
          #   task is created.
          #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
          # * `Content-Length`: This is computed by Cloud Tasks. This value is
          #   output only.   It cannot be changed.
          #
          # The headers below cannot be set or overridden:
          #
          # * `Host`
          # * `X-Google-*`
          # * `X-AppEngine-*`
          #
          # In addition, Cloud Tasks sets some headers when the task is dispatched,
          # such as headers containing information about the task; see
          # [request
          # headers](https://cloud.google.com/tasks/docs/creating-appengine-handlers#reading_request_headers).
          # These headers are set only when the task is dispatched, so they are not
          # visible when the task is returned in a Cloud Tasks response.
          #
          # Although there is no specific limit for the maximum number of headers or
          # the size, there is a limit on the maximum size of the Task. For more
          # information, see the CreateTask documentation.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;appEngineRouting&quot;: { # App Engine Routing. # Task-level setting for App Engine routing.
          #
          # * If app_engine_routing_override is set on the
          #   queue, this value is used for all
          #   tasks in the queue, no matter what the setting is for the task-level
          #   app_engine_routing.
          #
          # Defines routing characteristics specific to App Engine - service, version,
          # and instance.
          #
          # For more information about services, versions, and instances see
          # [An Overview of App
          # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
          # [Microservices Architecture on Google App
          # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          #
          # Using AppEngineRouting requires
          # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
          # Google IAM permission for the project
          # and the following scope:
          #
          # `https://www.googleapis.com/auth/cloud-platform`
        &quot;service&quot;: &quot;A String&quot;, # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        &quot;instance&quot;: &quot;A String&quot;, # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;version&quot;: &quot;A String&quot;, # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
            #
            # The host is constructed from the domain name of the app associated with
            # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
            # service, version,
            # and instance. Tasks which were created using
            # the App Engine SDK might have a custom domain name.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
          #
          # The app&#x27;s request handler for the task&#x27;s target URL must be able to handle
          # HTTP requests with this http_method, otherwise the task attempt fails with
          # error code 405 (Method Not Allowed). See [Writing a push task request
          # handler](https://cloud.google.com/appengine/docs/java/taskqueue/push/creating-handlers#writing_a_push_task_request_handler)
          # and the App Engine documentation for your runtime on [How Requests are
          # Handled](https://cloud.google.com/appengine/docs/standard/python3/how-requests-are-handled).
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
          #
          # A request body is allowed only if the HTTP method is POST or PUT. It is
          # an error to set a body on a task with an incompatible HttpMethod.
      &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
          #
          # The relative URI must begin with &quot;/&quot; and must be a valid HTTP relative URI.
          # It can contain a path and query string arguments.
          # If the relative URI is empty, then the root path &quot;/&quot; will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
    },
    &quot;view&quot;: &quot;A String&quot;, # Output only. The view specifies which subset of the Task has
        # been returned.
    &quot;scheduleTime&quot;: &quot;A String&quot;, # The time when the task is scheduled to be attempted or retried.
        #
        # `schedule_time` will be truncated to the nearest microsecond.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time that the task was created.
        #
        # `create_time` will be truncated to the nearest second.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, responseView=None, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Lists the tasks in a queue.

By default, only the BASIC view is retrieved
due to performance considerations;
response_view controls the
subset of information which is returned.

The tasks may be returned in any order. The ordering may change at any
time.

Args:
  parent: string, Required. The queue name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID` (required)
  responseView: string, The response_view specifies which subset of the Task will be
returned.

By default response_view is BASIC; not all
information is retrieved by default because some data, such as
payloads, might be desirable to return only when needed because
of its large size or because of the sensitivity of data that it
contains.

Authorization for FULL requires
`cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
permission on the Task resource.
  pageToken: string, A token identifying the page of results to return.

To request the first page results, page_token must be empty. To
request the next page of results, page_token must be the value of
next_page_token returned
from the previous call to ListTasks
method.

The page token is valid for only 2 hours.
  pageSize: integer, Maximum page size.

Fewer tasks than requested might be returned, even if more tasks exist; use
next_page_token in the response to
determine if more tasks exist.

The maximum page size is 1000. If unspecified, the page size will be the
maximum.
  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 listing tasks using ListTasks.
    &quot;tasks&quot;: [ # The list of tasks.
      { # A unit of scheduled work.
        &quot;httpRequest&quot;: { # HTTP request. # HTTP request that is sent to the worker.
            #
            # An HTTP task is a task that has HttpRequest set.
            #
            # The task will be pushed to the worker as an HTTP request. If the worker
            # or the redirected worker acknowledges the task by returning a successful HTTP
            # response code ([`200` - `299`]), the task will be removed from the queue. If
            # any other HTTP response code is returned or no response is received, the
            # task will be retried according to the following:
            #
            # * User-specified throttling: retry configuration,
            #   rate limits, and the queue&#x27;s state.
            #
            # * System throttling: To prevent the worker from overloading, Cloud Tasks may
            #   temporarily reduce the queue&#x27;s effective rate. User-specified settings
            #   will not be changed.
            #
            #  System throttling happens because:
            #
            #   * Cloud Tasks backs off on all errors. Normally the backoff specified in
            #     rate limits will be used. But if the worker returns
            #     `429` (Too Many Requests), `503` (Service Unavailable), or the rate of
            #     errors is high, Cloud Tasks will use a higher backoff rate. The retry
            #     specified in the `Retry-After` HTTP response header is considered.
            #
            #   * To prevent traffic spikes and to smooth sudden increases in traffic,
            #     dispatches ramp up slowly when the queue is newly created or idle and
            #     if large numbers of tasks suddenly become available to dispatch (due to
            #     spikes in create task rates, the queue being unpaused, or many tasks
            #     that are scheduled at the same time).
          &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
              # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
              # will be generated and attached as an `Authorization` header in the HTTP
              # request.
              #
              # This type of authorization should generally only be used when calling
              # Google APIs hosted on *.googleapis.com.
              # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
              # This type of authorization should generally only be used when calling Google
              # APIs hosted on *.googleapis.com.
            &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
                # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
                # will be used.
            &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
                # to be used for generating OAuth token.
                # The service account must be within the same project as the queue. The
                # caller must have iam.serviceAccounts.actAs permission for the service
                # account.
          },
          &quot;headers&quot;: { # HTTP request headers.
              #
              # This map contains the header field names and values.
              # Headers can be set when the
              # task is created.
              #
              # These headers represent a subset of the headers that will accompany the
              # task&#x27;s HTTP request. Some HTTP request headers will be ignored or replaced.
              #
              # A partial list of headers that will be ignored or replaced is:
              #
              # * Host: This will be computed by Cloud Tasks and derived from
              #   HttpRequest.url.
              # * Content-Length: This will be computed by Cloud Tasks.
              # * User-Agent: This will be set to `&quot;Google-Cloud-Tasks&quot;`.
              # * X-Google-*: Google use only.
              # * X-AppEngine-*: Google use only.
              #
              # `Content-Type` won&#x27;t be set by Cloud Tasks. You can explicitly set
              # `Content-Type` to a media type when the
              #  task is created.
              #  For example, `Content-Type` can be set to `&quot;application/octet-stream&quot;` or
              #  `&quot;application/json&quot;`.
              #
              # Headers which can have multiple values (according to RFC2616) can be
              # specified using comma-separated values.
              #
              # The size of the headers must be less than 80KB.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;url&quot;: &quot;A String&quot;, # Required. The full url path that the request will be sent to.
              #
              # This string must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples
              # are: `http://acme.com` and `https://acme.com/sales:8080`. Cloud Tasks will
              # encode some characters for safety and compatibility. The maximum allowed
              # URL length is 2083 characters after encoding.
              #
              # The `Location` header response from a redirect response [`300` - `399`]
              # may be followed. The redirect is not counted as a separate attempt.
          &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
              # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
              # token will be generated and attached as an `Authorization` header in the
              # HTTP request.
              #
              # This type of authorization can be used for many scenarios, including
              # calling Cloud Run, or endpoints where you intend to validate the token
              # yourself.
              # [OpenID Connect
              # token](https://developers.google.com/identity/protocols/OpenIDConnect).
              # This type of authorization can be used for many scenarios, including
              # calling Cloud Run, or endpoints where you intend to validate the token
              # yourself.
            &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
                # specified in target will be used.
            &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
                # to be used for generating OIDC token.
                # The service account must be within the same project as the queue. The
                # caller must have iam.serviceAccounts.actAs permission for the service
                # account.
          },
          &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
          &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
              #
              # A request body is allowed only if the
              # HTTP method is POST, PUT, or PATCH. It is an
              # error to set body on a task with an incompatible HttpMethod.
        },
        &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateTask.
            #
            # The task name.
            #
            # The task name must have the following format:
            # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
            #
            # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
            #    hyphens (-), colons (:), or periods (.).
            #    For more information, see
            #    [Identifying
            #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
            # * `LOCATION_ID` is the canonical ID for the task&#x27;s location.
            #    The list of available locations can be obtained by calling
            #    ListLocations.
            #    For more information, see https://cloud.google.com/about/locations/.
            # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
            #   hyphens (-). The maximum length is 100 characters.
            # * `TASK_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
            #   hyphens (-), or underscores (_). The maximum length is 500 characters.
        &quot;dispatchDeadline&quot;: &quot;A String&quot;, # The deadline for requests sent to the worker. If the worker does not
            # respond by this deadline then the request is cancelled and the attempt
            # is marked as a `DEADLINE_EXCEEDED` failure. Cloud Tasks will retry the
            # task according to the RetryConfig.
            #
            # Note that when the request is cancelled, Cloud Tasks will stop listing for
            # the response, but whether the worker stops processing depends on the
            # worker. For example, if the worker is stuck, it may not react to cancelled
            # requests.
            #
            # The default and maximum values depend on the type of request:
            #
            # * For HTTP tasks, the default is 10 minutes. The deadline
            #   must be in the interval [15 seconds, 30 minutes].
            #
            # * For App Engine tasks, 0 indicates that the
            #   request has the default deadline. The default deadline depends on the
            #   [scaling
            #   type](https://cloud.google.com/appengine/docs/standard/go/how-instances-are-managed#instance_scaling)
            #   of the service: 10 minutes for standard apps with automatic scaling, 24
            #   hours for standard apps with manual and basic scaling, and 60 minutes for
            #   flex apps. If the request deadline is set, it must be in the interval [15
            #   seconds, 24 hours 15 seconds]. Regardless of the task&#x27;s
            #   `dispatch_deadline`, the app handler will not run for longer than than
            #   the service&#x27;s timeout. We recommend setting the `dispatch_deadline` to
            #   at most a few seconds more than the app handler&#x27;s timeout. For more
            #   information see
            #   [Timeouts](https://cloud.google.com/tasks/docs/creating-appengine-handlers#timeouts).
            #
            # `dispatch_deadline` will be truncated to the nearest millisecond. The
            # deadline is an approximate deadline.
        &quot;dispatchCount&quot;: 42, # Output only. The number of attempts dispatched.
            #
            # This count includes attempts which have been dispatched but haven&#x27;t
            # received a response.
        &quot;firstAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s first attempt.
            #
            # Only dispatch_time will be set.
            # The other Attempt information is not retained by Cloud Tasks.
          &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
              #
              # `response_time` will be truncated to the nearest microsecond.
          &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
              #
              # If `response_time` is unset, then the task has not been attempted or is
              # currently running and the `response_status` field is meaningless.
              # different programming environments, including REST APIs and RPC APIs. It is
              # used by [gRPC](https://github.com/grpc). Each `Status` message contains
              # three pieces of data: error code, error message, and error details.
              #
              # You can find out more about this error model and how to work with it in the
              # [API Design Guide](https://cloud.google.com/apis/design/errors).
            &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
                # message types for APIs to use.
              {
                &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
              },
            ],
            &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
            &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
                # user-facing error message should be localized and sent in the
                # google.rpc.Status.details field, or localized by the client.
          },
          &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
              #
              # `schedule_time` will be truncated to the nearest microsecond.
          &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
              #
              # `dispatch_time` will be truncated to the nearest microsecond.
        },
        &quot;lastAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s last attempt.
          &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
              #
              # `response_time` will be truncated to the nearest microsecond.
          &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
              #
              # If `response_time` is unset, then the task has not been attempted or is
              # currently running and the `response_status` field is meaningless.
              # different programming environments, including REST APIs and RPC APIs. It is
              # used by [gRPC](https://github.com/grpc). Each `Status` message contains
              # three pieces of data: error code, error message, and error details.
              #
              # You can find out more about this error model and how to work with it in the
              # [API Design Guide](https://cloud.google.com/apis/design/errors).
            &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
                # message types for APIs to use.
              {
                &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
              },
            ],
            &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
            &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
                # user-facing error message should be localized and sent in the
                # google.rpc.Status.details field, or localized by the client.
          },
          &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
              #
              # `schedule_time` will be truncated to the nearest microsecond.
          &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
              #
              # `dispatch_time` will be truncated to the nearest microsecond.
        },
        &quot;responseCount&quot;: 42, # Output only. The number of attempts which have received a response.
        &quot;appEngineHttpRequest&quot;: { # App Engine HTTP request. # HTTP request that is sent to the App Engine app handler.
            #
            # An App Engine task is a task that has AppEngineHttpRequest set.
            #
            # The message defines the HTTP request that is sent to an App Engine app when
            # the task is dispatched.
            #
            # Using AppEngineHttpRequest requires
            # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
            # Google IAM permission for the project
            # and the following scope:
            #
            # `https://www.googleapis.com/auth/cloud-platform`
            #
            # The task will be delivered to the App Engine app which belongs to the same
            # project as the queue. For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and how routing is affected by
            # [dispatch
            # files](https://cloud.google.com/appengine/docs/python/config/dispatchref).
            # Traffic is encrypted during transport and never leaves Google datacenters.
            # Because this traffic is carried over a communication mechanism internal to
            # Google, you cannot explicitly set the protocol (for example, HTTP or HTTPS).
            # The request to the handler, however, will appear to have used the HTTP
            # protocol.
            #
            # The AppEngineRouting used to construct the URL that the task is
            # delivered to can be set at the queue-level or task-level:
            #
            # * If app_engine_routing_override is set on the
            #   queue, this value is used for all
            #   tasks in the queue, no matter what the setting is for the task-level
            #   app_engine_routing.
            #
            #
            # The `url` that the task will be sent to is:
            #
            # * `url =` host `+`
            #   relative_uri
            #
            # Tasks can be dispatched to secure app handlers, unsecure app handlers, and
            # URIs restricted with
            # [`login:
            # admin`](https://cloud.google.com/appengine/docs/standard/python/config/appref).
            # Because tasks are not run as any user, they cannot be dispatched to URIs
            # restricted with
            # [`login:
            # required`](https://cloud.google.com/appengine/docs/standard/python/config/appref)
            # Task dispatches also do not follow redirects.
            #
            # The task attempt has succeeded if the app&#x27;s request handler returns an HTTP
            # response code in the range [`200` - `299`]. The task attempt has failed if
            # the app&#x27;s handler returns a non-2xx response code or Cloud Tasks does
            # not receive response before the deadline. Failed
            # tasks will be retried according to the
            # retry configuration. `503` (Service Unavailable) is
            # considered an App Engine system error instead of an application error and
            # will cause Cloud Tasks&#x27; traffic congestion control to temporarily throttle
            # the queue&#x27;s dispatches. Unlike other types of task targets, a `429` (Too Many
            # Requests) response from an app handler does not cause traffic congestion
            # control to throttle the queue.
          &quot;headers&quot;: { # HTTP request headers.
              #
              # This map contains the header field names and values.
              # Headers can be set when the
              # task is created.
              # Repeated headers are not supported but a header value can contain commas.
              #
              # Cloud Tasks sets some headers to default values:
              #
              # * `User-Agent`: By default, this header is
              #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
              #   This header can be modified, but Cloud Tasks will append
              #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
              #   modified `User-Agent`.
              #
              # If the task has a body, Cloud
              # Tasks sets the following headers:
              #
              # * `Content-Type`: By default, the `Content-Type` header is set to
              #   `&quot;application/octet-stream&quot;`. The default can be overridden by explicitly
              #   setting `Content-Type` to a particular media type when the
              #   task is created.
              #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
              # * `Content-Length`: This is computed by Cloud Tasks. This value is
              #   output only.   It cannot be changed.
              #
              # The headers below cannot be set or overridden:
              #
              # * `Host`
              # * `X-Google-*`
              # * `X-AppEngine-*`
              #
              # In addition, Cloud Tasks sets some headers when the task is dispatched,
              # such as headers containing information about the task; see
              # [request
              # headers](https://cloud.google.com/tasks/docs/creating-appengine-handlers#reading_request_headers).
              # These headers are set only when the task is dispatched, so they are not
              # visible when the task is returned in a Cloud Tasks response.
              #
              # Although there is no specific limit for the maximum number of headers or
              # the size, there is a limit on the maximum size of the Task. For more
              # information, see the CreateTask documentation.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;appEngineRouting&quot;: { # App Engine Routing. # Task-level setting for App Engine routing.
              #
              # * If app_engine_routing_override is set on the
              #   queue, this value is used for all
              #   tasks in the queue, no matter what the setting is for the task-level
              #   app_engine_routing.
              #
              # Defines routing characteristics specific to App Engine - service, version,
              # and instance.
              #
              # For more information about services, versions, and instances see
              # [An Overview of App
              # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
              # [Microservices Architecture on Google App
              # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
              #
              # Using AppEngineRouting requires
              # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
              # Google IAM permission for the project
              # and the following scope:
              #
              # `https://www.googleapis.com/auth/cloud-platform`
            &quot;service&quot;: &quot;A String&quot;, # App service.
                #
                # By default, the task is sent to the service which is the default
                # service when the task is attempted.
                #
                # For some queues or tasks which were created using the App Engine
                # Task Queue API, host is not parsable
                # into service,
                # version, and
                # instance. For example, some tasks
                # which were created using the App Engine SDK use a custom domain
                # name; custom domains are not parsed by Cloud Tasks. If
                # host is not parsable, then
                # service,
                # version, and
                # instance are the empty string.
            &quot;instance&quot;: &quot;A String&quot;, # App instance.
                #
                # By default, the task is sent to an instance which is available when
                # the task is attempted.
                #
                # Requests can only be sent to a specific instance if
                # [manual scaling is used in App Engine
                # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
                # App Engine Flex does not support instances. For more information, see
                # [App Engine Standard request
                # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
                # and [App Engine Flex request
                # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
            &quot;version&quot;: &quot;A String&quot;, # App version.
                #
                # By default, the task is sent to the version which is the default
                # version when the task is attempted.
                #
                # For some queues or tasks which were created using the App Engine
                # Task Queue API, host is not parsable
                # into service,
                # version, and
                # instance. For example, some tasks
                # which were created using the App Engine SDK use a custom domain
                # name; custom domains are not parsed by Cloud Tasks. If
                # host is not parsable, then
                # service,
                # version, and
                # instance are the empty string.
            &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
                #
                # The host is constructed from the domain name of the app associated with
                # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
                # service, version,
                # and instance. Tasks which were created using
                # the App Engine SDK might have a custom domain name.
                #
                # For more information, see
                # [How Requests are
                # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
          },
          &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
              #
              # The app&#x27;s request handler for the task&#x27;s target URL must be able to handle
              # HTTP requests with this http_method, otherwise the task attempt fails with
              # error code 405 (Method Not Allowed). See [Writing a push task request
              # handler](https://cloud.google.com/appengine/docs/java/taskqueue/push/creating-handlers#writing_a_push_task_request_handler)
              # and the App Engine documentation for your runtime on [How Requests are
              # Handled](https://cloud.google.com/appengine/docs/standard/python3/how-requests-are-handled).
          &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
              #
              # A request body is allowed only if the HTTP method is POST or PUT. It is
              # an error to set a body on a task with an incompatible HttpMethod.
          &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
              #
              # The relative URI must begin with &quot;/&quot; and must be a valid HTTP relative URI.
              # It can contain a path and query string arguments.
              # If the relative URI is empty, then the root path &quot;/&quot; will be used.
              # No spaces are allowed, and the maximum length allowed is 2083 characters.
        },
        &quot;view&quot;: &quot;A String&quot;, # Output only. The view specifies which subset of the Task has
            # been returned.
        &quot;scheduleTime&quot;: &quot;A String&quot;, # The time when the task is scheduled to be attempted or retried.
            #
            # `schedule_time` will be truncated to the nearest microsecond.
        &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time that the task was created.
            #
            # `create_time` will be truncated to the nearest second.
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # A token to retrieve next page of results.
        #
        # To return the next page of results, call
        # ListTasks with this value as the
        # page_token.
        #
        # If the next_page_token is empty, there are no more results.
  }</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="run">run(name, body=None, x__xgafv=None)</code>
  <pre>Forces a task to run now.

When this method is called, Cloud Tasks will dispatch the task, even if
the task is already running, the queue has reached its RateLimits or
is PAUSED.

This command is meant to be used for manual debugging. For
example, RunTask can be used to retry a failed
task after a fix has been made or to manually force a task to be
dispatched now.

The dispatched task is returned. That is, the task that is returned
contains the status after the task is dispatched but
before the task is received by its target.

If Cloud Tasks receives a successful response from the task&#x27;s
target, then the task will be deleted; otherwise the task&#x27;s
schedule_time will be reset to the time that
RunTask was called plus the retry delay specified
in the queue&#x27;s RetryConfig.

RunTask returns
NOT_FOUND when it is called on a
task that has already succeeded or permanently failed.

Args:
  name: string, Required. The task name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID` (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for forcing a task to run now using
      # RunTask.
    &quot;responseView&quot;: &quot;A String&quot;, # The response_view specifies which subset of the Task will be
        # returned.
        # 
        # By default response_view is BASIC; not all
        # information is retrieved by default because some data, such as
        # payloads, might be desirable to return only when needed because
        # of its large size or because of the sensitivity of data that it
        # contains.
        # 
        # Authorization for FULL requires
        # `cloudtasks.tasks.fullView` [Google IAM](https://cloud.google.com/iam/)
        # permission on the Task resource.
  }

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

Returns:
  An object of the form:

    { # A unit of scheduled work.
    &quot;httpRequest&quot;: { # HTTP request. # HTTP request that is sent to the worker.
        #
        # An HTTP task is a task that has HttpRequest set.
        #
        # The task will be pushed to the worker as an HTTP request. If the worker
        # or the redirected worker acknowledges the task by returning a successful HTTP
        # response code ([`200` - `299`]), the task will be removed from the queue. If
        # any other HTTP response code is returned or no response is received, the
        # task will be retried according to the following:
        #
        # * User-specified throttling: retry configuration,
        #   rate limits, and the queue&#x27;s state.
        #
        # * System throttling: To prevent the worker from overloading, Cloud Tasks may
        #   temporarily reduce the queue&#x27;s effective rate. User-specified settings
        #   will not be changed.
        #
        #  System throttling happens because:
        #
        #   * Cloud Tasks backs off on all errors. Normally the backoff specified in
        #     rate limits will be used. But if the worker returns
        #     `429` (Too Many Requests), `503` (Service Unavailable), or the rate of
        #     errors is high, Cloud Tasks will use a higher backoff rate. The retry
        #     specified in the `Retry-After` HTTP response header is considered.
        #
        #   * To prevent traffic spikes and to smooth sudden increases in traffic,
        #     dispatches ramp up slowly when the queue is newly created or idle and
        #     if large numbers of tasks suddenly become available to dispatch (due to
        #     spikes in create task rates, the queue being unpaused, or many tasks
        #     that are scheduled at the same time).
      &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
          # will be generated and attached as an `Authorization` header in the HTTP
          # request.
          #
          # This type of authorization should generally only be used when calling
          # Google APIs hosted on *.googleapis.com.
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
          # This type of authorization should generally only be used when calling Google
          # APIs hosted on *.googleapis.com.
        &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
            # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
            # will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OAuth token.
            # The service account must be within the same project as the queue. The
            # caller must have iam.serviceAccounts.actAs permission for the service
            # account.
      },
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values.
          # Headers can be set when the
          # task is created.
          #
          # These headers represent a subset of the headers that will accompany the
          # task&#x27;s HTTP request. Some HTTP request headers will be ignored or replaced.
          #
          # A partial list of headers that will be ignored or replaced is:
          #
          # * Host: This will be computed by Cloud Tasks and derived from
          #   HttpRequest.url.
          # * Content-Length: This will be computed by Cloud Tasks.
          # * User-Agent: This will be set to `&quot;Google-Cloud-Tasks&quot;`.
          # * X-Google-*: Google use only.
          # * X-AppEngine-*: Google use only.
          #
          # `Content-Type` won&#x27;t be set by Cloud Tasks. You can explicitly set
          # `Content-Type` to a media type when the
          #  task is created.
          #  For example, `Content-Type` can be set to `&quot;application/octet-stream&quot;` or
          #  `&quot;application/json&quot;`.
          #
          # Headers which can have multiple values (according to RFC2616) can be
          # specified using comma-separated values.
          #
          # The size of the headers must be less than 80KB.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;url&quot;: &quot;A String&quot;, # Required. The full url path that the request will be sent to.
          #
          # This string must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples
          # are: `http://acme.com` and `https://acme.com/sales:8080`. Cloud Tasks will
          # encode some characters for safety and compatibility. The maximum allowed
          # URL length is 2083 characters after encoding.
          #
          # The `Location` header response from a redirect response [`300` - `399`]
          # may be followed. The redirect is not counted as a separate attempt.
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
          # token will be generated and attached as an `Authorization` header in the
          # HTTP request.
          #
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OIDC token.
            # The service account must be within the same project as the queue. The
            # caller must have iam.serviceAccounts.actAs permission for the service
            # account.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
          #
          # A request body is allowed only if the
          # HTTP method is POST, PUT, or PATCH. It is an
          # error to set body on a task with an incompatible HttpMethod.
    },
    &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateTask.
        #
        # The task name.
        #
        # The task name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the task&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
        # * `TASK_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
        #   hyphens (-), or underscores (_). The maximum length is 500 characters.
    &quot;dispatchDeadline&quot;: &quot;A String&quot;, # The deadline for requests sent to the worker. If the worker does not
        # respond by this deadline then the request is cancelled and the attempt
        # is marked as a `DEADLINE_EXCEEDED` failure. Cloud Tasks will retry the
        # task according to the RetryConfig.
        #
        # Note that when the request is cancelled, Cloud Tasks will stop listing for
        # the response, but whether the worker stops processing depends on the
        # worker. For example, if the worker is stuck, it may not react to cancelled
        # requests.
        #
        # The default and maximum values depend on the type of request:
        #
        # * For HTTP tasks, the default is 10 minutes. The deadline
        #   must be in the interval [15 seconds, 30 minutes].
        #
        # * For App Engine tasks, 0 indicates that the
        #   request has the default deadline. The default deadline depends on the
        #   [scaling
        #   type](https://cloud.google.com/appengine/docs/standard/go/how-instances-are-managed#instance_scaling)
        #   of the service: 10 minutes for standard apps with automatic scaling, 24
        #   hours for standard apps with manual and basic scaling, and 60 minutes for
        #   flex apps. If the request deadline is set, it must be in the interval [15
        #   seconds, 24 hours 15 seconds]. Regardless of the task&#x27;s
        #   `dispatch_deadline`, the app handler will not run for longer than than
        #   the service&#x27;s timeout. We recommend setting the `dispatch_deadline` to
        #   at most a few seconds more than the app handler&#x27;s timeout. For more
        #   information see
        #   [Timeouts](https://cloud.google.com/tasks/docs/creating-appengine-handlers#timeouts).
        #
        # `dispatch_deadline` will be truncated to the nearest millisecond. The
        # deadline is an approximate deadline.
    &quot;dispatchCount&quot;: 42, # Output only. The number of attempts dispatched.
        #
        # This count includes attempts which have been dispatched but haven&#x27;t
        # received a response.
    &quot;firstAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s first attempt.
        #
        # Only dispatch_time will be set.
        # The other Attempt information is not retained by Cloud Tasks.
      &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
          #
          # `response_time` will be truncated to the nearest microsecond.
      &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
          #
          # If `response_time` is unset, then the task has not been attempted or is
          # currently running and the `response_status` field is meaningless.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
          #
          # `dispatch_time` will be truncated to the nearest microsecond.
    },
    &quot;lastAttempt&quot;: { # The status of a task attempt. # Output only. The status of the task&#x27;s last attempt.
      &quot;responseTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt response was received.
          #
          # `response_time` will be truncated to the nearest microsecond.
      &quot;responseStatus&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the worker for this attempt.
          #
          # If `response_time` is unset, then the task has not been attempted or is
          # currently running and the `response_status` field is meaningless.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was scheduled.
          #
          # `schedule_time` will be truncated to the nearest microsecond.
      &quot;dispatchTime&quot;: &quot;A String&quot;, # Output only. The time that this attempt was dispatched.
          #
          # `dispatch_time` will be truncated to the nearest microsecond.
    },
    &quot;responseCount&quot;: 42, # Output only. The number of attempts which have received a response.
    &quot;appEngineHttpRequest&quot;: { # App Engine HTTP request. # HTTP request that is sent to the App Engine app handler.
        #
        # An App Engine task is a task that has AppEngineHttpRequest set.
        #
        # The message defines the HTTP request that is sent to an App Engine app when
        # the task is dispatched.
        #
        # Using AppEngineHttpRequest requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
        #
        # The task will be delivered to the App Engine app which belongs to the same
        # project as the queue. For more information, see
        # [How Requests are
        # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
        # and how routing is affected by
        # [dispatch
        # files](https://cloud.google.com/appengine/docs/python/config/dispatchref).
        # Traffic is encrypted during transport and never leaves Google datacenters.
        # Because this traffic is carried over a communication mechanism internal to
        # Google, you cannot explicitly set the protocol (for example, HTTP or HTTPS).
        # The request to the handler, however, will appear to have used the HTTP
        # protocol.
        #
        # The AppEngineRouting used to construct the URL that the task is
        # delivered to can be set at the queue-level or task-level:
        #
        # * If app_engine_routing_override is set on the
        #   queue, this value is used for all
        #   tasks in the queue, no matter what the setting is for the task-level
        #   app_engine_routing.
        #
        #
        # The `url` that the task will be sent to is:
        #
        # * `url =` host `+`
        #   relative_uri
        #
        # Tasks can be dispatched to secure app handlers, unsecure app handlers, and
        # URIs restricted with
        # [`login:
        # admin`](https://cloud.google.com/appengine/docs/standard/python/config/appref).
        # Because tasks are not run as any user, they cannot be dispatched to URIs
        # restricted with
        # [`login:
        # required`](https://cloud.google.com/appengine/docs/standard/python/config/appref)
        # Task dispatches also do not follow redirects.
        #
        # The task attempt has succeeded if the app&#x27;s request handler returns an HTTP
        # response code in the range [`200` - `299`]. The task attempt has failed if
        # the app&#x27;s handler returns a non-2xx response code or Cloud Tasks does
        # not receive response before the deadline. Failed
        # tasks will be retried according to the
        # retry configuration. `503` (Service Unavailable) is
        # considered an App Engine system error instead of an application error and
        # will cause Cloud Tasks&#x27; traffic congestion control to temporarily throttle
        # the queue&#x27;s dispatches. Unlike other types of task targets, a `429` (Too Many
        # Requests) response from an app handler does not cause traffic congestion
        # control to throttle the queue.
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values.
          # Headers can be set when the
          # task is created.
          # Repeated headers are not supported but a header value can contain commas.
          #
          # Cloud Tasks sets some headers to default values:
          #
          # * `User-Agent`: By default, this header is
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
          #   This header can be modified, but Cloud Tasks will append
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
          #   modified `User-Agent`.
          #
          # If the task has a body, Cloud
          # Tasks sets the following headers:
          #
          # * `Content-Type`: By default, the `Content-Type` header is set to
          #   `&quot;application/octet-stream&quot;`. The default can be overridden by explicitly
          #   setting `Content-Type` to a particular media type when the
          #   task is created.
          #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
          # * `Content-Length`: This is computed by Cloud Tasks. This value is
          #   output only.   It cannot be changed.
          #
          # The headers below cannot be set or overridden:
          #
          # * `Host`
          # * `X-Google-*`
          # * `X-AppEngine-*`
          #
          # In addition, Cloud Tasks sets some headers when the task is dispatched,
          # such as headers containing information about the task; see
          # [request
          # headers](https://cloud.google.com/tasks/docs/creating-appengine-handlers#reading_request_headers).
          # These headers are set only when the task is dispatched, so they are not
          # visible when the task is returned in a Cloud Tasks response.
          #
          # Although there is no specific limit for the maximum number of headers or
          # the size, there is a limit on the maximum size of the Task. For more
          # information, see the CreateTask documentation.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;appEngineRouting&quot;: { # App Engine Routing. # Task-level setting for App Engine routing.
          #
          # * If app_engine_routing_override is set on the
          #   queue, this value is used for all
          #   tasks in the queue, no matter what the setting is for the task-level
          #   app_engine_routing.
          #
          # Defines routing characteristics specific to App Engine - service, version,
          # and instance.
          #
          # For more information about services, versions, and instances see
          # [An Overview of App
          # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
          # [Microservices Architecture on Google App
          # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          #
          # Using AppEngineRouting requires
          # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
          # Google IAM permission for the project
          # and the following scope:
          #
          # `https://www.googleapis.com/auth/cloud-platform`
        &quot;service&quot;: &quot;A String&quot;, # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        &quot;instance&quot;: &quot;A String&quot;, # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;version&quot;: &quot;A String&quot;, # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
            #
            # The host is constructed from the domain name of the app associated with
            # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
            # service, version,
            # and instance. Tasks which were created using
            # the App Engine SDK might have a custom domain name.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. The default is POST.
          #
          # The app&#x27;s request handler for the task&#x27;s target URL must be able to handle
          # HTTP requests with this http_method, otherwise the task attempt fails with
          # error code 405 (Method Not Allowed). See [Writing a push task request
          # handler](https://cloud.google.com/appengine/docs/java/taskqueue/push/creating-handlers#writing_a_push_task_request_handler)
          # and the App Engine documentation for your runtime on [How Requests are
          # Handled](https://cloud.google.com/appengine/docs/standard/python3/how-requests-are-handled).
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body.
          #
          # A request body is allowed only if the HTTP method is POST or PUT. It is
          # an error to set a body on a task with an incompatible HttpMethod.
      &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
          #
          # The relative URI must begin with &quot;/&quot; and must be a valid HTTP relative URI.
          # It can contain a path and query string arguments.
          # If the relative URI is empty, then the root path &quot;/&quot; will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
    },
    &quot;view&quot;: &quot;A String&quot;, # Output only. The view specifies which subset of the Task has
        # been returned.
    &quot;scheduleTime&quot;: &quot;A String&quot;, # The time when the task is scheduled to be attempted or retried.
        #
        # `schedule_time` will be truncated to the nearest microsecond.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time that the task was created.
        #
        # `create_time` will be truncated to the nearest second.
  }</pre>
</div>

</body></html>