docs: function(network, options) {
        // This does not work with Node.JS, or unrecognized services.
        if (isNode) NotSupported();
        options = opts(this, options);
        options.applevel = true;
  
        var challenge = uuid(), self = this;
        var apicall = new APICall({
          action: 'account/social/login/status/'+challenge,
          options: options,
          later: true,
          processResponse: function(data) {
            if (data.finished) {
              self.options.session_token = data.session_token;
              self.options.userid = data.profile.__id__;
              data = { success: data }
            }
            else {
              self.options.session_token = null;
              self.options.userid = null;
              data = { errors: [ "Login unsuccessful." ] }
            }
  
            if (options.savelogin) {
              store('session_token', data.success.session_token, self.options.appid);
              store('userid', data.success.profile.__id__, self.options.appid);
            }
  
            return data;
          }
        });
  
        var url = this.options.apiroot+"/v1/app/"+options.appid+"/account/social/login";
  
        var urlParams = {
          service: network,
          apikey: options.apikey,
          challenge: challenge
        };
  
        if (this.options.session_token && options.link !== false) {
          urlParams.session_token = this.options.session_token;
        }
  
        if (options.scope) urlParams.scope = options.scope;
  
        var sep = url.indexOf("?") === -1 ? "?" : "&";
        url = url + sep + stringify(urlParams);
  
        var win = window.open(url, challenge, "width=600,height=400,menubar=0,location=0,toolbar=0,status=0");
  
        function checkOpen() {
          if (win.closed) {
            clearTimeout(checkOpen.interval);
            apicall.done();
          }
        }
        checkOpen.interval = setInterval(checkOpen, 50);
  
        return apicall;
      }