code: def _make_request(self, endpoint, params):
          
          # params = {
          #     **self._base_params,  # Mind order to allow params to overwrite base params
          #     **params
          # }
          full_params = self._base_params.copy()
          full_params.update(params)
          try:
              r = requests.get(endpoint, full_params)
              data = r.json()
              if r.status_code == 401 and not endpoint.endswith('lookup'):
                  raise exceptions.UnauthorizedKeyError
              elif r.status_code == 400 and not endpoint.endswith('shorten'):
                  raise exceptions.BadApiRequest
              elif r.status_code == 500:
                  raise exceptions.ServerOrConnectionError
              return data, r
          except ValueError as e:
              raise exceptions.BadApiResponse(e)
          except requests.RequestException:
              raise exceptions.ServerOrConnectionError
docs: Prepares the request and catches common errors and returns tuple of data and the request response.
  
          Read more about error codes: https://docs.polrproject.org/en/latest/developer-guide/api/#http-error-codes
  
          :param endpoint: full endpoint url
          :type endpoint: str
          :param params: parameters for the given endpoint
          :type params: dict
          :return: Tuple of response data, and the response instance
          :rtype: dict, requests.Response