def METHOD_NAME(self, data, pause_duration=None, timeout=180, error_pause_duration=None):
    """Send a request to the Overpass API via HTTP POST and return the JSON response.
    :Arguments:
        **data**(:obj:`dict` or `OrderedDict`): key-value pairs of parameters to post to the API
        **pause_duration** (:obj:`int`): how long to pause in seconds before requests, if None, will query API
        status endpoint to find when next slot is available
        **timeout** (:obj:`int`): the timeout interval for the requests library
        **error_pause_duration**(:obj:`int`): how long to pause in seconds before re-trying requests if error
    :Returns:
        :obj:`dict`
    """
    # define the Overpass API URL, then construct a GET-style URL as a string to
    url = self.overpass_endpoint.rstrip("/") + "/interpreter"
    if pause_duration is None:
        time.sleep(self.sleeptime)
    start_time = time.time()
    self.report.append(f'Posting to {url} with timeout={timeout}, "{data}"')
    self.logger.debug(f'Posting to {url} with timeout={timeout}, "{data}"')
    response = requests.post(url, data=data, timeout=timeout, headers=http_headers)
    # get the response size and the domain, log result
    size_kb = len(response.content) / 1000.0
    domain = re.findall(r"(?s)//(.*?)/", url)[0]
    msg = "Downloaded {:,.1f}KB from {} in {:,.2f} seconds".format(size_kb, domain, time.time() - start_time)
    self.report.append(msg)
    self.logger.info(msg)
    try:
        response_json = response.json()
        if "remark" in response_json:
            msg = f'Server remark: "{response_json["remark"]}"'
            self.report.append(msg)
            self.logger.info(msg)
    except Exception:
        # 429 is 'too many requests' and 504 is 'gateway timeout' from server
        # overload - handle these errors by recursively calling
        # overpass_request until we get a valid response
        if response.status_code in [429, 504]:
            # pause for error_pause_duration seconds before re-trying request
            if error_pause_duration is None:
                error_pause_duration = self.sleeptime + 1
            msg = "Server at {} returned status code {} and no JSON data. Re-trying request in {:.2f} seconds.".format(
                domain, response.status_code, error_pause_duration
            )
            self.report.append(msg)
            self.logger.info(msg)
            time.sleep(error_pause_duration)
            response_json = self.METHOD_NAME(data=data, pause_duration=pause_duration, timeout=timeout)
        # else, this was an unhandled status_code, throw an exception
        else:
            self.report.append(f"Server at {domain} returned status code {response.status_code} and no JSON data")
            raise Exception(f"Server returned no JSON data.\n{response} {response.reason}\n{response.text}")
    return response_json