API de Pedidos do Pedidu
Sempre que um pedido é criado, aceito, atualizado ou cancelado na sua loja, o Pedidu envia automaticamente o card completo do pedido para a URL que você configurar. Esta página documenta cada campo: itens, formas de pagamento, forma de entrega, se é agendado ou não e todos os dados do cliente.
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. |