     }
     
     // MARK: - Create a Token
-    public func requestToken(requestObject: OmiseRequestObject) {
+    public func requestToken(requestObject: OmiseRequestObject, tokenizerDelegate: OmiseTokenizerDelegate) {
         guard let request = createURLRequest(requestObject) else {
-            return
+            let error = OmiseError.UnexpectedError("Error can't create url request")
+            return tokenizerDelegate.OmiseRequestTokenOnFailed(error)
         }
+        
+        self.delegate = tokenizerDelegate
         
         let session = NSURLSession.sharedSession()
         let task = session.dataTaskWithRequest(request, completionHandler: didCompleteWithDelegate)

        
    }
    
    public func requestToken(requestObject: OmiseRequestObject, onCompletion: Callback)  {
        guard let urlRequest = createURLRequest(requestObject) else {
            return
        }
        
        let session = NSURLSession.sharedSession()
        self.callback = onCompletion
        let task = session.dataTaskWithRequest(urlRequest, completionHandler: didCompleteWithCallBack)
        task.resume()
    }
    
    private func didCompleteWithDelegate(data: NSData?, response: NSURLResponse?, error: NSError?) {
        guard let delegate = delegate else {
            print("Please set delegate before request token")
            return
        }
        

        let request = NSMutableURLRequest(URL: URL, cachePolicy: .UseProtocolCachePolicy, timeoutInterval: 15)
        request.HTTPMethod = "POST"
        
        let plainData = self.publicKey.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        
        guard let base64String = plainData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) else {
            OmiseWarning.SDKWarning("Can't encoding plainData to base64String")
            return nil
        }
        
