Carrinho
Como o carrinho da vitrine funciona, quem o identifica, como os totais são calculados e o mapa de todas as rotas do carrinho.
O carrinho guarda o que o comprador pretende levar antes de fechar o pedido: os itens, as quantidades, o cupom digitado e o resumo de valores. Ele existe para o cliente logado e também para o visitante que ainda não tem conta. Quando a compra é finalizada, o carrinho vira um checkout e depois um pedido.
Esta seção cobre tudo o que acontece antes do checkout: montar o carrinho, alterar linhas, calcular totais com promoções e frete, aplicar cupom, importar uma planilha de itens e recuperar um carrinho abandonado.
Como funciona
O carrinho é criado sozinho na primeira chamada: GET /cart para um visitante novo devolve um carrinho vazio e já o grava. Ele expira cerca de 30 dias depois de criado (expires_at).
- Identifique o comprador
Gere um identificador de visitante (um UUID v4 aleatório) e guarde no navegador ou no app. Envie em todas as chamadas como
X-Session-ID. Se o cliente fizer login, envie também o token: o token passa a valer e oX-Session-IDdeixa de identificar o carrinho. - Adicione itens
Adicionar itens devolve o carrinho inteiro já atualizado. Cada chamada aplica as regras do produto: estoque, quantidade mínima, máxima e múltiplo.
- Mostre os valores
Chame Calcular o carrinho a cada mudança para obter desconto, frete e total corretos. Chame Aplicar cupom quando o comprador digitar um código.
- Depois do login, una os carrinhos
O visitante que entra na conta traz um carrinho de visitante. Unir carrinhos passa as linhas dele para o carrinho da conta.
- Siga para o checkout
Com o carrinho pronto, abra a sessão em Iniciar o checkout.
Conceitos-chave
Cliente, visitante e chave de API
| Quem chama | Como se identifica | Observação |
|---|---|---|
| Cliente logado | Authorization: Bearer <token> | O carrinho pertence ao usuário e acompanha o cliente entre aparelhos. |
| Visitante | X-Session-ID: <uuid> | O identificador é uma credencial: quem o conhece manipula o carrinho. Use um UUID aleatório e longo. |
| Integração com chave de API | X-API-Key ou Bearer sfk_... | A chave precisa do escopo storefront:write. Com esse escopo ela pode montar carrinho de visitante mesmo que a loja não aceite carrinho de visitante. |
A loja pode exigir login para comprar. Se allow_guest_cart estiver desligado (veja Configurações do checkout), o visitante recebe 401 ao tentar adicionar um item.
Totais do carrinho e totais calculados
O objeto do carrinho traz subtotal, discount_total, shipping_total, tax_total e total, mas esses campos refletem só a soma dos itens. Promoções automáticas, cupom, frete e impostos entram apenas na resposta de Calcular o carrinho, que é a fonte para exibir o total ao comprador.
Campos de compatibilidade nas respostas
As respostas do carrinho repetem alguns valores em formatos antigos, para clientes escritos para a plataforma anterior: cart_id (igual a id), subtotal_str e total_str (valores em string decimal, "230.00"), timestamp (Unix) e, em cada item, id, item_id (iguais a product_id), amount (igual a quantity), price_str e subtotal_str. Em integrações novas, ignore esses campos e use os de centavos.
Carrinho de filial (compra B2B)
Quem compra por uma filial de empresa envia X-Organization-Branch-Id com o UUID da filial. O carrinho passa a ser o da filial. Um valor que não é UUID devolve 400 invalid_branch e uma filial que o usuário não pode usar devolve 403 branch_forbidden.
Cache
As rotas de /cart respondem com Cache-Control: no-store. Não coloque um CDN na frente delas.
Rotas
| Método | Caminho | Para que serve | Autenticação |
|---|---|---|---|
| GET | /api/v1/storefront/cart | Ler o carrinho | Cliente ou visitante |
| GET | /api/v1/storefront/cart/summary | Resumo leve para o mini-carrinho | Cliente ou visitante |
| DELETE | /api/v1/storefront/cart | Esvaziar o carrinho | Cliente ou visitante |
| POST | /api/v1/storefront/cart/items | Adicionar um item | Cliente ou visitante |
| POST | /api/v1/storefront/cart/bulk | Adicionar vários itens | Cliente ou visitante |
| POST | /api/v1/storefront/cart/add-bundle | Adicionar um kit | Cliente ou visitante |
| POST | /api/v1/storefront/cart/items/batch | Adicionar um mix de produtos | Cliente ou visitante |
| PUT, PATCH | /api/v1/storefront/cart/items/{productId} | Alterar a quantidade de uma linha | Cliente ou visitante |
| DELETE | /api/v1/storefront/cart/items/{productId} | Remover uma linha | Cliente ou visitante |
| POST | /api/v1/storefront/cart/calculate | Calcular totais, promoções e frete | Cliente ou visitante |
| POST | /api/v1/storefront/cart/coupon | Aplicar cupom | Cliente ou visitante |
| DELETE | /api/v1/storefront/cart/coupon | Remover cupom | Cliente ou visitante |
| POST | /api/v1/storefront/cart/merge | Unir o carrinho de visitante ao da conta | Cliente |
| POST | /api/v1/storefront/cart/reorder/{orderId} | Comprar de novo um pedido | Cliente |
| GET | /api/v1/storefront/bulk-cart/template | Baixar a planilha modelo | Pública |
| POST | /api/v1/storefront/bulk-cart/parse | Ler uma planilha de itens | Pública |
| GET | /api/v1/storefront/recover-cart/{token} | Consultar um carrinho abandonado | Pública |
| POST | /api/v1/storefront/cart/restore-from-recovery | Restaurar um carrinho abandonado | Cliente ou visitante |
Erros comuns
- Esquecer o
X-Session-ID. Sem token e sem o cabeçalho, toda rota do carrinho devolve400 session_id or authentication required. - Trocar de
X-Session-IDa cada página. Cada valor novo cria um carrinho vazio novo. Gere o identificador uma vez e reaproveite. - Exibir
totaldo carrinho como valor final. Esse campo ignora promoções, cupom e frete. Use o resultado de Calcular o carrinho. - Enviar
quantityzero ao adicionar. Adicionar exige quantidade maior que zero (400 quantity must be positive). Para tirar uma linha, use Remover uma linha. - Tratar
500ao adicionar produto inexistente como falha do servidor. Umproduct_idque não existe ou está inativo hoje devolve500 failed to add item, com a causa emdetail. Valide o id antes. - Confiar no preço guardado na linha. O preço é recalculado no checkout; se mudou, o pedido é recusado com
price_changede o comprador precisa revisar o total.