def METHOD_NAME(self, method, path=None, url=None, **kwargs):
    if not self.__verified:
        self.__verified = self.check_access_token()
    if not url and path:
        url = '{}/{}'.format(self.base_url, path)
    LOGGER.info("URL: {} {}, Params: {}, JSON Body: {}".format(
        method,
        url,
        kwargs.get("params"),
        kwargs.get("json"),
    ))
    if 'endpoint' in kwargs:
        endpoint = kwargs['endpoint']
        del kwargs['endpoint']
    else:
        endpoint = None
    if 'headers' not in kwargs:
        kwargs['headers'] = {}
    kwargs['headers']['Authorization'] = 'Bearer {}'.format(self.__access_token)
    kwargs['headers']['Accept'] = 'application/json'
    kwargs['headers']['Intercom-Version'] = API_VERSION
    if self.__user_agent:
        kwargs['headers']['User-Agent'] = self.__user_agent
    if method == 'POST':
        kwargs['headers']['Content-Type'] = 'application/json'
    with metrics.http_request_timer(endpoint) as timer:
        response = self.__session.METHOD_NAME(method, url, timeout=self.__request_timeout, **kwargs)
        timer.tags[metrics.Tag.http_status_code] = response.status_code
    if response.status_code >= 500:
        raise Server5xxError()
    if response.status_code != 200:
        raise_for_error(response)
    return response.json()