We use a popular shipping service here in Brazil called Melhor Envio, so to get the shipping costs from their api, we had already implemented a shipping calculator and configured it in the initializer: config.environment.calculators.shipping_methods << 'Spree:CalculatorShipping:MelhorEnvio'
This is were we are firing off the api requests to Melhor Envio and getting the estimated shipping costs back, that we return in our implementation of compute_package. If there is a more adequate place to put the api calls, please suggest it. We want our implementation to be as in line with the Solidus way as possible. To get the delivery time estimate displayed to the customer, we have also implemented a compute_package_delivery_time method that (currently) repeats the api call and returns the delivery time. So then our overridden calculate_shipping_rates method from Spree:Stock:Estimator calls compute_package and, if the shipping method responds to compute_package_delivery_time, calls it as well and fills in the delivery_time column for that ShippingRate.