docs: def request(self, method, api_endpoint, **kwargs):
          """Wrapper for underlying :class:`requests.Session`
  
          Handles generating full API URL, session reuse and auth, request defaults, and invalid response status codes
  
          Used throughout library as the core underlying request/response method for all interactions with server
  
          Args:
              method (str): Request method (get, post, put, etc.)
              api_endpoint (str): Portion of URL matching API endpoint route as listed in platform /docs help page
              **kwargs (dict): Remaining arguments passed through to actual request call
  
          Notes:
              All other provided kwargs are passed to underlying :meth:`requests.Session.request()` call
  
          Raises:
              swimlane.exceptions.SwimlaneHTTP400Error: On 400 responses with additional context about the exception
              requests.HTTPError: Any other 4xx/5xx HTTP responses
  
          Returns:
              requests.Response: Successful response instances
  
          Examples:
  
              Request and parse server settings endpoint response
  
              >>> server_settings = swimlane.request('get', 'settings').json()
          """
          while api_endpoint.startswith('/'):
              api_endpoint = api_endpoint[1:]
  
          # Ensure a timeout is set
          kwargs.setdefault('timeout', self._default_timeout)
  
          # Manually grab and dump json data to have full control over serialization
          # Emulate default requests behavior
          json_data = kwargs.pop('json', None)
          if json_data is not None:
              headers = CaseInsensitiveDict(kwargs.get('headers', {}))
              headers.setdefault('Content-Type', 'application/json')
              kwargs['headers'] = headers
  
              kwargs['data'] = json.dumps(json_data, sort_keys=True, separators=(',', ':'))
  
          response = self._session.request(method, urljoin(str(self.host) + self._api_root, api_endpoint), **kwargs)
  
          # Roll 400 errors up into SwimlaneHTTP400Errors with specific Swimlane error code support
          try:
              response.raise_for_status()
          except requests.HTTPError as error:
              if error.response.status_code == 400:
                  raise SwimlaneHTTP400Error(error)
              else:
                  raise error
  
          return response