         }
     }
 
-    func openURL(url: NSURL) -> Bool {
-        guard let _ = clientId, _ = clientSecret else { return false }
+    static func openURL(url: NSURL) -> Bool {
+        guard let _ = sharedInstance.clientId, _ = sharedInstance.clientSecret else { return false }
         guard let code = NSURLComponents(URL: url, resolvingAgainstBaseURL: false)?.queryItems?.filter({ $0.name == "code" }).first?.value else { return false }
 
         fetchAccessToken(code)

                urlRequest.HTTPBody = body

                let session = NSURLSession(configuration: sessionConfiguration)
                let task = session.dataTaskWithRequest(urlRequest) { [weak self] data, response, error in
                    if let data = data {
                        do {
                            if let response = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [String: AnyObject], accessToken = response["access_token"] as? String {
                                self?.accessToken = accessToken
                                self?.completionHandler?(success: true, error: nil)

                            } else {
                                print("No access_token")


            // Auth
            let authString: String
            if sharedInstance.sandbox == true {
                authString = "\(clientId):SANDBOX-\(clientSecret)"
            } else {
                authString = "\(clientId):\(clientSecret)"
