Pedidu API
Pedidu · Documentação de APIs

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:

Parte 1 · Push (webhook)

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

  1. O cliente faz um pedido no seu cardápio digital, PDV, balcão ou marketplace (iFood/99Food).
  2. O lojista aceita / o pedido muda de status (entra em produção, sai pra entrega, é cancelado…).
  3. O Pedidu monta o objeto do pedido e faz POST na sua webhookApi.
  4. 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çãoDescriçã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:

POST https://seu-sistema.com/webhook/pedidu

Cabeçalhos e corpo:

HTTP
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:

CampoTipoDescriçã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:

typeQuando 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) ou order.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

CampoTipoDescrição
idintegerID interno do pedido no Pedidu (chave única).
id_orderstringNúmero público do pedido (mostrado pro cliente / no comprovante).
num_orderintegerSequencial do pedido no dia/loja (ex.: pedido nº 1, 2, 3…).
pin_orderstringPIN / código curto de conferência do pedido.
id_userintegerID do cliente. Use para resolver os dados em Cliente.

Itens & valores

CampoTipoDescrição
purchasejson stringLista de itens do pedido (produtos, quantidades, adicionais, observações). Ver Itens do pedido.
product_pricedecimalValor dos produtos (sem entrega).
subtotal_valuedecimalSubtotal do pedido.
delivery_pricedecimalValor do frete. 0 = grátis ou retirada.
manual_additiondecimalAcréscimo manual aplicado pelo lojista.
manual_discountdecimalDesconto manual aplicado pelo lojista.
cashback_discountdecimalValor abatido via carteira de cashback.

Datas

CampoTipoDescrição
created_atdatetimeQuando o pedido foi feito. Formato YYYY-MM-DD HH:MM:SS.
accepted_atdatetime · nullQuando o lojista aceitou.
updated_atdatetimeÚ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:

JSON · purchase
[
  {
    "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 itemTipoDescrição
product_idintegerID do produto no catálogo da loja.
product_quantityintegerQuantidade pedida do item.
product_optionalstring · nullObservação livre do cliente para esse item.
additional[]arrayAdicionais / opcionais escolhidos. Pode ser vazio.
additional[].namestringNome do adicional (ex.: "Bacon extra", "Tamanho: Grande").
additional[].pricedecimalPreço unitário do adicional.
additional[].qtyintegerQuantidade 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:

CampoTipoDescrição
namestringNome do cliente.
phonestringTelefone (também usado para WhatsApp).
address_namestringRua / logradouro de entrega.
address_numberstringNúmero.
address_regionstringBairro / região de entrega.
address_referencestringPonto 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 · Dinheiro
card · Cartão de crédito/débito
pix · PIX
mercadopago · Mercado Pago (online)
CampoTipoDescrição
payment_optionenummoney · card · pix · mercadopago.
payment_moneybackdecimalTroco para. Valor que o cliente vai pagar em dinheiro (para calcular o troco). 0 = não precisa de troco.
payment_card_idintegerBandeira/maquininha escolhida (quando card). 0 = não informado.
payment_card_feedecimalTaxa da maquininha aplicada.
online_payment_feedecimalTaxa de pagamento online (PIX/Mercado Pago).
payment_coupon_idintegerCupom de desconto aplicado. 0 = sem cupom.
paid_no_chargeboolean1 = 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 loja
3 · Drive-in
4 · Consumir no local
CampoTipoDescrição
delivery_optionenum (1–4)Modo de entrega (ver chips acima).
delivery_pricedecimalValor do frete. 0 = grátis / retirada.
delivery_timestring · nullTempo estimado de entrega/preparo.
delivery_motoboy_idinteger · nullEntregador atribuído (quando despachado por motoboy interno).
car_boardstringPlaca do carro (relevante para Drive-in).
table_numberintegerNú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:

CampoTipoDescrição
agendamented_datedate · nullData agendada para o pedido. null = pronta-entrega (não agendado).
agendamented_hoursstring · nullHorá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:

statusSignificado
newNovo — aguardando o lojista aceitar.
preparationEm produção / preparo (pedido aceito).
deliverySaiu para entrega / pronto para retirada.
endedFinalizado / concluído.
cancelledCancelado.

Origem / canal

O campo type do order indica de qual canal o pedido veio:

cardapio · Cardápio digital
pdv · PDV
balcao · Balcão
ifood · iFood
99food · 99Food
⚠️

Nã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:

Cálculo
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:

JSON · webhook payload
{
  "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:

CampoTipoDescrição
idintegerID interno (chave única).
id_orderstringNúmero público do pedido.
num_orderintegerSequencial do dia/loja.
pin_orderstringPIN de conferência.
id_userintegerID do cliente.
typeenumCanal: cardapio · pdv · balcao · ifood · 99food.
originstring · nullOrigem complementar do pedido.
statusenumnew · preparation · delivery · ended · cancelled.
purchasejson stringItens do pedido.
product_pricedecimalValor dos produtos.
subtotal_valuedecimalSubtotal.
delivery_optionenum (1–4)1 Delivery · 2 Retirar · 3 Drive-in · 4 Local.
delivery_pricedecimalFrete.
delivery_timestring · nullTempo estimado.
delivery_motoboy_idinteger · nullEntregador atribuído.
payment_optionenummoney · card · pix · mercadopago.
payment_moneybackdecimalTroco para (dinheiro).
payment_card_idintegerBandeira/maquininha.
payment_card_feedecimalTaxa da maquininha.
payment_coupon_idintegerCupom aplicado (0 = nenhum).
online_payment_feedecimalTaxa de pagamento online.
paid_no_chargebooleanJá pago / sem cobrança na entrega.
manual_additiondecimalAcréscimo manual.
manual_discountdecimalDesconto manual.
cashback_discountdecimalAbatimento de cashback.
car_boardstringPlaca do carro (Drive-in).
table_numberintegerMesa (Consumir no local).
agendamented_datedate · nullData agendada (null = pronta-entrega).
agendamented_hoursstring · nullHorário agendado.
order_notestring · nullObservação geral do pedido.
order_printedbooleanJá impresso na loja.
integrationsjson · nullMetadados de integrações externas.
created_atdatetimeCriação do pedido.
accepted_atdatetime · nullAceite do lojista.
updated_atdatetimeÚltima atualização.
Parte 2 · Pull (REST + token)

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.

HTTP · cabeçalho
Authorization: Bearer SEU_TOKEN_DE_API

Exemplo com curl:

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

https://SUA-LOJA.com.br/api/v1/mesas
  • 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": false e "error".

Resumo do período GET

GET /api/v1/mesas/summary

Os números fechados de um intervalo — ideal para um card/dashboard no seu financeiro.

Parâmetros (query)

CampoTipoDescrição
date opcionaldateAtalho para um único dia: YYYY-MM-DD. Ignora from/to.
from opcionaldatetimeInício do intervalo. Padrão: hoje 00:00.
to opcionaldatetimeFim 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.

JSON · resposta
{
  "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

GET /api/v1/mesas/sessions

A lista de aberturas de mesa no período, paginada, cada uma com seus totais e o cliente.

Parâmetros (query)

CampoTipoDescrição
from / to / datedatetimeMesma regra do resumo. Filtra pela abertura.
status opcionalenumopen, close ou all (padrão all).
page opcionalintPágina (padrão 1).
per_page opcionalintItens por página (padrão 50, máx. 100).
JSON · resposta
{
  "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

GET /api/v1/mesas/sessions/{id}

Tudo de uma sessão: cabeçalho + cliente, comandas agrupadas, cada item (com adicionais e observação) e todos os pagamentos com troco.

JSON · resposta
{
  "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.

CampoSignificado
session_idIdentificador único da abertura. Chave para conciliar o financeiro.
table_numberNúmero da mesa física. Pode ser null (balcão/avulso) e repete ao longo do dia.
labelRótulo/nome digitado na abertura da mesa (ex.: nome do cliente, "Balcão 2").
statusopen (em aberto) ou closed (fechada/paga).
opened_at / closed_atAbertura e fechamento. closed_at é null enquanto aberta.
duration_minDuraçã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) — o name vem como "Couvert / taxa".
  • additionals traz 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:

payment — money · pix · credit · debit
increase — acréscimo / taxa de serviço
discount — desconto
tip — gorjeta

A quebra em by_payment_method considera apenas type: "payment", agrupado por method. Para cada método:

CampoSignificado
grossSoma bruta recebida no método.
change_backTroco devolvido (positivo; relevante em dinheiro).
netLíquido = gross − change_back. É o que efetivamente ficou.
countQuantidade 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:

CampoDe onde vem
customer.nameNome do cliente (quando o pedido veio identificado, ex.: tablet/QR na mesa) ou o rótulo digitado na abertura. Pode ser null.
customer.phoneTelefone 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:

cURL
# 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

HTTPQuandoCorpo
200Sucesso.{ "ok": true, ... }
400Parâmetro inválido (datas, janela > 92 dias, from > to).{ "ok": false, "error": "..." }
401Token ausente ou inválido.{ "error": "Token inválido ou ausente..." }
404Sessão não encontrada (/sessions/{id}).{ "ok": false, "error": "..." }
429Rate-limit estourado (120/min).Cabeçalhos Retry-After / X-RateLimit-*.
503Loja sem Token de API forte (< 24 caracteres). API fechada até definir um.{ "error": "API de Mesas indisponível..." }

Tabela de campos

Objeto session

CampoTipoDescrição
session_idintId único da abertura de mesa.
table_numberint|nullNúmero da mesa física.
labelstringRótulo digitado na abertura.
statusenumopen | closed.
opened_atdatetimeAbertura (ISO 8601).
closed_atdatetime|nullFechamento (ou null).
duration_minint|nullDuração em minutos.
customerobject{ name, phone } — ver cliente.
items_countintQtd. de itens (exclui cancelados).
comandas_countintNúmero de comandas distintas.
items_grossnumberSoma dos itens (não é o pago).
total_paidnumberValor pago líquido de troco.

Objeto item

CampoTipoDescrição
comandaintnum_order da comanda (0 = avulso).
product_idintId do produto (0 = couvert/taxa).
namestringNome do produto (resolvido).
quantityintQuantidade.
unit_pricenumberPreço unitário.
totalnumberunit_price × quantity.
additionalsarray|object|nullAdicionais/complementos decodificados.
notestring|nullObservação do item.
statusstringSituação do item (cancelado não soma).
waiter_idint|nullGarçom que lançou.
printed_at / paid_at / created_atdatetime|nullMarcos de tempo do item.

Objeto payment

CampoTipoDescrição
typeenumpayment | increase | discount | tip.
methodstring|nullmoney | pix | credit | debit…
amountnumberValor do lançamento.
change_backnumberTroco (positivo).
netnumberamount − change_back.