A simple Swift REST API client with an option of aggressive manual caching using URLCache.


Create your own client by conforming to FetchupClientProtocol:

class SomeAPIClient: FetchupClientProtocol {
    let configuration = FetchupClientConfiguration(
        baseURL: "https://someserver.com/rest",
        manualCaching: true
    let session = URLSession.shared

Define a resource containing the endpoint and Decodable types for JSON response:

struct FindBooks: APIResource {
    typealias Response = BooksResponse
    let method: HTTPMethod = .get
    let endpoint: URL = "/library/books"
    let queryParameters: [String: String]
    init(writtenBy authorName: String) {
        queryParameters = ["author": authorName]

struct BooksResponse: Decodable {
    let books: [Book]

struct Book: Decodable {
    let name: String
    let authorName: String
    let date: Date

Finally, fetch the resource and cache the response:

let client = SomeAPIClient()
let resource = FindBooks(writtenBy: "Stephen King")
let tomorrow = Date.now.addingTimeInterval(24*60*60)

client.fetchDataTask(resource, expiresOn: tomorrow) {
    switch $0 {
    case .success(let response):
    case .failure(let error):

If the response was successful and has not yet expired you can retrieve it from cache:

if let cachedBooks = client.cached(resource).books {


View Github