VenddorDocumentação API
API atualAPI legada
Guia rápidoReferência completa
Carregando índice…
API atual/Referência completa/Mini-loja WhatsApp: sacola e checkout

Fechar o pedido

Transforma a sacola em pedido e devolve como pagar (Pix, boleto, cartão, link ou pagamento na entrega).

POST /cart/{token}/checkout é o único passo que cria o pedido. Ele refaz no servidor tudo o que as rotas de revisão mostraram (frete, descontos, impostos, estoque, regras da loja) e só então grava. O que o navegador manda é conferido, nunca usado como preço.

Uma chamada bem-sucedida responde 200 com o pedido e, conforme a forma de pagamento, o que o cliente precisa para pagar: o código Pix, os dados do boleto, o resultado do cartão ou a indicação de que o pagamento é na entrega. Depois, o acompanhamento é pelas rotas de Pedidos.

Fechar o pedido

POST/api/v1/storefront/wa-coex/cart/{token}/checkoutPública

Cria o pedido a partir da sacola e inicia o pagamento

Ordem das conferências, útil para entender qual erro aparece primeiro: conta bloqueada ou aguardando aprovação, preço visível, conta obrigatória, loja aberta, linhas marcadas (line_ids), escolhas pendentes, termos aceitos, documento, código de confirmação, forma de pagamento, dados do cartão, frete e, por fim, a criação do pedido.

Cartão online é cobrado antes de o pedido existir. Se o cartão for recusado, nenhum pedido é criado e a sacola continua intacta. Se o pedido falhar depois de a cobrança passar, a cobrança é cancelada e a resposta traz card_voided.

Parâmetros de caminho

tokenstringobrigatório
Token da mini-loja.

Corpo da requisição

cpfstringobrigatório
CPF ou CNPJ do comprador, com ou sem pontuação, com dígitos válidos. Sempre obrigatório, mesmo para quem já tem conta. O nome do campo é cpf também para CNPJ.
addressobject

Endereço de entrega digitado. Use este ou saved_address_id.

streetstringobrigatório
Logradouro.
numberstringobrigatório
Número.
complementstring
Complemento.
districtstring
Bairro.
citystringobrigatório
Cidade.
statestringobrigatório
UF.
zipstringobrigatório
CEP.
recipientstring
Nome de quem recebe. Também vira o nome da conta criada pelo pedido.
saved_address_iduuid
Endereço da agenda do cliente, no lugar de address.
shipping_choicestring
choice da opção de entrega escolhida em /shipping. Com vários sellers, a lista ms:<vendor_key>=<choice>;.... O frete é recotado no servidor.
payment_methodstringobrigatório
code de uma forma de pagamento disponível (ou o apelido pix, boleto, card).
expected_total_centsinteger
Total que o cliente viu em /totals, em centavos. Se o total real for outro, o checkout recusa com 409 checkout_total_changed. Opcional, mas recomendado.
line_idsarray
item_id das linhas a pedir. Ausente pede a sacola inteira; o resto fica na sacola.
cardobject

Cartão, obrigatório quando a forma de pagamento é cartão online. Maquininha na entrega não usa.

card_tokenstring
Token do cartão gerado no navegador com a chave de /card-tokenization. Obrigatório para cartão novo quando o gateway é a Pagar.me.
holder_namestring
Nome impresso no cartão. Obrigatório para cartão novo.
instrument_idstring
Id de um cartão salvo. Dispensa os outros campos do cartão.
installmentsintegerpadrão: 1
Número de parcelas, de 1 a 12, entre as oferecidas pelo método.
save_cardbooleanpadrão: false
Guardar o cartão para a próxima compra. Só vale para cliente com conta.
plan_total_centsinteger
Total do plano de parcelas que o cliente viu, com juros. Com juros, a cobrança só ocorre se for exatamente este valor.
numberstring
Número do cartão. Só para gateways que aceitam cartão cru; na Pagar.me é recusado.
exp_monthstring
Mês de validade (gateways que aceitam cartão cru).
exp_yearstring
Ano de validade (gateways que aceitam cartão cru).
cvvstring
Código de segurança (gateways que aceitam cartão cru). Na Pagar.me é recusado.
create_accountboolean
Só tem efeito quando a loja permite comprar sem conta e oferece criá-la depois do pedido: true cria a conta com os dados do pedido, false compra como convidado, e ausente vale true. Em loja que exige conta, o pedido sempre usa ou cria a conta.
otpstring
Código de confirmação enviado ao WhatsApp do cliente. Dispensa nova prova de identidade quando o cliente tinha saído da conta.
invoiced_plan_idstring
Plano do boleto faturado, quando o método é faturado.
pickup_point_idstring
Ponto de retirada, para opção de retirada.
delivery_slot_idstring
Janela de entrega agendada (delivery_slots do frete). delivery_date é a data (YYYY-MM-DD).
delivery_datestring
Data da entrega agendada.
sales_rep_idinteger
Consultor que atendeu (veja consultores). 0 diz que ninguém atendeu; ausente mantém o pré-selecionado.
terms_acceptedbooleanpadrão: false
Aceite dos termos. Obrigatório true quando a loja exige aceite.
payment_condition_idstring
Condição escolhida no seletor agrupado de condições de pagamento.
notestring
Observações ou instruções de entrega do cliente, gravadas no pedido.

Exemplo de requisição

bash
curl -X POST "$BASE_URL/api/v1/storefront/wa-coex/cart/$TOKEN/checkout" \
  -H "Content-Type: application/json" \
  -d '{
    "cpf": "123.456.789-09",
    "payment_method": "pix",
    "shipping_choice": "50000000-0000-0000-0000-000000000001",
    "expected_total_cents": 16387,
    "address": {
      "street": "Avenida Paulista", "number": "1000", "district": "Bela Vista",
      "city": "São Paulo", "state": "SP", "zip": "01310100", "recipient": "Maria Souza"
    },
    "terms_accepted": true
  }'

Resposta

200Pedido criado, pagamento por Pix
json
{
  "order": {
    "order_id": "9f4a6d2e-1b7c-4c53-8d21-5e0b6a7c1f33",
    "order_number": "1042",
    "total_cents": 16387,
    "shipping_cents": 0
  },
  "pix": {
    "brcode": "00020126580014br.gov.bcb.pix0136123e4567-e89b-12d3-a456-4266141740005204000053039865802BR5913Loja Exemplo6009Sao Paulo62070503***6304ABCD",
    "qr_png_base64": "iVBORw0KGgoAAAANSUhEUgAA...",
    "expires_at": "2026-10-12T15:30:00Z"
  }
}
200Pedido criado, cartão aprovado
json
{
  "order": { "order_id": "9f4a6d2e-1b7c-4c53-8d21-5e0b6a7c1f33", "order_number": "1043", "total_cents": 16387 },
  "paid": true,
  "card": { "ok": true, "brand": "visa", "last4": "4242", "saved_card": false }
}

Campos da resposta

orderobject

O pedido criado.

order_iduuid
Id do pedido.
order_numberstring
Número do pedido para exibir ao cliente.
total_centsinteger
Total gravado, em centavos.
shipping_centsinteger
Frete cobrado, em centavos.
coupon_noticestring
Texto em português quando o cupom da sacola foi recusado: o pedido saiu sem ele.
ordersarray
Quando a loja divide a sacola em dois pedidos (físico e virtual), todos eles. Os campos acima espelham o primeiro.
pixobject
Pagamento por Pix: brcode (copia e cola), qr_png_base64 (imagem do QR Code) e expires_at (RFC 3339, quando o código deixa de valer).
boletoobject
Boleto pela Pagar.me: barcode, line (linha digitável) e url (PDF).
paidboolean
true quando o cartão foi aprovado na hora.
cardobject
Resultado do cartão: ok, brand, last4, saved_card. Em análise: pending: true, uncertain, installments, message e, quando há desafio do banco, action_url. Recusado depois de o pedido existir: error_message.
card_pendingboolean
O cartão está em análise no banco ou antifraude. Consulte /pay/{token}/status/{orderID} até aprovar ou recusar.
payment_pendingboolean
O pedido existe e aguarda pagamento (boleto enviado depois, pagamento na entrega, Pix que falhou em gerar, cartão em análise).
manual_pixobject
Quando a loja usa Pix manual: key (chave Pix da loja), payee e instructions. Nenhum QR é gerado; o cliente anexa o comprovante no pedido.
payment_link_urlstring
Link de pagamento externo do pedido, quando a loja tem um.
invoicedboolean
Boleto faturado: o pedido segue para faturamento.
messagestring
Aviso em português (por exemplo Boleto será enviado no WhatsApp.).
pix_errorstring
Por que o Pix não foi gerado. O pedido existe; o cliente pode gerar de novo abrindo o pedido.
boleto_errorstring
Por que o boleto não foi gerado.
split_summarystring
Explicação em português quando a sacola virou mais de um pedido. unplaced_notice avisa de linhas que ficaram de fora e continuam na sacola.

Erros

StatusQuandoCorpo
400Corpo ilegível.{"error":"invalid body"}
400payment_method de ponto de venda (PDV).{"error":"payment method not available online"}
400Há shipping_choice mas nenhum endereço ou CEP.{"error":"address_required_for_shipping"}
400Falta ou está incompleto o endereço, CPF/CEP inválido ou outro dado obrigatório do pedido.{"error":"<texto técnico>","message":"Não foi possível confirmar o pedido agora. Confira os dados e tente de novo."}
400Entrega rápida com pagamento na entrega.{"error":"online_payment_required","message":"Entrega rápida exige pagamento online"}
400line_ids com id desconhecido.{"error":"unknown_line","line_id":"<id>"}
400Cartão com mais de 12 parcelas ou parcela fora das oferecidas.{"error":"invalid_installments","message":"Escolha uma das parcelas disponíveis."}
401otp informado e inválido.{"error":"invalid_otp"}
402Cartão recusado. Nenhum pedido foi criado.{"error":"card_refused","message":"...","card":{"ok":false,"refused":true,"error_message":"..."}}
403Cliente bloqueado ou aguardando aprovação no painel.{"error":"customer_blocked"} ou {"error":"customer_pending_approval"}
403A loja esconde preços até o login, ou exige conta, e o cliente não entrou.{"error":"account_required","message":"..."}
403Forma de pagamento desligada para o WhatsApp.{"error":"payment_disabled"}
403O plano da loja não inclui pagamento pelo WhatsApp.{"error":"plan_blocked","message":"..."}
403Conta PJ com endereço travado e endereço diferente dos cadastrados.{"error":"address_locked_pj","message":"...","account_type":"pj"}
409Loja fechada.{"error":"store_closed","message":"Estamos fechados agora ..."}
409Falta uma opção obrigatória em alguma linha (favorito sem escolha).{"error":"pending_choices","message":"Antes de finalizar, escolha as opções de: ...","items":[{"item_id":"...","product_id":"...","name":"...","missing":["Ponto"]}]}
409O total mudou.{"error":"checkout_total_changed","message":"...","expected_total_cents":16387,"totals":{...}}
409A entrega escolhida não existe mais para o endereço (sacola ou CEP mudou).{"error":"invalid_shipping_choice","message":"..."} ou {"error":"shipping_requote_required","message":"...","reason":"..."}
409Estoque insuficiente.{"error":"insufficient_stock","message":"...","line_issues":[{"line_id":"...","code":"out_of_stock","requested":2,"available":0}]}
409Estas linhas já foram pedidas ou saíram da sacola.{"error":"cart_already_ordered","message":"..."}
409Outra chamada de checkout está em andamento.{"error":"checkout_in_progress","message":"..."}
409A conta do telefone já está ligada a outra sacola.{"error":"account_binding_conflict"}
409line_ids com linha indisponível ou combo incompleto.{"error":"line_unavailable","line_id":"...","message":"..."}
412Limite de crédito do cliente estourado.{"error":"credit_limit_exceeded","limit":50000,"available":12000,"message":"Limite de crédito insuficiente para este pedido."}
422Termos não aceitos.{"error":"terms_not_accepted"}
422CPF ou CNPJ inválido.{"error":"invalid_document"}
422sales_rep_id que não é de um consultor da loja.{"error":"invalid_sales_rep","message":"Escolha um consultor da lista."}
422Cartão online sem os dados do cartão.{"error":"card_required","message":"Informe os dados do cartão para concluir o pedido."}
422Cartão novo na Pagar.me enviado com número e CVV em vez de card_token.{"error":"card_token_required","message":"..."}
422Cartão salvo que não é do cliente ou não existe mais.{"error":"saved_card_unavailable","message":"Esse cartão salvo não está mais disponível. Use outro cartão."}
422Pedido abaixo do mínimo do seller ou da região.{"error":"vendor_min_order_not_met","message":"..."}
422Regra de pedido ou política de endereço da loja recusou.{"error":"<codigo>","message":"..."}
503Cadastro, conta ou cartão indisponíveis agora.{"error":"registration_unavailable"}, {"error":"account_resolution_unavailable"} ou {"error":"card_unavailable"}
502Falha ao cotar o frete ou ao criar o pedido.{"error":"shipping_quote_failed"} ou {"error":"<texto>","message":"..."}
Nunca repita o checkout às cegas

Em lojas com regras de pedido, uma segunda chamada enquanto a primeira roda responde 409 checkout_in_progress. Se uma chamada deu timeout, não reenvie: consulte GET /orders/{token} para ver se o pedido nasceu antes de tentar de novo.

Cartão: recusa não deixa pedido

Com cartão online, uma recusa (402 card_refused) não cria pedido: a sacola continua como estava e o cliente pode tentar outro cartão ou trocar a forma de pagamento no próprio checkout. Um cartão em análise cria o pedido normalmente, com card_pending: true.

Veja também

  • Frete, totais e validação
  • Pagar com cartão
  • Acompanhar o pedido
Anterior
Frete, totais e validação
Próxima
Pagar com cartão
Nesta página
  • Fechar o pedido
  • Exemplo de requisição
  • Resposta
  • Erros
  • Veja também