API Admin › Recursos
Pedidos
Os pedidos da loja: a lista para o ERP sincronizar, as mudanças de situação (pago, em separação, enviado, entregue, cancelado) e a nota fiscal que o ERP emite.
| Escopo | O que abre |
|---|---|
read_orders | ler os pedidos, com os dados de quem comprou |
write_orders | marcar como pago, separar, enviar com o rastreio, entregar, cancelar o não pago e informar a nota fiscal |
refund_orders | cancelar o pedido já pago, devolvendo o dinheiro a quem comprou (só junto com write_orders) |
As regras são as mesmas do painel: a mudança que o painel recusa, a API recusa; quem comprou recebe os mesmos e-mails (pagamento confirmado, pedido enviado, pedido cancelado, estorno). Os pedidos nascem no checkout da vitrine: a API não cria pedido.
Dados pessoais: cada pedido traz o nome, o e-mail, o telefone, o CPF e o endereço de quem comprou. Com read_orders, a integração passa a responder por esses dados na LGPD. Quando a loja anonimiza um pedido (anonymized_at deixa de ser null), apague os dados dele também na sua cópia. O webhook order.anonymized avisa na hora (ver Webhooks).
O objeto pedido
{
"id": "6c1d0a52-...",
"number": 1021,
"status": "shipped",
"customer": {
"id": "3f6b2c1e-...",
"name": "Helena Souza",
"email": "helena@exemplo.com",
"phone": "41999990000",
"cpf": "52998224725"
},
"shipping_address": {
"zip": "80000000",
"street": "Rua XV de Novembro",
"number": "100",
"complement": "Sala 2",
"neighborhood": "Centro",
"city": "Curitiba",
"state": "PR"
},
"line_items": [
{
"id": "0c41...",
"key": "pX3b2kL9qRtY7mNa",
"parent_line_id": null,
"group": null,
"properties": {},
"inventory_tracked": true,
"eyes": null,
"variant_id": "5e2a...",
"title": "Camiseta Básica",
"options": ["M"],
"sku": "CB-M",
"price": 4990,
"quantity": 2,
"line_price": 9980,
"promotion": null
}
],
"subtotal_price": 9980,
"shipping_price": 2190,
"total_discounts": 998,
"coupon_code": "BEMVINDA",
"pix_discount": 559,
"total_price": 10613,
"shipping_line": {
"title": "SEDEX",
"carrier": "Correios",
"delivery_days": 2,
"pickup": null
},
"tracking_code": "AA123456789BR",
"payment": {
"method": "pix",
"status": "approved",
"amount": 10613,
"installments": null,
"refunded_at": null,
"created_at": "2026-10-03T18:01:00.000Z"
},
"invoice": {
"key": "35261011222333000181550010000012341000000017",
"number": "1234",
"series": "1",
"url": "https://erp.exemplo.com/danfe/1234",
"informed_at": "2026-10-03T19:30:00.000Z"
},
"paid_at": "2026-10-03T18:02:10.000Z",
"test": false,
"anonymized_at": null,
"created_at": "2026-10-03T18:00:00.000Z",
"updated_at": "2026-10-03T19:30:00.000Z"
}number: o número que o comprador e o painel veem (#1021), único na loja. Oidé o que as rotas usam.status:pending_payment(aguardando pagamento),paid,preparing(em separação),shipped,deliveredoucancelled. Na retirada na loja,shippedé o pedido pronto para retirar, edelivered, o retirado.customereshipping_address: como o checkout recebeu (o telefone, o CPF e o CEP só com os números). Na retirada na loja, o endereço é o de quem comprou, e onde retirar vem emshipping_line.pickup.customer.id: a conta do comprador na área do cliente da loja, ligada pelo e-mail verificado (o pedido feito com a conta aberta, ou o pedido antigo do mesmo e-mail quando o comprador entra pela primeira vez). Comread_customers,GET /customers/{id}traz a conta, com os endereços salvos (ver Clientes).nullno pedido sem conta, no anonimizado e depois que a conta é excluída.line_items: uma cópia do que foi comprado. Mudar o catálogo depois não muda o pedido, e a variante pode já ter saído dele.priceé o da unidade na compra, já com a promoção automática (promotiondiz qual).- Item composto (a armação com a lente e os tratamentos, ver montagens): o item pai vem seguido dos filhos, e cada filho traz
parent_line_id(oiddo pai) egroup({ code, name }, o grupo da montagem em que ele entrou, como se chamava na compra). O filho tem a quantidade do pai, e oline_pricede cada item é só o dele: o conjunto é a soma do pai com os filhos, e osubtotal_pricesoma todos.keyé a chave da linha do carrinho (null nos filhos e nos pedidos de antes de outubro de 2026).propertiessão as propriedades da linha escritas pelo comprador (a gravação, por exemplo), com as ocultas, cujo nome começa com_.inventory_trackedfalso: o item é sob encomenda, não saiu do estoque, e o cancelamento não devolve nada. - Lente de contato (o produto com
prescription_type: "contact_lens"):eyestraz as caixas de cada olho,{ "right": 2, "left": 1 }(OD e OE), equantityé a soma; o olho com zero caixas fica sem lente.nullnos outros itens. A receita do item é a de lente de contato (ver Receitas). files: os arquivos enviados por quem comprou para o item (a foto ou o PDF da receita, uma arte para personalizar), só noGET /orders/{id}; a lista de pedidos e o corpo dos webhooks não trazem o campo. Cada um comid,name,content_type(image/jpeg,image/png,image/webpouapplication/pdf),sizeem bytes,purpose(generalouprescription) eurl, um endereço assinado que vale 15 minutos (url_expires_at) e baixa o arquivo como anexo. Para baixar depois, peça o pedido de novo. O arquivo é dado pessoal: some quando o pedido é anonimizado.
json "files": [ { "id": "7d10...", "name": "receita.jpg", "content_type": "image/jpeg", "size": 482113, "purpose": "general", "url": "https://...amazonaws.com/pedidos/...?X-Amz-Signature=...", "url_expires_at": "2026-10-07T18:15:00.000Z" } ]
prescription: a receita oftalmológica do item que pede receita (a armação com lente de grau, ou a lente sozinha);nullnos outros e nos filhos. A situação (pending,provided,checked) e as datas vêm sempre; os valores (o grau de cada olho, a DP, o médico) só noGET /orders/{id}, como os arquivos. Ver Receitas, com a rota que informa a receita que chegou por outro canal.- Valores em centavos:
total_price = subtotal_price + shipping_price − total_discounts − pix_discount.total_discountsé o desconto do cupom (nos itens e no frete), epix_discount, o de quem escolheu Pix. shipping_line: o frete escolhido no checkout, com o prazo em dias úteis a partir da postagem.null: o frete ficou combinado com a loja.payment: a última cobrança, que é a que vale.method:pix,credit_card,debit_cardouboleto;status:pending,approved,expired,cancelled,declined(o cartão recusado),refundedouauthorized.installmentssó no cartão de crédito.nullenquanto o comprador não gerou nenhuma.authorizedé o cartão aprovado pelo banco e à espera da análise de risco ("Em análise" no painel). O pedido continuapending_paymente nada foi cobrado ainda. Aprovado na análise, o pagamento passa aapprovede o pedido apaid. Recusado, ou sem resposta em 3 dias, o pagamento passa adeclinedoucancelled, o pedido é cancelado (order.cancelled) e a reserva no cartão é desfeita. Não separe nem envie um pedido com o pagamentoauthorized.
invoice: a nota fiscal informada pelo ERP (ver abaixo).nullenquanto não informada.paid_at: quando passou a pago, pelo gateway ou pela loja. Fica mesmo que o pedido seja cancelado depois.test:trueno pedido feito numa loja de teste, em que nenhum pagamento é real (o pagamento simulado ou uma conta de teste do gateway). Vem da loja quando o pedido é criado e não muda depois, nem quando a loja deixa de ser de teste. Use para separar os pedidos de teste dos de verdade no seu sistema.anonymized_at: quando os dados de quem comprou foram apagados (LGPD). No pedido anonimizado,customer.nameé "Comprador anonimizado", o e-mail, o telefone e o CPF ficam vazios, o endereço guarda só a cidade e a UF, e o link da nota (invoice.url) sai. Os itens, os valores, a situação e a chave da nota ficam.
A lista
GET /orders
Os pedidos, na ordem da última mudança, da mais antiga à mais nova (o id desempata). É a lista da sincronização: guarde o updated_at do último pedido que leu e, na próxima vez, peça updated_at_min com ele (a data entra na lista: o último lido vem de novo).
Toda mudança do pedido muda o updated_at: o pagamento confirmado pelo gateway, cada mudança de situação (pelo painel, pela API ou pela etiqueta postada), o rastreio, a nota fiscal, a conta do cliente (customer.id) e a anonimização.
| Parâmetro | O que faz |
|---|---|
limit | de 1 a 100 (50 sem ele) |
cursor | o next_cursor da página anterior, como veio |
ids | só estes ids, separados por vírgula (até 100) |
status | só os nesta situação (pending_payment, paid, preparing, shipped, ...) |
updated_at_min | só o que mudou a partir desta data |
created_at_min | só o criado a partir desta data |
created_at_max | só o criado até esta data |
A resposta é { "data": [pedido...], "next_cursor": "..." }; com mais páginas, o cabeçalho Link leva à próxima (rel="next"). Ver Listas.
GET /orders/count
Quantos pedidos casam com os mesmos filtros da lista: { "count": 37 }.
GET /orders/{id}
Um pedido.
As mudanças de situação
Cada ação é um POST sem corpo (o ship aceita o rastreio) e responde 200 com o pedido. A ordem é a do painel:
pending_payment → paid → preparing → shipped → delivered
↓ ↓ ↓
cancelled cancelled cancelledA ação fora da vez é 409 invalid_status_transition (por exemplo, ship num pedido pago que ainda não foi separado), e nada muda.
POST /orders/{id}/mark_paid
Marca como pago o pedido que aguarda pagamento: para o pagamento recebido fora da plataforma (depósito, dinheiro na retirada). Quem comprou recebe o e-mail de pagamento confirmado. O pagamento feito no checkout já chega pago, pelo gateway: não é preciso marcar.
POST /orders/{id}/prepare
Começa a separar o pedido pago.
POST /orders/{id}/ship
Marca como enviado o pedido em separação. O código de rastreio é opcional (entrega em mãos, motoboy):
{ "tracking_code": "AA123456789BR" }O código fica em maiúsculas, sem espaços (de 4 a 40 letras, números e hífen). Quem comprou recebe o e-mail de pedido enviado, com o rastreio. A etiqueta do Melhor Envio comprada no painel marca o pedido como enviado sozinha, quando é postada.
POST /orders/{id}/deliver
Marca como entregue o pedido enviado.
POST /orders/{id}/cancel
Cancela o pedido que ainda não foi enviado. Os itens voltam ao estoque, e a cobrança em aberto (um boleto, um Pix) deixa de valer, também no gateway.
O pedido já pago tem o dinheiro devolvido a quem comprou, pelo gateway que cobrou, antes de qualquer outra coisa: cancelá-lo pede também o escopo refund_orders (sem ele, 403 missing_scope, e nada muda). Se o gateway recusar o estorno, o pedido continua pago.
A nota fiscal
A plataforma não emite nota fiscal: quem emite é o ERP da loja, que informa a nota no pedido. A nota aparece no pedido no painel, e a compra da etiqueta do Melhor Envio, numa loja que envia com nota, usa a chave dela sem o lojista digitar.
PUT /orders/{id}/invoice
{
"key": "35261011222333000181550010000012341000000017",
"url": "https://erp.exemplo.com/danfe/1234"
}key: a chave de acesso da NF-e ou da NFC-e, os 44 números (espaços e pontos são ignorados). O último número confere os outros: a chave copiada pela metade é recusada (400, com o campo emfields).numbereseries: opcionais, só com números. Eles estão dentro da chave; sem eles, saem dela, e, com eles, têm de bater (400).url: opcional, o link da nota (a DANFE) no ERP,https://, até 500 caracteres.
Responde 200 com o pedido. Informar de novo troca a nota anterior (o ERP que cancela a nota e emite outra manda a nova). A nota é aceita em qualquer situação do pedido: quem decide quando emitir é o ERP.