       else
         req_data = req.params
 
-      request_headers = { 'Hull-App-Id': config.appId }
-      if accessToken
-        request_headers['Hull-Access-Token'] = accessToken
-
-      request = $.ajax
+      request = batchableRequest({
         url: url
         type: req.method
         data: req_data
         contentType: 'application/json'
         dataType: 'json'
-        headers: request_headers
+      })
 
       request.done (response)->
-        identify(_.clone(response)) if url == '/api/v1/me'
+        identify(_.clone(response.response)) if url == '/api/v1/me'
 
-        headers = _.reduce RESPONSE_HEADER, (memo, name) ->
-          value = request.getResponseHeader(name)
-          memo[name] = value if value?
-          memo
-        , {}
-
-        if accessToken && originalUserId && originalUserId != headers['Hull-User-Id']
+        if accessToken && originalUserId && originalUserId != response.headers['Hull-User-Id']
           # Reset token if the user has changed...
           accessToken = false
 
-        callback({ response: response, headers: headers, provider: 'hull' }) if _.isFunction(callback)
+        response.provider = 'hull'
+        callback(response) if _.isFunction(callback)
 
-        trackAction(request, response)
-
+        trackAction(response)
 
       request.fail(errback)
 

  (app)->

    config = app.config

    identified = false

    accessToken     = app.config.access_token
    originalUserId  = app.config.data?.me?.id

    identify = (me) ->
      return unless me

      params.hull_app_name  = config?.data?.app?.name
      require('analytics').track(event, params)

    trackAction = (response)->
      return unless track = response.headers['Hull-Track']
      try
        [eventName, trackParams] = JSON.parse(atob(track))
        doTrack(eventName, trackParams)
