Pedidu API
Uma referência única para as duas integrações do Pedidu: a API de Pedidos (delivery / retirada, via webhook) e a API de Mesas (salão, REST somente-leitura). Escolha abaixo por onde começar.
Visão geral
O Pedidu expõe duas APIs, com propósitos e modelos diferentes:
API de Pedidos
Delivery, retirada, drive-in e balcão. O Pedidu te envia cada pedido
(novo/atualizado/cancelado) por POST na sua URL. Ideal para roteirizadores,
impressão e integrações operacionais.
API de Mesas
O salão (mesas/comandas). Você consulta por GET
autenticado: sessões abertas, valores, formas de pagamento e cliente. Ideal para o
sistema financeiro do lojista.
API de Pedidos (Delivery / Retirada)
O Pedidu empurra o pedido inteiro para a URL que você configurar. Não precisa ficar consultando.
Introdução
A integração de pedidos do Pedidu funciona via webhook (push): você não
precisa ficar consultando a API atrás de pedidos novos — o Pedidu te avisa.
Assim que um pedido muda de estado, o Pedidu faz uma requisição POST para a
URL do seu sistema com o objeto inteiro do pedido em JSON.
É o mesmo modelo usado por roteirizadores e integradores (ex.: Agilizone, Husky): o Pedidu é a origem do pedido e empurra os dados pra fora.
Você só precisa expor um endpoint HTTPS que aceite POST com
corpo JSON. Não há SDK obrigatório — qualquer linguagem que receba um POST serve.
Como funciona
- O cliente faz um pedido no seu cardápio digital, PDV, balcão ou marketplace (iFood/99Food).
- O lojista aceita / o pedido muda de status (entra em produção, sai pra entrega, é cancelado…).
- O Pedidu monta o objeto do pedido e faz
POSTna suawebhookApi. - Seu sistema recebe o JSON
{ type, order }e processa (cria a entrega, imprime, dá baixa, etc.).
Configuração do webhook
A URL de destino é configurada por loja. No painel do Pedidu (gestor), o campo
webhookApi recebe a URL completa (com https://) do seu endpoint.
Enquanto estiver vazio ou inválido, nenhum disparo é feito.
| Configuração | Descrição |
|---|---|
webhookApi |
URL do seu endpoint que recebe os pedidos. Precisa ser uma URL válida e pública (HTTPS recomendado). Vazio = integração desligada. |
O endpoint deve responder rápido (em poucos segundos) e retornar 200.
Faça o processamento pesado de forma assíncrona — não segure a resposta.
A requisição (POST)
O Pedidu sempre envia uma requisição com este formato:
Cabeçalhos e corpo:
POST /webhook/pedidu HTTP/1.1
Host: seu-sistema.com
Content-Type: application/json
{
"type": "order.updated",
"order": { ... objeto completo do pedido ... }
}
O corpo tem sempre dois campos no topo:
| Campo | Tipo | Descrição |
|---|---|---|
type obrigatório |
string (enum) | O evento que disparou o webhook. Veja Eventos. |
order obrigatório |
object | O objeto completo do pedido (o "card"). Veja Objeto order. |
Eventos (type)
O campo type indica o que aconteceu com o pedido:
| type | Quando dispara |
|---|---|
| order.updated | Pedido aceito / atualizado — entrou em produção, mudou de status (preparação → entrega → finalizado), ou teve dados alterados. É o evento que você usa para receber pedidos novos confirmados. |
| order.canceled | Pedido cancelado (pelo lojista, pelo cliente ou pelo marketplace). |
Sempre cheque o campo order.status dentro do order para saber o
estado exato (ver Status do pedido). O type diz que
algo mudou; o status diz para qual estado.
Entrega & reenvio
- O disparo é best-effort: o Pedidu envia e segue o fluxo, sem travar a operação da loja se o seu endpoint falhar.
- Trate seu handler como idempotente: o mesmo pedido (mesmo
order.id/order.id_order) pode chegar mais de uma vez conforme muda de status. - Use
order.id(id interno) ouorder.id_order(número público) como chave de deduplicação.
Objeto order
O order carrega o pedido inteiro. Abaixo, os campos agrupados por tema.
A tabela consolidada de todos os campos está em Tabela de campos.
Identificação
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID interno do pedido no Pedidu (chave única). |
id_order | string | Número público do pedido (mostrado pro cliente / no comprovante). |
num_order | integer | Sequencial do pedido no dia/loja (ex.: pedido nº 1, 2, 3…). |
pin_order | string | PIN / código curto de conferência do pedido. |
id_user | integer | ID do cliente. Use para resolver os dados em Cliente. |
Itens & valores
| Campo | Tipo | Descrição |
|---|---|---|
purchase | json string | Lista de itens do pedido (produtos, quantidades, adicionais, observações). Ver Itens do pedido. |
product_price | decimal | Valor dos produtos (sem entrega). |
subtotal_value | decimal | Subtotal do pedido. |
delivery_price | decimal | Valor do frete. 0 = grátis ou retirada. |
manual_addition | decimal | Acréscimo manual aplicado pelo lojista. |
manual_discount | decimal | Desconto manual aplicado pelo lojista. |
cashback_discount | decimal | Valor abatido via carteira de cashback. |
Datas
| Campo | Tipo | Descrição |
|---|---|---|
created_at | datetime | Quando o pedido foi feito. Formato YYYY-MM-DD HH:MM:SS. |
accepted_at | datetime · null | Quando o lojista aceitou. |
updated_at | datetime | Última atualização. |
Itens do pedido
O campo purchase é um array JSON (codificado como string) com
um objeto por item. Cada item tem produto, quantidade, adicionais e observação:
[
{
"product_id": 20, // id do produto
"product_quantity": 2, // quantidade
"product_optional": "Sem cebola", // observação do cliente (ou null)
"additional": [ // adicionais / opcionais escolhidos
{
"name": "Bacon extra",
"price": 5.00,
"qty": 1,
"hight_price": "no" // "yes" = preço do item vem do adicional (ex.: tamanho)
}
]
}
]
| Campo do item | Tipo | Descrição |
|---|---|---|
product_id | integer | ID do produto no catálogo da loja. |
product_quantity | integer | Quantidade pedida do item. |
product_optional | string · null | Observação livre do cliente para esse item. |
additional[] | array | Adicionais / opcionais escolhidos. Pode ser vazio. |
additional[].name | string | Nome do adicional (ex.: "Bacon extra", "Tamanho: Grande"). |
additional[].price | decimal | Preço unitário do adicional. |
additional[].qty | integer | Quantidade do adicional. |
additional[].hight_price | "yes" · "no" | Quando "yes", o preço do item é definido por esse adicional (ex.: tamanho da pizza), não pelo preço-base do produto. |
Pizzas montadas trazem campos extras no item: is_pizza: true e um objeto
pizza com size, borda, massa e sabores[].
Os detalhes também são espelhados em additional[] (Tamanho, Borda, Massa, Sabores) para
quem só itera a lista de adicionais.
Cliente & endereço
O order referencia o cliente por id_user. O card completo
(como aparece na comanda) resolve esses dados na base de clientes da loja. Os campos do
cliente são:
| Campo | Tipo | Descrição |
|---|---|---|
name | string | Nome do cliente. |
phone | string | Telefone (também usado para WhatsApp). |
address_name | string | Rua / logradouro de entrega. |
address_number | string | Número. |
address_region | string | Bairro / região de entrega. |
address_reference | string | Ponto de referência / complemento. |
Os dados de endereço só são relevantes quando delivery_option = 1 (Delivery).
Em retirada / consumo no local, o cliente não informa endereço.
Forma de pagamento
O campo payment_option define a forma de pagamento:
money · Dinheirocard · Cartão de crédito/débitopix · PIXmercadopago · Mercado Pago (online)| Campo | Tipo | Descrição |
|---|---|---|
payment_option | enum | money · card · pix · mercadopago. |
payment_moneyback | decimal | Troco para. Valor que o cliente vai pagar em dinheiro (para calcular o troco). 0 = não precisa de troco. |
payment_card_id | integer | Bandeira/maquininha escolhida (quando card). 0 = não informado. |
payment_card_fee | decimal | Taxa da maquininha aplicada. |
online_payment_fee | decimal | Taxa de pagamento online (PIX/Mercado Pago). |
payment_coupon_id | integer | Cupom de desconto aplicado. 0 = sem cupom. |
paid_no_charge | boolean | 1 = pedido já pago / sem cobrança na entrega. |
Para troco: se payment_option = "money" e payment_moneyback > 0,
o troco é payment_moneyback − total do pedido.
Forma de entrega
O campo delivery_option define como o cliente recebe o pedido:
1 · Delivery (entrega no endereço)2 · Retirar na loja3 · Drive-in4 · Consumir no local| Campo | Tipo | Descrição |
|---|---|---|
delivery_option | enum (1–4) | Modo de entrega (ver chips acima). |
delivery_price | decimal | Valor do frete. 0 = grátis / retirada. |
delivery_time | string · null | Tempo estimado de entrega/preparo. |
delivery_motoboy_id | integer · null | Entregador atribuído (quando despachado por motoboy interno). |
car_board | string | Placa do carro (relevante para Drive-in). |
table_number | integer | Número da mesa (relevante para Consumir no local). |
Pedido agendado
Um pedido é agendado quando o cliente escolhe data/horário para receber. Identifique pela presença dos campos abaixo:
| Campo | Tipo | Descrição |
|---|---|---|
agendamented_date | date · null | Data agendada para o pedido. null = pronta-entrega (não agendado). |
agendamented_hours | string · null | Horário/janela agendada. null = não agendado. |
Regra prática: se agendamented_date for null, é pedido
para agora (pronta-entrega). Se vier preenchido, é agendado para a data/hora indicada.
Status do pedido
O campo status indica o estado atual do pedido:
| status | Significado |
|---|---|
new | Novo — aguardando o lojista aceitar. |
preparation | Em produção / preparo (pedido aceito). |
delivery | Saiu para entrega / pronto para retirada. |
ended | Finalizado / concluído. |
cancelled | Cancelado. |
Origem / canal
O campo type do order indica de qual canal o pedido veio:
cardapio · Cardápio digitalpdv · PDVbalcao · Balcãoifood · iFood99food · 99FoodNão confunda: o type no topo do payload é o evento
(order.updated); o type dentro de order
é o canal de origem (cardapio, ifood…).
Totais & descontos
O total do pedido é composto assim:
total = product_price
+ delivery_price (se delivery_option == 1)
+ manual_addition
− manual_discount
− cashback_discount
− desconto do cupom (se payment_coupon_id != 0)
Cupons de frete (frete grátis ou desconto no frete) zeram ou reduzem
delivery_price em vez do subtotal. Nesses casos, o frete já vem ajustado no
próprio campo delivery_price.
Exemplo completo
Um pedido de delivery, pago em dinheiro com troco, não agendado:
{
"type": "order.updated",
"order": {
"id": 83,
"id_order": "1781804869",
"num_order": 42,
"pin_order": "506867",
"id_user": 1,
"type": "cardapio",
"status": "preparation",
"delivery_option": "1",
"delivery_price": "7.00",
"delivery_time": null,
"delivery_motoboy_id": null,
"car_board": "0",
"table_number": 0,
"payment_option": "money",
"payment_moneyback": "150.00",
"payment_card_id": 0,
"payment_coupon_id": 0,
"online_payment_fee": "0.00",
"product_price": "108.00",
"subtotal_value": "108.00",
"manual_addition": "0.00",
"manual_discount": "0.00",
"cashback_discount": "0.00",
"agendamented_date": null,
"agendamented_hours": null,
"order_note": "Apertar a campainha",
"purchase": "[{\"product_id\":20,\"product_quantity\":2,\"product_optional\":\"Sem cebola\",\"additional\":[{\"name\":\"Bacon extra\",\"price\":5,\"qty\":1,\"hight_price\":\"no\"}]}]",
"created_at": "2026-06-18 14:47:49",
"accepted_at": "2026-06-18 14:47:51",
"updated_at": "2026-06-18 14:50:02"
}
}
Lendo o exemplo: pedido nº 42 do cardápio, em produção, delivery (frete R$ 7,00), pago em dinheiro com troco para R$ 150,00, não agendado, 2× produto 20 sem cebola + bacon extra.
Tabela de campos (referência)
Todos os campos do objeto order:
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID interno (chave única). |
id_order | string | Número público do pedido. |
num_order | integer | Sequencial do dia/loja. |
pin_order | string | PIN de conferência. |
id_user | integer | ID do cliente. |
type | enum | Canal: cardapio · pdv · balcao · ifood · 99food. |
origin | string · null | Origem complementar do pedido. |
status | enum | new · preparation · delivery · ended · cancelled. |
purchase | json string | Itens do pedido. |
product_price | decimal | Valor dos produtos. |
subtotal_value | decimal | Subtotal. |
delivery_option | enum (1–4) | 1 Delivery · 2 Retirar · 3 Drive-in · 4 Local. |
delivery_price | decimal | Frete. |
delivery_time | string · null | Tempo estimado. |
delivery_motoboy_id | integer · null | Entregador atribuído. |
payment_option | enum | money · card · pix · mercadopago. |
payment_moneyback | decimal | Troco para (dinheiro). |
payment_card_id | integer | Bandeira/maquininha. |
payment_card_fee | decimal | Taxa da maquininha. |
payment_coupon_id | integer | Cupom aplicado (0 = nenhum). |
online_payment_fee | decimal | Taxa de pagamento online. |
paid_no_charge | boolean | Já pago / sem cobrança na entrega. |
manual_addition | decimal | Acréscimo manual. |
manual_discount | decimal | Desconto manual. |
cashback_discount | decimal | Abatimento de cashback. |
car_board | string | Placa do carro (Drive-in). |
table_number | integer | Mesa (Consumir no local). |
agendamented_date | date · null | Data agendada (null = pronta-entrega). |
agendamented_hours | string · null | Horário agendado. |
order_note | string · null | Observação geral do pedido. |
order_printed | boolean | Já impresso na loja. |
integrations | json · null | Metadados de integrações externas. |
created_at | datetime | Criação do pedido. |
accepted_at | datetime · null | Aceite do lojista. |
updated_at | datetime | Última atualização. |
API de Mesas (Salão)
Somente leitura. Seu financeiro consulta quando quiser, autenticado por token. Não altera nada no sistema.
Introdução
Diferente da API de pedidos do delivery (que é push, via webhook), a API de
Mesas é pull: o seu sistema consulta quando quiser. Você faz uma
requisição GET autenticada e recebe os dados das mesas em JSON.
São três endpoints, todos sob o prefixo /api/v1/mesas:
GET /summary— números fechados do período (dashboard).GET /sessions— a lista de aberturas de mesa (uma por sessão).GET /sessions/{id}— o detalhe completo de uma sessão (comandas, itens, pagamentos).
Autenticação (token)
Toda requisição precisa do Token de API da sua loja, enviado no cabeçalho
Authorization no formato Bearer. É o mesmo token usado na
API de pedidos (delivery/retirada), configurado em
Configurações → Integrações no gestor.
Authorization: Bearer SEU_TOKEN_DE_API
Exemplo com curl:
curl -s https://SUA-LOJA.com.br/api/v1/mesas/summary \
-H "Authorization: Bearer SEU_TOKEN_DE_API"
Segurança rigorosa. O token é comparado em tempo constante
(hash_equals, imune a timing attack). Se a sua loja não tiver um
token forte definido (mínimo 24 caracteres), a API responde
503 e não libera nada — um token vazio nunca é aceito. Há
rate-limit de 120 requisições por minuto por IP.
Por compatibilidade, o token também é aceito no cabeçalho cru token: SEU_TOKEN,
mas o Bearer é o recomendado. Nunca passe o token pela URL (query string) —
ele vazaria em logs e histórico.
URL base & formato
- Respostas em JSON (UTF-8, acentos preservados).
- Datas em ISO 8601 com fuso, ex.:
2026-05-29T19:21:10-03:00. - Valores monetários em reais, com 2 casas (número, não string):
46.44. - Todo corpo de sucesso traz
"ok": true; erros trazem"ok": falsee"error".
Resumo do período GET
Os números fechados de um intervalo — ideal para um card/dashboard no seu financeiro.
Parâmetros (query)
| Campo | Tipo | Descrição |
|---|---|---|
date opcional | date | Atalho para um único dia: YYYY-MM-DD. Ignora from/to. |
from opcional | datetime | Início do intervalo. Padrão: hoje 00:00. |
to opcional | datetime | Fim do intervalo. Padrão: hoje 23:59. Máx. 92 dias de janela. |
O período filtra pela abertura da mesa (opened_at): uma sessão aberta no intervalo entra no resumo com todo o seu consumo e pagamento.
{
"ok": true,
"period": { "from": "2026-05-01T00:00:00-03:00", "to": "2026-05-31T23:59:59-03:00" },
"sessions_opened": 86, // mesas abertas no período (cada abertura conta)
"sessions_closed": 81, // dessas, quantas já foram fechadas
"sessions_open_now": 5, // ainda abertas
"distinct_tables": 29, // mesas físicas distintas usadas
"items_sold": 518, // itens vendidos (soma das quantidades, exclui cancelados)
"items_gross": 237565.38, // soma dos itens (price x quantity) — NÃO é o pago
"revenue_paid": 250451.26, // valor efetivamente pago (líquido de troco)
"avg_ticket": 3091.99, // revenue_paid / sessions_closed
"by_payment_method": [
{ "method": "money", "gross": 2624.00, "change_back": 1146.53, "net": 1477.47, "count": 10 },
{ "method": "pix", "gross": 2482.25, "change_back": 0, "net": 2482.25, "count": 14 },
{ "method": "credit", "gross": 241523.00, "change_back": 0, "net": 241523.00, "count": 18 },
{ "method": "debit", "gross": 4867.24, "change_back": 0, "net": 4867.24, "count": 45 }
],
"extras": { "increase": 101.30, "discount": 0, "tip": 0 }
}
revenue_paid pode ficar acima de items_gross quando há
acréscimos/taxa de serviço (extras.increase) ou gorjeta. E abaixo, quando há
descontos. O revenue_paid é sempre o dinheiro que realmente entrou.
Listar sessões GET
A lista de aberturas de mesa no período, paginada, cada uma com seus totais e o cliente.
Parâmetros (query)
| Campo | Tipo | Descrição |
|---|---|---|
from / to / date | datetime | Mesma regra do resumo. Filtra pela abertura. |
status opcional | enum | open, close ou all (padrão all). |
page opcional | int | Página (padrão 1). |
per_page opcional | int | Itens por página (padrão 50, máx. 100). |
{
"ok": true,
"period": { "from": "2026-05-01T00:00:00-03:00", "to": "2026-06-30T23:59:59-03:00" },
"total": 86,
"page": 1,
"per_page": 2,
"total_pages": 43,
"sessions": [
{
"session_id": 87, // id da ABERTURA (único) — use no /sessions/{id}
"table_number": 10, // número da mesa física (pode repetir no dia)
"label": "Joao", // rótulo/nome digitado na mesa
"status": "open", // open | closed
"opened_at": "2026-06-20T15:28:05-03:00",
"closed_at": null,
"duration_min": null,
"customer": { "name": "Joao da Silva", "phone": "12991251886" },
"items_count": 3,
"comandas_count": 3,
"items_gross": 42.00,
"total_paid": 0
}
]
}
Mesma mesa, várias sessões. A mesa física table_number: 10 pode
abrir e fechar várias vezes no mesmo dia — cada abertura é uma sessão com
session_id próprio. Para conciliar o financeiro, use sempre o
session_id como chave única, não o table_number.
Detalhe da sessão GET
Tudo de uma sessão: cabeçalho + cliente, comandas agrupadas, cada item (com adicionais e observação) e todos os pagamentos com troco.
{
"ok": true,
"session_id": 81,
"table_number": 5,
"label": "",
"status": "closed",
"opened_at": "2026-05-29T19:21:10-03:00",
"closed_at": "2026-05-31T04:33:30-03:00",
"duration_min": 1992,
"customer": { "name": null, "phone": null },
"items_count": 6,
"comandas_count": 3,
"items_gross": 43.00,
"total_paid": 46.44,
"by_payment_method": [
{ "method": "credit", "gross": 46.44, "change_back": 0, "net": 46.44, "count": 1 }
],
"extras": { "increase": 0, "discount": 0, "tip": 0 },
"comandas": [
{
"num_order": 183, // id da comanda (0 = itens avulsos/não confirmados)
"total": 8.00, // total da comanda (exclui cancelados)
"items": [
{
"id": 573,
"comanda": 183,
"product_id": 38,
"name": "FANTA UVA",
"quantity": 1,
"unit_price": 8.00,
"total": 8.00,
"additionals": null, // adicionais/complementos (quando houver)
"note": null, // observação do item
"status": "preparando",
"waiter_id": 1304, // garçom que lançou o item
"printed_at": "2026-05-29T20:56:39-03:00",
"paid_at": null,
"created_at": "2026-05-29T20:56:33-03:00"
}
]
}
],
"items": [ /* todos os itens da sessão, na mesma forma de cima */ ],
"payments": [
{
"id": 240,
"type": "payment", // payment | increase | discount | tip
"method": "credit", // money | pix | credit | debit ...
"amount": 46.44,
"change_back": 0, // troco (só faz sentido em dinheiro)
"net": 46.44, // amount - change_back
"created_at": "2026-05-31T04:33:30-03:00"
}
]
}
Sessão de mesa
No Pedidu, cada abertura de mesa é uma sessão independente,
com um session_id único. Quando a mesa é fechada e depois reaberta, nasce uma
nova sessão — por isso a mesma table_number aparece várias
vezes no mesmo dia. Isso é o comportamento normal do salão.
| Campo | Significado |
|---|---|
session_id | Identificador único da abertura. Chave para conciliar o financeiro. |
table_number | Número da mesa física. Pode ser null (balcão/avulso) e repete ao longo do dia. |
label | Rótulo/nome digitado na abertura da mesa (ex.: nome do cliente, "Balcão 2"). |
status | open (em aberto) ou closed (fechada/paga). |
opened_at / closed_at | Abertura e fechamento. closed_at é null enquanto aberta. |
duration_min | Duração em minutos (só quando fechada). |
Comandas & itens
Dentro de uma sessão, os itens são agrupados por comanda
(num_order). Uma sessão pode ter várias comandas — por exemplo, uma por rodada
ou por garçom. Itens com num_order = 0 são avulsos/não confirmados.
- O total de cada comanda e da sessão exclui itens cancelados (
status: "cancelado"). product_id: 0é uma linha de couvert / taxa (não é um produto do catálogo) — onamevem como"Couvert / taxa".additionalstraz os complementos/adicionais do item (quando houver), já decodificados.waiter_idé o garçom que lançou o item.
Fórmula do total de itens (idêntica ao painel):
SUM(unit_price × quantity) sobre os itens com status ≠ "cancelado".
Formas de pagamento
O array payments lista cada lançamento financeiro da mesa. O campo
type separa o que é pagamento do que é ajuste:
money · pix · credit · debit
A quebra em by_payment_method considera apenas type: "payment",
agrupado por method. Para cada método:
| Campo | Significado |
|---|---|
gross | Soma bruta recebida no método. |
change_back | Troco devolvido (positivo; relevante em dinheiro). |
net | Líquido = gross − change_back. É o que efetivamente ficou. |
count | Quantidade de lançamentos nesse método. |
O revenue_paid (resumo) e o total_paid (sessão) usam a mesma
conta do fechamento: SUM(amount) − SUM(troco positivo) sobre todos
os lançamentos. Assim o valor bate com o caixa.
Dados do cliente
O objeto customer traz o que se sabe do cliente daquela sessão:
| Campo | De onde vem |
|---|---|
customer.name | Nome do cliente (quando o pedido veio identificado, ex.: tablet/QR na mesa) ou o rótulo digitado na abertura. Pode ser null. |
customer.phone | Telefone do cliente. Aparece com frequência em pedidos feitos pelo tablet na mesa / QR code. null quando a mesa foi só operada pelo garçom. |
Dado pessoal (LGPD). name e phone são dados do
cliente — trate com o mesmo cuidado do restante do seu financeiro e só use para os fins
combinados com o lojista.
Exemplo completo
Buscando o resumo de um dia e depois abrindo uma sessão específica:
# 1) Resumo de um dia
curl -s "https://SUA-LOJA.com.br/api/v1/mesas/summary?date=2026-05-29" \
-H "Authorization: Bearer SEU_TOKEN_DE_API"
# 2) Sessões abertas/fechadas de um intervalo (máx. 92 dias)
curl -s "https://SUA-LOJA.com.br/api/v1/mesas/sessions?from=2026-05-01&to=2026-05-31&status=close&per_page=50" \
-H "Authorization: Bearer SEU_TOKEN_DE_API"
# 3) Detalhe completo de uma sessão
curl -s "https://SUA-LOJA.com.br/api/v1/mesas/sessions/81" \
-H "Authorization: Bearer SEU_TOKEN_DE_API"
Códigos de erro
| HTTP | Quando | Corpo |
|---|---|---|
200 | Sucesso. | { "ok": true, ... } |
400 | Parâmetro inválido (datas, janela > 92 dias, from > to). | { "ok": false, "error": "..." } |
401 | Token ausente ou inválido. | { "error": "Token inválido ou ausente..." } |
404 | Sessão não encontrada (/sessions/{id}). | { "ok": false, "error": "..." } |
429 | Rate-limit estourado (120/min). | Cabeçalhos Retry-After / X-RateLimit-*. |
503 | Loja sem Token de API forte (< 24 caracteres). API fechada até definir um. | { "error": "API de Mesas indisponível..." } |
Tabela de campos
Objeto session
| Campo | Tipo | Descrição |
|---|---|---|
session_id | int | Id único da abertura de mesa. |
table_number | int|null | Número da mesa física. |
label | string | Rótulo digitado na abertura. |
status | enum | open | closed. |
opened_at | datetime | Abertura (ISO 8601). |
closed_at | datetime|null | Fechamento (ou null). |
duration_min | int|null | Duração em minutos. |
customer | object | { name, phone } — ver cliente. |
items_count | int | Qtd. de itens (exclui cancelados). |
comandas_count | int | Número de comandas distintas. |
items_gross | number | Soma dos itens (não é o pago). |
total_paid | number | Valor pago líquido de troco. |
Objeto item
| Campo | Tipo | Descrição |
|---|---|---|
comanda | int | num_order da comanda (0 = avulso). |
product_id | int | Id do produto (0 = couvert/taxa). |
name | string | Nome do produto (resolvido). |
quantity | int | Quantidade. |
unit_price | number | Preço unitário. |
total | number | unit_price × quantity. |
additionals | array|object|null | Adicionais/complementos decodificados. |
note | string|null | Observação do item. |
status | string | Situação do item (cancelado não soma). |
waiter_id | int|null | Garçom que lançou. |
printed_at / paid_at / created_at | datetime|null | Marcos de tempo do item. |
Objeto payment
| Campo | Tipo | Descrição |
|---|---|---|
type | enum | payment | increase | discount | tip. |
method | string|null | money | pix | credit | debit… |
amount | number | Valor do lançamento. |
change_back | number | Troco (positivo). |
net | number | amount − change_back. |