Endereço, frete e pagamento
As três etapas obrigatórias da sessão de checkout, com os campos do endereço, a escolha do frete e a escolha da forma de pagamento.
Depois de abrir a sessão, grave três escolhas do comprador. Cada chamada é um PUT que substitui a escolha anterior daquela etapa e devolve a sessão inteira, com step, descontos e total recalculados pelo servidor. Você pode repetir uma etapa quantas vezes quiser (por exemplo, trocar o frete) antes de fechar o pedido.
A ordem natural é endereço, frete, pagamento: o endereço define quais fretes existem, e o frete e o pagamento mudam o total (frete, desconto PIX, juros). Um carrinho só com itens digitais não tem frete: depois do endereço a sessão vai direto para payment.
Gravar o endereço
/api/v1/storefront/checkout/{sessionId}/addressAutenticadaDefine o endereço de entrega e de cobrança e o documento fiscal do comprador
Grava o endereço de entrega, o de cobrança e o CPF ou CNPJ do comprador. Se você não mandar billing_address, a cobrança usa o mesmo endereço da entrega. A API também recalcula impostos e reavalia descontos que dependem do estado de destino (preço regional). Se um cupom aplicado deixa de valer com o novo endereço, ele é removido da sessão sem aviso, e o frete já escolhido é cotado de novo.
Parâmetros de caminho
sessionIduuidobrigatórioCorpo da requisição
shipping_addressobjectobrigatórioEndereço de entrega.
first_namestringobrigatóriolast_namestringphonestringaddress_line1stringobrigatórioaddress_line2stringnumberstringdistrictstringrequire_address_district.citystringobrigatóriostatestringobrigatórioSP).postal_codestringobrigatório00 nem ser 99999999.countrystringobrigatórioBR para o Brasil.address_iduuidbilling_addressobjectcpfstringobrigatóriodocument_type.Exemplo de requisição
curl -X PUT "$BASE_URL/api/v1/storefront/checkout/$CHECKOUT_ID/address" \
-H "X-Session-ID: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{
"shipping_address": {
"first_name": "Maria",
"last_name": "Souza",
"phone": "11987654321",
"address_line1": "Av Paulista, 1000",
"address_line2": "Apto 12",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"postal_code": "01310-100",
"country": "BR"
},
"cpf": "123.456.789-09"
}'Resposta
{
"id": "f9f26cde-bc64-4d49-ab14-e3fe35971432",
"cart_id": "caad0bcd-177e-47cc-a02a-0ad63a47ee21",
"is_guest": true,
"step": "shipping",
"shipping_address": {
"first_name": "Maria",
"last_name": "Souza",
"phone": "11987654321",
"address_line1": "Av Paulista, 1000",
"address_line2": "Apto 12",
"city": "São Paulo",
"state": "SP",
"postal_code": "01310-100",
"country": "BR",
"district": "Bela Vista"
},
"billing_address": { "first_name": "Maria", "address_line1": "Av Paulista, 1000", "postal_code": "01310-100" },
"shipping_method_id": null,
"shipping_cost": 0,
"subtotal": 30000,
"discount": 7500,
"tax": 0,
"total": 22500,
"cpf": "123.456.789-09",
"document_type": "cpf"
}A resposta é a sessão completa (campos descritos em Iniciar e ler); acima ela aparece encurtada. Quando a loja calcula impostos, vem também tax_breakdown com ICMS, ISS, IPI, PIS e COFINS por produto.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Campo obrigatório vazio | {"error":"invalid shipping address: address_line1 is required"} (idem first_name, city, state, postal_code, country) |
| 400 | CEP inválido | {"error":"invalid shipping address: ..."} |
| 400 | Sem cpf | {"error":"cpf is required"} |
| 400 | CPF/CNPJ com dígitos inválidos | {"error":"invalid document (CPF/CNPJ): 111"} |
| 404 | Sessão inexistente ou de outro dono | {"error":"checkout session not found"} |
| 422 | A loja ativou a política de endereço e o endereço a viola | {"error":"address_number_required","message":"Informe o número do endereço no campo Número (use \"S/N\" se o imóvel não tiver número)."} |
Os códigos 422 possíveis são address_number_required, address_number_in_street (o número está colado na rua e precisa ir para o campo de número), address_district_required e address_cep_mismatch (o CEP pertence a outra cidade, UF ou bairro). A message vem em português. Em address_number_in_street e address_cep_mismatch há também params com os detalhes para você montar a sua mensagem.
Escolher o frete
/api/v1/storefront/checkout/{sessionId}/shippingAutenticadaEscolhe a forma de envio
Escolhe um dos fretes de available_shipping. O servidor cota o frete de novo com o endereço e os itens da sessão e grava o custo real. Se o cupom aplicado dá frete grátis para esse método, ou se a retirada em loja é escolhida, o custo vira 0. A API também calcula a data prometida de entrega (promised_delivery_date, YYYY-MM-DD) quando a loja usa janela de entrega.
Exige que o endereço já tenha sido gravado.
Parâmetros de caminho
sessionIduuidobrigatórioCorpo da requisição
shipping_method_iduuidobrigatórioavailable_shipping[].id). Obrigatório, a menos que use vendor_selections.service_codestringPAC, SEDEX...) quando o método é um agregador que oferece vários. Obrigatório quando o método é ambíguo.vendor_selectionsarrayUm frete por seller, para sacolas de vários sellers sem frete em comum. Quando enviado, substitui shipping_method_id e service_code. É preciso um item para cada seller do carrinho, sem repetir.
vendor_idstringobrigatório_marketplace para os itens da própria loja.method_iduuidobrigatórioservice_codestringpickup_warehouse_iduuid0 e uma retirada é registrada ao fechar o pedido. Não vale junto com vendor_selections.delivery_slot_iduuidshipping_costintegerExemplo de requisição
curl -X PUT "$BASE_URL/api/v1/storefront/checkout/$CHECKOUT_ID/shipping" \
-H "X-Session-ID: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{
"shipping_method_id": "50000000-0000-0000-0000-000000000001"
}'Resposta
{
"id": "f9f26cde-bc64-4d49-ab14-e3fe35971432",
"step": "payment",
"shipping_method_id": "50000000-0000-0000-0000-000000000001",
"shipping_cost": 0,
"promised_delivery_date": "2026-10-27",
"promised_shipping_method": "Entrega Padrão",
"subtotal": 30000,
"discount": 7500,
"total": 22500
}Campos novos na sessão
shipping_method_iduuidshipping_costintegerpromised_delivery_datestringYYYY-MM-DD. Ausente quando a loja não usa janela de entrega. É congelada no pedido.promised_shipping_methodstringshipping_service_codestringErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Sem shipping_method_id | {"error":"shipping_method_id is required"} |
| 400 | Frete que não existe | {"error":"shipping method not found: 0000..."} |
| 400 | Frete grátis acima de um valor e o pedido não chegou nele | {"error":"shipping method not available for this order total: ..."} |
| 400 | Endereço ainda não gravado | {"error":"shipping_requote_required: shipping address is required"} |
| 400 | O frete não atende o endereço ou o serviço sumiu | {"error":"shipping_requote_required: selected shipping method or service is no longer available"} |
| 400 | Método com vários serviços sem service_code | {"error":"shipping_requote_required: service_code is required for ambiguous shipping method"} |
| 404 | Sessão inexistente ou de outro dono | {"error":"checkout session not found"} |
Escolher o pagamento
/api/v1/storefront/checkout/{sessionId}/paymentAutenticadaEscolhe a forma de pagamento
Escolhe a forma de pagamento pelo code listado em available_payment. A API confere se ela está ativa, se vale para os sellers e o grupo do comprador, e se o total respeita o mínimo e o máximo da forma. Em seguida recalcula: PIX ganha o desconto da loja (pix_discount), formas com taxa ou desconto próprio entram em payment_adjustment, e o plano de Boleto Faturado soma o acréscimo do plano.
Esta rota não cobra nada. Ela só registra a escolha; a cobrança acontece no fechamento do pedido.
Parâmetros de caminho
sessionIduuidobrigatórioCorpo da requisição
payment_methodstringobrigatórioavailable_payment[].code), por exemplo pix ou credit_card.invoiced_plan_iduuidpayment_profile_iduuidExemplo de requisição
curl -X PUT "$BASE_URL/api/v1/storefront/checkout/$CHECKOUT_ID/payment" \
-H "X-Session-ID: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{
"payment_method": "pix"
}'Resposta
{
"id": "f9f26cde-bc64-4d49-ab14-e3fe35971432",
"step": "review",
"payment_method": "pix",
"payment_method_id": "02000000-0000-0000-0000-000000000001",
"subtotal": 30000,
"discount": 7500,
"pix_discount": 1125,
"total": 21375
}Campos novos na sessão
payment_methodstringpayment_method_iduuidpix_discountintegerpayment_adjustmentintegerinvoiced_plan_surchargeintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Sem payment_method | {"error":"payment_method is required"} |
| 400 | Código que não existe ou não vale para este carrinho | {"error":"payment method not found: nope"} |
| 400 | Forma desativada | {"error":"payment method \"pix\" is not active (status: D)"} |
| 400 | Total abaixo do mínimo da forma | {"error":"order amount 900 is below the minimum 1000 for payment method \"pix\""} |
| 400 | Total acima do máximo da forma | {"error":"order amount ... exceeds the maximum ... for payment method \"...\""} |
| 400 | Plano de Boleto Faturado inexistente ou desativado | {"error":"invoiced installment plan \"...\" not found for payment method \"...\""} |
| 404 | Sessão inexistente ou de outro dono | {"error":"checkout session not found"} |