Pular para o conteúdo principal

Catálogo de Eventos

Webhooks são disparados quando algo relevante acontece em um pedido, item de envio, transação de pagamento ou saque. Cada UserWebhook cadastrado escolhe um evento (campo event) — para receber vários, cadastre múltiplos webhooks.

Webhook por pedido (postback_url)

Além dos webhooks globais, você pode informar um postback_url ao criar um pedido. Essa URL recebe os eventos order.* e order_item.* daquele pedido, com o mesmo envelope descrito abaixo, somando-se aos webhooks globais (não os substitui). A única diferença: entregas de postback não incluem o header X-Webhook-Signature — proteja a URL com HTTPS + um token secreto no path/query.

Estrutura comum (envelope)

Todo webhook recebido tem o mesmo envelope. Apenas data muda conforme o evento:

{
"event": "<event.name>",
"occurred_at": "2026-04-27T13:45:12.123Z",
"delivery_attempt": 1,
"data": { }
}
CampoTipoDescrição
eventstringNome do evento (ex.: order.paid)
occurred_atISO 8601 (UTC)Quando o evento ocorreu no sistema
delivery_attemptintegerNúmero da tentativa atual (1 = primeira)
dataobjectPayload específico do evento

Headers HTTP enviados

HeaderConteúdo
Content-Typeapplication/json
User-AgentWebhooks/1.0
X-Webhook-EventNome do evento
X-Webhook-Event-IdID único da entrega (ex.: evt_550e8400e29b41d4a716446655440000) — use para idempotência e deduplicação
X-Webhook-Signaturesha256=<hmac_hex> — veja Segurança

Política de retentativas

  • Sucesso: qualquer resposta HTTP 2xx encerra a entrega.
  • Falha: qualquer outra resposta (incluindo 4xx) ou erro de rede aciona retry com backoff exponencial + jitter.
  • Tentativas: até 8 vezes ao longo de horas; após esgotar, a entrega entra em estado dead.
  • Reenfileirar manualmente: disponível via painel ou via POST /config/webhooks/{id}/deliveries/{delivery_id}/resend/.

Mascaramento de dados sensíveis

  • CPF do comprador: 123.***.***-00
  • E-mail: car***@example.com
  • Chave PIX: aplicação automática conforme tipo (e-mail, CPF, telefone ou chave aleatória)

Eventos disponíveis

Pedido

EventoQuando dispara
order.createdPedido criado (status PENDING)
order.paidPedido pago (status PAID)
order.expiredPedido expirado (status EXPIRED)
order.cancelledPedido cancelado (status CANCELLED)
order.refundedPedido estornado (status REFUNDED)
order.chargebackChargeback aberto (status CHARGEBACK)

Envio

EventoQuando dispara
order_item.shippedItem enviado (rastreio adicionado)
order_item.deliveredItem entregue

Pagamento

EventoQuando dispara
payment.pix_qr_code_createdQR Code PIX gerado (transação CRIADA)
payment.approvedPagamento aprovado (transação APPROVED)
payment.refundedPagamento estornado (transação REFUNDED)

Saque

EventoQuando dispara
withdrawal.requestedSaque solicitado (status PENDING)
withdrawal.approvedSaque aprovado
withdrawal.deniedSaque negado
withdrawal.processingSaque em processamento
withdrawal.paidSaque concluído com sucesso
withdrawal.failedSaque falhou

Exemplos de payload

order.paid

{
"event": "order.paid",
"occurred_at": "2026-04-27T13:45:12.123Z",
"delivery_attempt": 1,
"data": {
"order": {
"uuid": "9f1c2d3e-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"status": "PAID",
"method": "PIX",
"gross_amount": 15000,
"shipping_amount": 500,
"discount_amount": 0,
"fee_amount": 149,
"net_amount": 14851,
"created_at": "2026-04-27T13:30:00Z",
"paid_at": "2026-04-27T13:45:12Z"
},
"seller": { "name": "João Vendedor" },
"affiliate": { "name": "Maria Afiliada" },
"customer": {
"name": "Carlos Comprador",
"tax_id": "123.***.***-00",
"tax_id_type": "CPF",
"email": "car***@example.com"
},
"items": [
{
"product_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"product_name": "Produto A",
"quantity": 2,
"unit_amount": 7000,
"line_total_amount": 14000
}
]
}
}

order_item.shipped

{
"event": "order_item.shipped",
"occurred_at": "2026-04-28T10:12:33.456Z",
"delivery_attempt": 1,
"data": {
"order": { "uuid": "9f1c2d3e-...", "status": "PAID" },
"item": {
"product_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"product_name": "Produto A",
"quantity": 2,
"shipping_status": "SHIPPED",
"tracking_code": "BR123456789CD",
"shipped_at": "2026-04-28T10:12:33Z",
"delivered_at": null
},
"seller": { "name": "João Vendedor" }
}
}

payment.approved

{
"event": "payment.approved",
"occurred_at": "2026-04-27T13:45:12.123Z",
"delivery_attempt": 1,
"data": {
"transaction": {
"id": "1f2c3d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"method": "PIX",
"status": "APPROVED",
"gross_amount": 15000,
"fee_amount": 149,
"net_amount": 14851,
"approved_at": "2026-04-27T13:45:12Z"
},
"order": { "uuid": "9f1c2d3e-...", "status": "PAID" },
"seller": { "name": "João Vendedor" }
}
}

withdrawal.paid

{
"event": "withdrawal.paid",
"occurred_at": "2026-04-29T16:20:05.789Z",
"delivery_attempt": 1,
"data": {
"withdrawal": {
"uuid": "5b6c7d8e-9f0a-1b2c-3d4e-5f6a7b8c9d0e",
"status": "PAID",
"gross_amount": 14851,
"requested_at": "2026-04-29T15:00:00Z",
"decided_at": "2026-04-29T16:20:05Z"
},
"bank_data": {
"pix_key": "car***@example.com",
"pix_key_type": "email"
},
"seller": { "name": "João Vendedor" }
}
}
informação

Valores possíveis de pix_key_type: email, cpf, phone, random.


Boas práticas no receptor

  1. Verifique a assinatura HMAC antes de processar — veja Segurança.
  2. Deduplique pelo header X-Webhook-Event-Id — em casos raros (retries que demoram) o mesmo evento pode chegar duas vezes; persista o valor do header recebido e ignore o duplicado.
  3. Responda 2xx em até ~1s — não processe o payload na mesma request; coloque numa fila interna e processe assíncrono.
  4. Trate todos os status — não confie só no event para decidir se é "paid". Use os campos de status dentro de data para o estado real.
  5. Mantenha o secret seguro — ele só é exibido uma vez na criação. Se vazar, gere um novo webhook (a rotação aposenta o secret antigo).