Headers customizados por webhook
Cada webhook pode carregar um mapa deheaders (nome → valor) que é enviado verbatim em toda
entrega. É aí que você coloca o seu segredo compartilhado.
headers:
- Write-only. São aceitos no
POST /webhookse noPATCH /webhooks/{id}, mas nunca retornados em nenhumGET/list e nunca exibidos no Dashboard. - Somente via API. Não há como definir ou ler
headerspela UI — apenas administradores e owners editam webhooks no Dashboard, e ainda assim osheadersficam ocultos.
Rotação de segredos via PATCH
Como osheaders são write-only, a rotação do segredo é feita por um PATCH que reescreve o
mapa:
A resposta do
PATCH confirma a atualização mas não ecoa os headers de volta. Esse é o
único caminho de rotação — os headers não podem ser editados pelo Dashboard por design.IP allowlisting
Todas as entregas saem de um único IP de egress estático. Adicione esse IP à allowlist do seu firewall/WAF para que apenas a Malvo consiga atingir o seu receiver.Checklist de validação do receiver
Valide toda requisição recebida nesta ordem, antes de aplicar qualquer efeito:1
IP de origem
O IP de origem é igual ao IP de egress estático publicado no Dashboard.
2
Header de autenticação
O header de auth customizado bate com o segredo configurado.
3
Corpo e evento
O corpo é JSON válido e
event é um valor que você assina.4
Idempotência
O
eventId ainda não foi processado (deduplique — veja Entrega & Retry).eventId e trate duplicatas como no-op. Opcionalmente, embuta
um claim de timestamp no segredo/JWT e rejeite eventos mais antigos que ~10 minutos — mas calibre
para a janela de retry de até ~3h.
Handler de exemplo
O padrão é: validar → enfileirar → responder 200 → processar async.Troubleshooting de entrega
Próximos passos
Entrega & Retry
O schedule de retry, idempotência e a reconciliação noturna.
Referência — Webhooks
POST, GET, PATCH e DELETE de webhooks, incluindo o campo headers.