Calcular o carrinho
Calcula subtotal, descontos de promoção e cupom, frete, impostos e total do carrinho, com o detalhe por item e por seller.
Esta é a rota que responde "quanto vai custar?". Ela roda o mesmo cálculo que o checkout e o pedido usam: aplica promoções de catálogo e de carrinho, cupons, kits, vale-presente, frete e impostos sobre as linhas do carrinho e devolve os valores prontos para exibir. Chame depois de cada mudança no carrinho, quando o CEP for digitado e quando o comprador escolher uma forma de entrega.
A rota não altera o carrinho nem grava nada: é uma simulação. O carrinho é sempre o do próprio comprador (token ou X-Session-ID); o corpo não aceita cart_id, justamente para ninguém calcular o carrinho de outra pessoa.
/api/v1/storefront/cart/calculateAutenticadaCalcula os totais, descontos e frete do carrinho
Cabeçalhos
AuthorizationstringBearer <token> do cliente logado. Com token, grupos de cliente e preços B2B entram no cálculo.X-Session-IDstringCorpo da requisição
shipping_method_iduuidshipping_selectionsarrayshipping_method_id.shipping_selections[].vendor_iduuidobrigatórioshipping_selections[].shipping_method_iduuidobrigatórioshipping_selections[].service_codestringcoupon_codestringcoupon_codesarraydestination_postal_codestring400 invalid_postal_code.destination_statestringSP). Entra em regras de preço e imposto por estado.destination_city_codestringdestination_address_iduuiddestination_streetstringdestination_numberstringdestination_districtstringdestination_citystringgift_cert_codestringgift_cert_warning.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/storefront/cart/calculate" \
-H "X-Session-ID: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{
"shipping_method_id": "50000000-0000-0000-0000-000000000001",
"destination_postal_code": "01310-100",
"destination_state": "SP"
}'Resposta
{
"subtotal": 23000,
"discount": 5750,
"shipping": 0,
"tax": 0,
"total": 17250,
"items": [
{
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"name": "Notebook Slim Rosa 02373",
"quantity": 2,
"unit_price": 11500,
"subtotal": 23000,
"discount": 5750,
"tax": 0,
"total": 17250
}
],
"promotions": [
{ "promotion_id": "", "name": "Promoções de catálogo", "discount": 4600, "type": "catalog" },
{ "promotion_id": "c19df8c2-279f-46c3-81e4-d1e52aec733c", "name": "Progressiva 5% acima de R$ 100", "discount": 1150, "type": "percentage" },
{ "promotion_id": "", "name": "Frete grátis", "discount": 0, "type": "free_shipping" }
],
"vendors": [
{ "vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36", "shipping": 0, "weight": 600, "item_count": 1 }
],
"item_discount": 5750,
"order_discount": 0,
"tax_amount": 0,
"shipping_cost": 0,
"free_shipping": true
}Campos da resposta
subtotalintegerdiscountintegeritem_discountintegerdiscount vinda de promoções de catálogo e de item.order_discountintegerdiscount vinda de cupom.b2b_discountintegersubtotal e não é subtraída outra vez. Ausente quando é zero.shippingintegershipping_cost.taxintegertax_amount.totalintegersubtotal - discount + shipping + tax, nunca negativo.free_shippingbooleantrue quando alguma promoção ou cupom concede frete grátis.itemsarrayitems[].product_iduuiditems[].variation_idstringitems[].vendor_iduuiditems[].subtotalintegerunit_price vezes quantity, em centavos.items[].discountintegeritems[].taxintegeritems[].totalintegersubtotal - discount + tax da linha.promotionsarraypromotions[].promotion_idstringpromotions[].namestringpromotions[].discountintegerpromotions[].typestringcatalog, percentage, fixed, free_shipping, buy_x_get_y. Outros valores (como multi) podem aparecer; trate como texto livre.promotions[].coupon_codestringapplied_couponobjectcode, discount (centavos) e kind (coupon ou voucher). Ausente sem cupom.vendorsarrayvendor_id, shipping (centavos), weight (gramas) e item_count.removed_itemsarrayshipping_unavailablebooleantrue quando a forma de entrega escolhida não conseguiu cotar. Nesse caso shipping é 0 por falta de preço, não por ser grátis. Ausente quando false.gift_cert_codestringgift_cert_amountintegerdiscount e total.gift_cert_warningstringchange_linesarraychange_hooksobjectErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Sem token e sem X-Session-ID | {"error":"session_id or authentication required"} |
| 400 | Corpo que não é JSON | {"error":"invalid request body"} |
| 400 | CEP que não tem 8 dígitos válidos | {"error":"invalid_postal_code","detail":"..."} |
| 409 | A forma de entrega escolhida deixou de cotar para este carrinho | {"error":"shipping_requote_required","vendor_id":"...","detail":"..."} |
| 500 | Falha interna no cálculo | {"error":"failed to calculate cart","detail":"..."} |