Cotar frete
Cota o frete de um carrinho para um CEP, consolidado ou separado por seller.
Esta é a cotação oficial: a mesma regra que o checkout usa ao fechar o pedido. Ela olha a lista de métodos, as áreas de tarifa e os grupos de clientes, consulta as transportadoras em tempo real quando o método é desse tipo e devolve o preço e o prazo de cada opção.
Se você só quer "quanto custa o frete para este CEP" numa página de produto, Estimativa de frete é mais simples.
Cotação consolidada
/api/v1/storefront/shipping/calculatePúblicaCota o frete do carrinho
Devolve os métodos de envio que servem para o carrinho inteiro, com o custo total de cada um. Se o carrinho tem itens de mais de um seller, só aparecem os métodos que todos os sellers oferecem, e o custo é a soma.
Corpo da requisição
postal_codestringobrigatório400 shipping_location_required, a não ser que mande a localização por outros campos).itemsobject[]obrigatórioitems[].product_iduuidobrigatórioitems[].quantityintegerobrigatórionull dão 400 invalid_quantity.items[].vendor_iduuiditems[].priceintegeritems[].weightintegeritems[].widthintegeritems[].heightintegeritems[].lengthintegeritems[].free_shippingbooleancart_totalintegercountry_codestringBR). Opcional.state_codestringcity_iduuiddistrict_iduuidcitystringdistrictstringlatnumberlngnumberaddress_iduuidstreetstringnumberstringaddress_districtstringaddress_citystringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/storefront/shipping/calculate" \
-H "Content-Type: application/json" \
-d '{
"postal_code": "01310-100",
"items": [
{
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"quantity": 2
}
]
}'Resposta
{
"rates": [
{
"method_id": "85e87a54-dcee-4947-8cfa-f6406f2f3cbb",
"method_display_id": 53,
"method_name": "Motoboy",
"method_code": "motoboy_msdxztz7",
"cost": 500,
"estimated_days": 0,
"min_delivery_days": 0,
"max_delivery_days": 0,
"delivery_time": "30 min",
"free_shipping": false,
"is_pickup": false
},
{
"method_id": "50000000-0000-0000-0000-000000000001",
"method_display_id": 5,
"method_name": "Entrega Padrão",
"method_code": "standard",
"cost": 1000,
"estimated_days": 10,
"min_delivery_days": 10,
"max_delivery_days": 10,
"delivery_time": "7-10 dias úteis",
"free_shipping": false,
"is_pickup": false
}
],
"postal_code": "01310100",
"weight": 0
}Campos da resposta
ratesobject[]unavailable).rates[].method_iduuidrates[].method_display_idintegerrates[].method_namestringrates[].method_codestringrates[].costinteger0 é frete grátis.rates[].carrier_costintegercost.rates[].estimated_daysinteger0 quando é imediato ou não informado.rates[].min_delivery_daysintegerrates[].max_delivery_daysintegerrates[].delivery_timestring7-10 dias úteis). Ausente quando não há texto.rates[].free_shippingbooleantrue quando o frete saiu grátis (regra do método, produto ou promoção).rates[].is_pickupbooleantrue quando é retirada em loja, não entrega.rates[].is_fallbackbooleantrue) quando o preço é uma estimativa porque a transportadora não respondeu. Mostre "frete estimado".rates[].delivery_estimatedbooleantrue) quando o preço é da transportadora, mas o prazo é o configurado no método, não uma promessa dela.rates[].service_codestringmethod_id ao escolher.rates[].carrierstringrates[].quote_idstringrates[].volume_countintegerrates[].icon_urlstringpostal_codestringweightintegerno_shipping_requiredbooleantrue (e rates vazio) quando todos os itens são digitais: não há frete a cobrar.selected_method_iduuidunavailableobject[]unavailable[].method_iduuidunavailable[].method_namestringunavailable[].codestringproduct_without_weight, product_without_dimensions, package_over_limit, route_not_served, service_not_in_contract, delivery_time_refused, invalid_postal_code, carrier_not_configured, carrier_unavailable, quote_refused, declared_value_out_of_range, outside_delivery_area, address_not_located.unavailable[].messagestringcode em outros idiomas.unavailable[].reasonstringpackage_split_required, volume_limit_exceeded).Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON. | {"error":"invalid request body","detail":"..."} |
| 400 | Carrinho sem itens. | {"error":"at least one item is required"} |
| 400 | Quantidade zero, negativa ou nula. | {"error":"invalid_quantity","detail":"items[0].quantity must be a positive whole number"} |
| 400 | CEP malformado ou sentinela (00000000, 99999999). | {"error":"invalid_postal_code","detail":"invalid CEP: expected 8 digits (e.g. 01310-100)"} |
| 400 | Produto físico sem CEP nem localização. | {"error":"shipping_location_required","detail":"postal_code or location fields are required for physical products"} |
| 500 | product_id que não é UUID, produto inexistente ou apagado, ou falha interna. | {"error":"failed to calculate shipping rates","detail":"product ... is unavailable for shipping"} |
Cotação por seller
/api/v1/storefront/shipping/calculate-by-vendorPúblicaCota o frete separado por seller
Mesmo corpo, mas a resposta traz um grupo por seller, cada um com os seus itens e os seus métodos. É a cotação do checkout de marketplace, em que o cliente escolhe um método por seller.
Corpo da requisição
(mesmos campos de /shipping/calculate)objectExemplo de requisição
curl -X POST "$BASE_URL/api/v1/storefront/shipping/calculate-by-vendor" \
-H "Content-Type: application/json" \
-d '{
"postal_code": "01310-100",
"items": [
{
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"quantity": 2
}
]
}'Resposta
{
"vendors": [
{
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"vendor_name": "Loja Seller Teste",
"items": [
{
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"quantity": 2,
"price": 30000,
"weight": 0,
"width": 0,
"height": 0,
"length": 0,
"free_shipping": false
}
],
"rates": [
{
"method_id": "85e87a54-dcee-4947-8cfa-f6406f2f3cbb",
"method_display_id": 53,
"method_name": "Motoboy",
"method_code": "motoboy_msdxztz7",
"cost": 500,
"estimated_days": 0,
"min_delivery_days": 0,
"max_delivery_days": 0,
"delivery_time": "30 min",
"free_shipping": false,
"is_pickup": false
}
],
"weight": 0
}
],
"postal_code": "01310100"
}Campos da resposta
vendorsobject[]vendors[].vendor_idstring_marketplace para itens da loja.vendors[].vendor_namestringvendors[].itemsobject[]vendors[].ratesobject[]rates[] da cotação consolidada.vendors[].weightintegervendors[].unavailableobject[]postal_codestringno_shipping_requiredbooleantrue quando tudo é digital.Erros
Os mesmos erros da cotação consolidada.