<!--
{
  "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:)-52wk8",
  "metadataVersion" : "0.1.0",
  "role" : "Instance Method",
  "symbol" : {
    "kind" : "Instance Method",
    "modules" : [
      "Foundation"
    ],
    "preciseIdentifier" : "c:objc(cs)NSURLSession(im)dataTaskWithURL:completionHandler:"
  },
  "title" : "dataTask(with:completionHandler:)"
}
-->

# dataTask(with:completionHandler:)

Creates a task that retrieves the contents of the specified URL, then calls a handler upon completion.

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

## Parameters

`url`

The URL to be retrieved.

`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

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

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.

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)