docs: def api_handler(input_data, cloud, api, url_params=None, batch_size=None, **kwargs):
      """
      Sends finalized request data to ML server and receives response.
      If a batch_size is specified, breaks down a request into smaller
      component requests and aggregates the results.
      """
      url_params = url_params or {}
      input_data = standardize_input_data(input_data)
  
      cloud = cloud or config.cloud
      host = "%s.indico.domains" % cloud if cloud else config.host
  
      # LOCAL DEPLOYMENTS
      if not (host.endswith('indico.domains') or host.endswith('indico.io')):
          url_protocol = "http"
      else:
          url_protocol = config.url_protocol
  
      headers = dict(JSON_HEADERS)
      headers["X-ApiKey"] = url_params.get("api_key") or config.api_key
      url = create_url(url_protocol, host, api, dict(kwargs, **url_params))
      return collect_api_results(input_data, url, headers, api, batch_size, kwargs)