       # convert stringify nested query params
       opts.qs[key] = JSON.stringify val for key, val of opts.qs when _(val).isObject()
       waterfall = [async.apply quest, opts].concat(@_post.exec or [])
-      async.waterfall waterfall, (err, data) ->
-        p.reject err if err
-        p.resolve data
-        return cb?(err) if err
-        cb?(err, data)
+      promise = new Promise (resolve, reject) ->
+        async.waterfall waterfall, (err, data) ->
+          reject err if err
+          resolve data
+          return cb?(err) if err
+          cb?(err, data)
       return cb if _.isFunction(cb)
-      p.promise
+      promise
 
     stream: () => new QueryStream @
 

API_BASE = 'https://api.clever.com'
CLEVER_BASE = 'https://clever.com'

handle_errors = (resp, body, cb) ->
  return cb?(null, resp, body) if resp.statusCode is 200
  err = new Error "received statusCode #{resp.statusCode} instead of 200"

      super()
      @post 'exec', handle_errors
    exec: (cb) =>
      opts =
        method: @_method
        uri: @_uri
