<!--
{
  "availability" : [
    "iOS: 2.0.0 -",
    "iPadOS: 2.0.0 -",
    "macCatalyst: 13.0.0 -",
    "macOS: 10.0.0 -",
    "tvOS: 9.0.0 -",
    "visionOS: 1.0.0 -",
    "watchOS: 2.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "Foundation",
  "identifier" : "/documentation/Foundation/URLSession/dataTask(with:completionHandler:)-e6xv",
  "metadataVersion" : "0.1.0",
  "role" : "Instance Method",
  "symbol" : {
    "kind" : "Instance Method",
    "modules" : [
      "Foundation"
    ],
    "preciseIdentifier" : "c:objc(cs)NSURLSession(im)dataTaskWithRequest:completionHandler:"
  },
  "title" : "dataTask(with:completionHandler:)"
}
-->

# dataTask(with:completionHandler:)

Creates a task that retrieves the contents of a URL based on the specified URL request object, and calls a handler upon completion.

```
func dataTask(with request: URLRequest, completionHandler: @escaping @Sendable (Data?, URLResponse?, (any Error)?) -> Void) -> URLSessionDataTask
```

## Parameters

`request`

A URL request object that provides the URL, cache policy, request type, body data or body stream, and so on.

`completionHandler`

The completion handler to call when the load request is complete. This handler is executed on the delegate queue.

    If you pass     `nil`    , only the session delegate methods are called when the task completes, making this method equivalent to the [`dataTask(with:)`](/documentation/Foundation/URLSession/dataTask(with:)-7jpys)     method.

    This completion handler takes the following parameters:

- `data`: The data returned by the server.
- `response`: An object that provides response metadata, such as HTTP headers and status code. If you are making an HTTP or HTTPS request, the returned object is actually an [`HTTPURLResponse`](/documentation/Foundation/HTTPURLResponse) object.
- `error`: An error object that indicates why the request failed, or `nil` if the request was successful.

## Return Value

The new session data task.

## Discussion

By creating a task based on a request object, you can tune various aspects of the task’s behavior, including the cache policy and timeout interval.

By using the completion handler, the task bypasses calls to delegate methods for response and data delivery, and instead provides any resulting [`NSData`](/documentation/Foundation/NSData), [`URLResponse`](/documentation/Foundation/URLResponse), and [`NSError`](/documentation/Foundation/NSError) objects inside the completion handler. Delegate methods for handling authentication challenges, however, are still called.

You should pass a `nil` completion handler *only* when creating tasks in sessions whose delegates include a [`urlSession(_:dataTask:didReceive:)`](/documentation/Foundation/URLSessionDataDelegate/urlSession(_:dataTask:didReceive:)) method.

After you create the task, you must start it by calling its [`resume()`](/documentation/Foundation/URLSessionTask/resume()) method.

If the request completes successfully, the `data` parameter of the completion handler block contains the resource data, and the `error` parameter is `nil`. If the request fails, the `data` parameter is `nil` and the `error` parameter contain information about the failure. If a response from the server is received, regardless of whether the request completes successfully or fails, the `response` parameter contains that information.

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)