A Malvo não assina os payloads de webhook com HMAC. Em vez disso, a autenticidade de uma entrega é garantida por dois mecanismos combinados: headers customizados e IP allowlisting.

Headers customizados por webhook

Cada webhook pode carregar um mapa de headers (nome → valor) que é enviado verbatim em toda entrega. É aí que você coloca o seu segredo compartilhado.
Propriedades importantes dos headers:
  • Write-only. São aceitos no POST /webhooks e no PATCH /webhooks/{id}, mas nunca retornados em nenhum GET/list e nunca exibidos no Dashboard.
  • Somente via API. Não há como definir ou ler headers pela UI — apenas administradores e owners editam webhooks no Dashboard, e ainda assim os headers ficam ocultos.

Rotação de segredos via PATCH

Como os headers 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.
O IP de egress estático único está disponível no seu Dashboard, na seção Webhooks. Use sempre o valor publicado lá — não codifique um IP a partir de qualquer outra fonte.

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).
Proteção contra replay: persista o 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.
Responda 2XX antes do trabalho pesado. Processamento síncrono antes do 200 estoura o limite de 5 segundos e a Malvo passa a reentregar o mesmo evento até 9 vezes.

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.