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
/api/v1/storefront/wa-coex/cart/{token}/checkoutPúblicaCria 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órioCorpo da requisição
cpfstringobrigatóriocpf também para CNPJ.addressobjectEndereço de entrega digitado. Use este ou saved_address_id.
streetstringobrigatórionumberstringobrigatóriocomplementstringdistrictstringcitystringobrigatóriostatestringobrigatóriozipstringobrigatóriorecipientstringsaved_address_iduuidaddress.shipping_choicestringchoice 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órioexpected_total_centsinteger/totals, em centavos. Se o total real for outro, o checkout recusa com 409 checkout_total_changed. Opcional, mas recomendado.line_idsarrayitem_id das linhas a pedir. Ausente pede a sacola inteira; o resto fica na sacola.cardobjectCartão, obrigatório quando a forma de pagamento é cartão online. Maquininha na entrega não usa.
card_tokenstring/card-tokenization. Obrigatório para cartão novo quando o gateway é a Pagar.me.holder_namestringinstrument_idstringinstallmentsintegerpadrão: 1save_cardbooleanpadrão: falseplan_total_centsintegernumberstringexp_monthstringexp_yearstringcvvstringcreate_accountbooleantrue 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.otpstringinvoiced_plan_idstringpickup_point_idstringdelivery_slot_idstringdelivery_slots do frete). delivery_date é a data (YYYY-MM-DD).delivery_datestringsales_rep_idinteger0 diz que ninguém atendeu; ausente mantém o pré-selecionado.terms_acceptedbooleanpadrão: falsetrue quando a loja exige aceite.payment_condition_idstringnotestringExemplo de requisição
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
{
"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"
}
}{
"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
orderobjectO pedido criado.
order_iduuidorder_numberstringtotal_centsintegershipping_centsintegercoupon_noticestringordersarraypixobjectbrcode (copia e cola), qr_png_base64 (imagem do QR Code) e expires_at (RFC 3339, quando o código deixa de valer).boletoobjectbarcode, line (linha digitável) e url (PDF).paidbooleantrue quando o cartão foi aprovado na hora.cardobjectok, 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/pay/{token}/status/{orderID} até aprovar ou recusar.payment_pendingbooleanmanual_pixobjectkey (chave Pix da loja), payee e instructions. Nenhum QR é gerado; o cliente anexa o comprovante no pedido.payment_link_urlstringinvoicedbooleanmessagestringBoleto será enviado no WhatsApp.).pix_errorstringboleto_errorstringsplit_summarystringunplaced_notice avisa de linhas que ficaram de fora e continuam na sacola.Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo ilegível. | {"error":"invalid body"} |
| 400 | payment_method de ponto de venda (PDV). | {"error":"payment method not available online"} |
| 400 | Há shipping_choice mas nenhum endereço ou CEP. | {"error":"address_required_for_shipping"} |
| 400 | Falta 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."} |
| 400 | Entrega rápida com pagamento na entrega. | {"error":"online_payment_required","message":"Entrega rápida exige pagamento online"} |
| 400 | line_ids com id desconhecido. | {"error":"unknown_line","line_id":"<id>"} |
| 400 | Cartão com mais de 12 parcelas ou parcela fora das oferecidas. | {"error":"invalid_installments","message":"Escolha uma das parcelas disponíveis."} |
| 401 | otp informado e inválido. | {"error":"invalid_otp"} |
| 402 | Cartão recusado. Nenhum pedido foi criado. | {"error":"card_refused","message":"...","card":{"ok":false,"refused":true,"error_message":"..."}} |
| 403 | Cliente bloqueado ou aguardando aprovação no painel. | {"error":"customer_blocked"} ou {"error":"customer_pending_approval"} |
| 403 | A loja esconde preços até o login, ou exige conta, e o cliente não entrou. | {"error":"account_required","message":"..."} |
| 403 | Forma de pagamento desligada para o WhatsApp. | {"error":"payment_disabled"} |
| 403 | O plano da loja não inclui pagamento pelo WhatsApp. | {"error":"plan_blocked","message":"..."} |
| 403 | Conta PJ com endereço travado e endereço diferente dos cadastrados. | {"error":"address_locked_pj","message":"...","account_type":"pj"} |
| 409 | Loja fechada. | {"error":"store_closed","message":"Estamos fechados agora ..."} |
| 409 | Falta 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"]}]} |
| 409 | O total mudou. | {"error":"checkout_total_changed","message":"...","expected_total_cents":16387,"totals":{...}} |
| 409 | A 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":"..."} |
| 409 | Estoque insuficiente. | {"error":"insufficient_stock","message":"...","line_issues":[{"line_id":"...","code":"out_of_stock","requested":2,"available":0}]} |
| 409 | Estas linhas já foram pedidas ou saíram da sacola. | {"error":"cart_already_ordered","message":"..."} |
| 409 | Outra chamada de checkout está em andamento. | {"error":"checkout_in_progress","message":"..."} |
| 409 | A conta do telefone já está ligada a outra sacola. | {"error":"account_binding_conflict"} |
| 409 | line_ids com linha indisponível ou combo incompleto. | {"error":"line_unavailable","line_id":"...","message":"..."} |
| 412 | Limite de crédito do cliente estourado. | {"error":"credit_limit_exceeded","limit":50000,"available":12000,"message":"Limite de crédito insuficiente para este pedido."} |
| 422 | Termos não aceitos. | {"error":"terms_not_accepted"} |
| 422 | CPF ou CNPJ inválido. | {"error":"invalid_document"} |
| 422 | sales_rep_id que não é de um consultor da loja. | {"error":"invalid_sales_rep","message":"Escolha um consultor da lista."} |
| 422 | Cartão online sem os dados do cartão. | {"error":"card_required","message":"Informe os dados do cartão para concluir o pedido."} |
| 422 | Cartão novo na Pagar.me enviado com número e CVV em vez de card_token. | {"error":"card_token_required","message":"..."} |
| 422 | Cartã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."} |
| 422 | Pedido abaixo do mínimo do seller ou da região. | {"error":"vendor_min_order_not_met","message":"..."} |
| 422 | Regra de pedido ou política de endereço da loja recusou. | {"error":"<codigo>","message":"..."} |
| 503 | Cadastro, conta ou cartão indisponíveis agora. | {"error":"registration_unavailable"}, {"error":"account_resolution_unavailable"} ou {"error":"card_unavailable"} |
| 502 | Falha ao cotar o frete ou ao criar o pedido. | {"error":"shipping_quote_failed"} ou {"error":"<texto>","message":"..."} |