async public Task <TaxRatesResponse> GetTaxRatesForLocation(TaxRatesRequest taxRateRequest)
        {
            if (taxRateRequest == null)
            {
                throw new ArgumentNullException("taxRateRequest");
            }

            if (string.IsNullOrWhiteSpace(taxRateRequest.Zip))
            {
                throw new ArgumentException("Param Zip is required for US.", nameof(taxRateRequest));
            }

            try
            {
                var taxRateRequestUri = BuildTaxRateRequestUri(taxRateRequest);

                var taxRateJarResponse = await TaxJarHttpClientProvider.GetAsync <TaxRatesJarResponse>(taxRateRequestUri, Constants.API_KEY);

                return(taxRateJarResponse.Rate);
            }
            catch (Exception ex)
            {
                throw new TaxCalculatorException(ex.Message);
            }
        }
        async public Task <TaxesResponse> GetTaxesForOrder(TaxesRequest taxesRequest)
        {
            if (taxesRequest == null)
            {
                throw new ArgumentNullException("taxesRequest");
            }

            if (string.IsNullOrWhiteSpace(taxesRequest.ToCountry))
            {
                throw new ArgumentException("Param ToCountry is required.", nameof(taxesRequest));
            }

            if (string.IsNullOrWhiteSpace(taxesRequest.ToZip))
            {
                if (taxesRequest.ToCountry == Constants.COUNTRY_CODE_US)
                {
                    throw new ArgumentException("Param ToZip is required for US.", nameof(taxesRequest));
                }
            }

            if (string.IsNullOrWhiteSpace(taxesRequest.ToState))
            {
                if (taxesRequest.ToCountry == Constants.COUNTRY_CODE_US ||
                    taxesRequest.ToCountry == Constants.COUNTRY_CODE_CANADA)
                {
                    throw new ArgumentException("Param ToState is required for US and CA.", nameof(taxesRequest));
                }
            }

            // TODO: Finish all other possible validations as per api doc: https://developers.taxjar.com/api/reference/#post-calculate-sales-tax-for-an-order

            try
            {
                var taxesResponse = await TaxJarHttpClientProvider.PostAsync <TaxesJarResponse, TaxesRequest>("taxes", taxesRequest, Constants.API_KEY);

                return(taxesResponse.Tax);
            }
            catch (Exception ex)
            {
                throw new TaxCalculatorException(ex.Message);
            }
        }