Getting Started

The QuestAPI is made up of two main concepts:

  1. ResponseProviders
  2. API


The job of the provider is to return data to API for a given request. QuestradeAPI comes with two providers, AuthProvider and FakeDataProvider. You can conform to ResponseProvider and build your own providers if you have extra custom behaviour that you need. To use a given provider just pass the provider to the initilization of API.

let api = API(provider: CustomProvider())


The AuthProvider class requires a class or struct that conforms to Storable. The purpose of AuthProvider is for authorizing and deauthorizing requests for the API.

let auth = AuthProvider(tokenStore: TokenStore())

Token Store

The Storable protocol is for you to conform to so that you can choose how to securly store the api token.

class TokenStore: Storable {
    // func get() -> Data
    // func set(_ data: Data)
    // func delete()


A ResponseProvider that loads fake responses from json files and supplies them as responses. This provider is used by default for API if none is provided on init.


The API class can be initilized with or without an authorizer(AuthProvider). If no authorizor is supplied on initilization, a default of FakeDataProvider will be used.

let api = API(provider: auth)

api.accounts { res in
    switch res {
    case .failure(let error): // log error
    case .success(let actResponse):
        let accounts = actResponse.accounts

Full Init Code

class MyAPI {

    let loginLink = URL.questAuthURL(
        clientId: "aFsd42sf234FGsdf",
        callbackURL: URL(string: "")!
    let authProvider = AuthProvider(tokenStore: TokenStore())
    lazy var api: API = { API(provider: authProvider) }()
    private(set) var accounts: Set<Account> = []
    init() {
        authProvider.delegate = self

    func singIn() {
        // present loginLink
        // user goes through oAuth steps
        // once steps are completed 
        // recieve url from quests oAuth and pass to the authorize from url method.
        authProvider.authorize(from: url)

extension MyAPI: AuthProviderDelegate {
    func didAuthorize(_ auth: AuthProvider){
        api.accounts{ res in
            do {
                self.accounts.update(try res.get().accounts)
            } catch {
                //TODO: handle error



This project is licensed under the MIT License – see the file for details


View Github