Working with JSON APIs is a fundamental part of modern iOS app development. One of the most efficient ways to call web APIs in Swift is by using the URLSession
class, which provides an API for downloading data from and uploading data to endpoints over the network.

In this article, we’ll explore how to use URLSession
to send HTTP requests, handle JSON responses, and manage network tasks in a Swift-based iOS app.
What is URLSession?
URLSession
is a class provided by Apple’s Foundation framework that allows you to create and manage network sessions. You can use it to send HTTP or HTTPS requests to a server, download files, upload data, and handle background network tasks efficiently.
Making a Simple JSON API Call
To begin with, you’ll need a valid API endpoint that returns JSON data. For example, an endpoint like https://jsonplaceholder.typicode.com/todos/1
returns JSON-formatted to-do data.
Here’s a basic Swift example:
import Foundation struct Todo: Codable { let id: Int let title: String let completed: Bool } func fetchTodo() { guard let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1") else { print("Invalid URL") return } let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Request failed with error: \(error)") return } guard let data = data else { print("No data returned") return } do { let todo = try JSONDecoder().decode(Todo.self, from: data) print("Todo title: \(todo.title)") } catch { print("Decoding failed: \(error)") } } task.resume() }
This code defines a Todo
struct conforming to Codable
, makes an HTTP GET request, and decodes the response into the struct. It’s a clean, concise way to interact with APIs in Swift.
Handling Errors and Status Codes
When working with real-world APIs, it’s critical to handle errors, HTTP status codes, and edge cases. You can use the URLResponse
object and cast it to HTTPURLResponse
to check the status code:
if let httpResponse = response as? HTTPURLResponse { if httpResponse.statusCode == 200 { // Success } else { print("Server returned status code: \(httpResponse.statusCode)") } }
Security and Performance Tips
- Use
HTTPS
only for secure data transmission. - Perform networking tasks on background threads.
- Always validate server responses and decode errors gracefully.
- Use a timeout interval or caching policy as required for performance optimization.
Conclusion
Swift makes it simple and powerful to interact with JSON APIs using URLSession
. Whether you’re fetching data, sending updates, or performing background network tasks, URLSession
is the go-to tool for network communication in iOS development.
For more advanced techniques such as using Combine or async/await with URLSession in Swift, check out this detailed Swift.org article:
👉 Swift Async Await Networking