Skip to main content
Webhooks empurram os eventos para o seu servidor assim que acontecem, evitando ficar consultando GET /api/v2/get. Você cadastra um endpoint, escolhe os eventos que interessam e a Escrybe faz um POST com um payload JSON nele. Os endpoints são gerenciados no painel em Configurações → Webhooks (/opcoes/webhooks), onde você também vê cada tentativa de entrega, a resposta que seu servidor deu e pode reenviar uma que falhou.

Eventos

Envelope

Toda entrega tem o mesmo formato no nível de cima:
data é aditivo: campos novos podem aparecer com o tempo. Leia os campos que você usa e ignore o resto, em vez de validar contra um schema fechado.

Ambiente

environment diz qual ambiente da Escrybe produziu o evento: O mesmo valor vai no header X-Webhook-Environment, então dá para desviar ou descartar um evento antes de fazer o parse do corpo.
Se você aponta os dois ambientes para o mesmo endpoint, use esse campo para separá-los. Pedidos de homologação podem ser levados por todo o ciclo de vida na mão, então produzem os mesmos eventos que a produção — é o environment que os distingue.

Headers

Verificando a assinatura

Quando você define um segredo, cada entrega é assinada com HMAC-SHA256 sobre o corpo bruto da requisição. Compare com uma função de tempo constante e leia o corpo antes de qualquer parse de JSON ou middleware que o reescreva.

Entrega e retentativas

  • Seu endpoint precisa responder 2xx em até 30 segundos.
  • Uma entrega que falha é tentada de novo até 3 vezes, com backoff exponencial: 5, 10 e 20 minutos.
  • Após 3 falhas consecutivas em eventos reais o endpoint é pausado automaticamente e você recebe um e-mail. Reative no painel.
  • O corpo da resposta é armazenado (até 10.000 caracteres) para você ver o que seu servidor respondeu.
  • Entregas de teste nunca são repetidas e nunca contam para a pausa.
A entrega é at-least-once. Uma retentativa pode chegar depois do seu servidor já ter processado o evento — por exemplo quando ele respondeu com atraso. Use o delivery_id como chave, ou faça o handler idempotente por id do pedido e status.

Payloads

order.created

Pedidos de carta, telegrama e e-Carta:
Pedidos de e-mail registrado trazem type: "email" e um data diferente:
Pedidos de WhatsApp levam type: "whatsapp". status é o status do PEDIDO e delivery_status o estado de entrega no WhatsApp (pending, processing, sent, delivered, read, failed, cancelled) — duas coisas diferentes, nunca misturadas:

order.status_updated

Para type: "email" o corpo traz opened e date_opened no lugar de tracking e files. return_reason só é preenchido quando o pedido vira Devolvido (status.new = 6); em qualquer outra mudança é null. É a última tentativa de entrega que falhou no rastreio dos Correios:
code e type são o par de evento dos Correios e são estáveis — use-os para classificar; description é o texto dos Correios, para exibir. Os mais comuns: BDI 26 prazo de retirada encerrado, BDE 10 mudou-se, BDE 6 desconhecido no local, BDE 21 última tentativa de entrega, BDE 8 endereço inexistente, BDE 7 endereço insuficiente, BDE 4 recusou-se a receber. Pode ser null mesmo num Devolvido, quando os Correios não informaram o motivo.
Um pedido vira Devolvido quando os Correios registram a entrega ao remetente (tracking.updated com status_delivery: "delivered_to_sender", seguido deste order.status_updated), ou quando o envelope volta fisicamente para a Escrybe. Nem toda devolução aparece no rastreio: trate status.new = 6 como o sinal definitivo.
Status de carta, telegrama e e-Carta: Status de e-mail registrado: Para type: "whatsapp" o corpo traz delivery_status em vez de tracking e files. Valores de status para pedidos de WhatsApp:

tracking.updated

event_detail_type é new_tracking_code quando o código é atribuído pela primeira vez e new_tracking_record quando os Correios registram novos eventos. tracking_records é o objeto dos Correios como eles devolvem, do evento mais novo para o mais antigo. status_delivery é vazio, delivered, going_back_to_sender ou delivered_to_sender.

tracking.updated para WhatsApp

event_detail_type é sent, delivered, read ou failed quando o WhatsApp informa o estado da sua mensagem, reply quando o destinatário a respondeu, e auto_reply_sent quando o aviso automático da plataforma chegou ao destinatário. O WhatsApp manda os statuses fora de ordem e às vezes em dobro; leia delivery_status (o estado atual) em vez de contar eventos.
A resposta só chega ao seu webhook quando pôde ser vinculada a este pedido sem dúvida: o destinatário citou a sua mensagem (link_type: context) ou a sua foi a única mensagem enviada para aquele número nos últimos 30 dias (link_type: phone_match). Respostas a um número que recebeu mensagens de mais de uma conta ficam registradas na plataforma, mas nunca são atribuídas a um pedido — nem enviadas a webhook. forwarded é a marca do próprio WhatsApp (1 encaminhada, 2 encaminhada muitas vezes); identity_hash identifica o aparelho que respondeu e só vem quando a verificação de identidade está ligada no número que recebeu. certified_timestamp é o carimbo RFC 3161 da resposta; status pode ainda estar pending quando o evento dispara. Com event_detail_type: "auto_reply_sent" o objeto extra é auto_reply: { "provider_message_id", "sent_at", "to" }.

rr.created

rr_type é rr para o AR físico digitalizado e rr_electronic para o que os Correios devolvem digitalmente. file vem null quando o documento não pôde ser lido.
Este payload embute o documento inteiro em base64 e é bem maior que os outros. Garanta que seu endpoint aceita um corpo de alguns megabytes.

webhook.test

Testando no homolog

homolog.escrybe.com.br é uma cópia completa da plataforma, com banco e credenciais próprios. Os pedidos de lá permitem exercitar todos os eventos sem postar nada de verdade: na página de pedidos você move o pedido pelos status na mão e adiciona eventos de rastreio, e cada ação dispara o mesmo webhook que a produção dispararia, marcado com environment: "homolog".
E-mail registrado e WhatsApp são entregues de verdade a partir do homolog, então os destinatários precisam estar cadastrados em Whitelist de homologação (/homolog-whitelist). Quem não estiver na lista tem o envio recusado e o pedido fica com status de falha, explicando o motivo.
Peça acesso ao homolog para o suporte.