                             body: body,
                             completion: completion)
                     } else {
-                        completion(result)
+                        completion?(result)
                     }
                 }
             }
     }
 
-    private func sendRequest(request: HTTPRequest, completion: (Result<HTTPResponse, BothamAPIClientError>) -> ()) {
+    private func sendRequest(request: HTTPRequest, completion: ((Result<HTTPResponse, BothamAPIClientError>) -> ())? = nil) {
         httpClient.send(request) { result in
             if let _ = result.error {
-                completion(result)
+                completion?(result)
             } else if let response = result.value {
                 self.applyResponseInterceptors(response) { interceptorResult in
                     let mappedResult = interceptorResult.flatMap { httpResponse in
                         return self.mapHTTPResponseToBothamAPIClientError(httpResponse)
                     }
-                    completion(mappedResult)
+                    completion?(mappedResult)
                 }
             }
         }


            let interceptedRequest = applyRequestInterceptors(initialRequest)
            if !hasValidScheme(interceptedRequest) {
                completion(Result.Failure(BothamAPIClientError.UnsupportedURLScheme))
            } else {
                sendRequest(interceptedRequest) { result in
                    if let error = result.error, case .Retry = error {

        params: [String:String]? = nil,
        headers: [String:String]? = nil,
        body: [String:AnyObject]? = nil,
        completion: ((Result<HTTPResponse, BothamAPIClientError>) -> ())? = nil) {

            let initialRequest = HTTPRequest(
                url: baseEndpoint + path,
