Pedidu API
Pedidu · API de Integração

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

  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.