Passos do checkout
Define o endereço e o documento, a forma de envio e a forma de pagamento de uma sessão de checkout.
Depois de abrir a sessão, três PUT a preenchem: endereço (com CPF ou CNPJ), frete e pagamento. A ordem importa: o frete depende do endereço, e o desconto do PIX depende do pagamento. Cada chamada devolve a sessão inteira, já com o total recalculado, e avança o step: address → shipping → payment → review.
Todas pedem ser o dono da sessão (JWT do cliente ou o mesmo X-Session-ID do visitante).
Endereço e documento
/api/storefront/checkout/{sessionId}/addressClienteDefinir endereço de entrega e documento
Grava o endereço de entrega, o de cobrança (igual ao de entrega se omitido) e o documento fiscal. Calcula impostos e ajustes de preço por estado para o destino, e leva a sessão ao passo shipping.
Parâmetros de caminho
sessionIduuidobrigatórioCorpo da requisição
shipping_addressobjectobrigatórioEndereço de entrega.
first_namestringobrigatóriolast_namestringphonestringaddress_line1stringobrigatórioaddress_line2stringnumberstringdistrictstringcitystringobrigatóriostatestringobrigatórioSP).postal_codestringobrigatório00000000 é recusado.countrystringobrigatórioBR).address_iduuidbilling_addressobjectcpfstringobrigatório123.456.789-09). A resposta informa em document_type se foi lido como cpf ou cnpj.Forma de envio
/api/storefront/checkout/{sessionId}/shippingClienteEscolher a forma de envio
Escolhe uma das opções de available_shipping do resumo. O servidor cota o frete sozinho para o destino; o valor entra em shipping_cost e no total. Leva a sessão ao passo payment.
Corpo da requisição
shipping_method_iduuidobrigatórioid da forma de envio, de available_shipping.service_codestringPAC, SEDEX). Vazio escolhe a única tarifa do método.vendor_selectionsarrayEscolha uma forma por seller, para carrinhos com vários sellers que não têm um método em comum. Quando vem, substitui shipping_method_id e service_code.
vendor_idstringobrigatório_marketplace para os itens da própria loja.method_iduuidobrigatórioservice_codestringpickup_warehouse_iduuid0 e um agendamento de retirada é criado ao fechar o pedido.delivery_slot_iduuidshipping_costintegerForma de pagamento
/api/storefront/checkout/{sessionId}/paymentClienteEscolher a forma de pagamento
Escolhe uma das opções de available_payment. Recalcula o total (desconto do PIX, acréscimo de parcelamento ou de plano faturado) e leva a sessão ao passo review. Nenhuma cobrança acontece aqui: o pagamento só começa ao fechar o pedido.
Corpo da requisição
payment_methodstringobrigatóriocode da forma de pagamento, de available_payment (pix, credit_card...).payment_profile_iduuidinvoiced_plan_iduuidExemplo de requisição
H='-H X-Session-ID:'"$VISITOR_ID"' -H Content-Type:application/json'
curl -X PUT "$BASE_URL/api/storefront/checkout/$SESSION_ID/address" $H -d '{
"shipping_address": {
"first_name": "Maria", "last_name": "Souza", "phone": "11999990000",
"address_line1": "Avenida Paulista, 1000", "address_line2": "Apto 12",
"number": "1000", "district": "Bela Vista",
"city": "São Paulo", "state": "SP", "postal_code": "01310-100", "country": "BR"
},
"cpf": "123.456.789-09"
}'
curl -X PUT "$BASE_URL/api/storefront/checkout/$SESSION_ID/shipping" $H \
-d '{"shipping_method_id":"50000000-0000-0000-0000-000000000001"}'
curl -X PUT "$BASE_URL/api/storefront/checkout/$SESSION_ID/payment" $H \
-d '{"payment_method":"pix"}'Resposta
{
"id": "bcc7b882-448e-4b50-b870-41521b747889",
"step": "review",
"shipping_address": {
"first_name": "Maria", "last_name": "Souza", "phone": "11999990000",
"address_line1": "Avenida Paulista, 1000", "address_line2": "Apto 12",
"number": "1000", "district": "Bela Vista",
"city": "São Paulo", "state": "SP", "postal_code": "01310-100", "country": "BR"
},
"shipping_method_id": "50000000-0000-0000-0000-000000000001",
"shipping_cost": 0,
"payment_method": "pix",
"payment_method_id": "02000000-0000-0000-0000-000000000001",
"subtotal": 30000,
"discount": 7500,
"pix_discount": 1125,
"tax": 0,
"total": 21375,
"cpf": "123.456.789-09",
"document_type": "cpf",
"promised_delivery_date": "2026-10-27",
"promised_shipping_method": "Entrega Padrão"
}A resposta é a sessão descrita em Iniciar checkout. Neste exemplo o total é subtotal - discount - pix_discount (30000 - 7500 - 1125 = 21375), porque o frete saiu grátis por promoção automática.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo inválido | {"error": "invalid request body"} |
| 400 | Campo de endereço obrigatório ausente | {"error": "invalid shipping address: first_name is required"} (também address_line1, city, state, postal_code, country) |
| 400 | CEP brasileiro que não tem 8 dígitos ou é sentinela | mensagem do CEP inválido |
| 400 | Documento ausente ou inválido | {"error": "cpf is required"} ou {"error": "invalid document (CPF/CNPJ): 123"} |
| 400 | shipping_method_id ausente | {"error": "shipping_method_id is required"} |
| 400 | Forma de envio desconhecida | {"error": "shipping method not found: <id>"} |
| 400 | payment_method ausente | {"error": "payment_method is required"} |
| 400 | Forma de pagamento desconhecida, inativa ou fora do valor mínimo ou máximo | {"error": "payment method not found: nope"}, payment method "x" is not active (status: D) ou order amount N is below the minimum M for payment method "x" |
| 403 | Chave sfk_ ou token vat_ sem o escopo | {"error": "missing_scope", "required": "..."} |
| 404 | Sessão inexistente ou de outra pessoa | {"error": "checkout session not found"} |
| 422 | Política de endereço da loja recusou o endereço | {"error": "address_number_required", "message": "...", "params": {...}} |
Em um carrinho só com produtos digitais (sem entrega), os campos de endereço não são conferidos.
Os códigos 422 de política de endereço são address_number_required, address_number_in_street, address_district_required e address_cep_mismatch. Só aparecem em lojas que ligaram a política.