Webhooks de email que pode verificar, com novas tentativas e reenvio.
Saiba quando um email é entregue, dá bounce ou gera uma queixa, com eventos em que o seu endpoint pode confiar e que não perde sem dar por isso.
- Sem cartão para testar
- Preços em euros, sem IVA
import { createHmac, timingSafeEqual } from "node:crypto";
export function verify(request, rawBody, secret) {
const id = request.headers["outstamp-id"];
const timestamp = request.headers["outstamp-timestamp"];
const header = request.headers["outstamp-signature"] ?? "";
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${id}.${timestamp}.${rawBody}`)
.digest("hex");
return header.split(",")
.map((part) => part.trim().replace(/^v1=/, ""))
.some((candidate) => candidate.length === expected.length &&
timingSafeEqual(Buffer.from(candidate, "hex"), Buffer.from(expected, "hex")));
}O que cada entrega traz.
Uma assinatura sobre o corpo em bruto
Outstamp-Signature: v1=é um HMAC-SHA256 do id da entrega, do timestamp e do corpo exato. Rejeite tudo o que tenha mais de 5 minutos.Novas tentativas durante 48 horas
10 tentativas: de imediato, depois ao fim de 5 segundos, 1, 5 e 30 minutos, e 2, 6, 12, 24 e 48 horas.
Reenvio durante 30 dias
Reenvie qualquer evento a partir do painel ou da API. Recebe um novo id de entrega e mantém o id do evento.
Rotação sem interrupções
Quando faz a rotação do segredo, a assinatura antiga e a nova são enviadas durante 24 horas.
Eventos que pode subscrever.
| Grupo | Eventos | Uso típico |
|---|---|---|
| Entrega | email.sent, email.delivered, email.delivery_delayed | Marcar uma mensagem como entregue na sua aplicação |
| Problemas | email.bounced, email.complained, email.rejected, email.failed, email.suppressed | Deixar de enviar emails para um endereço, ou alertar o suporte |
| Ciclo de vida | email.accepted, email.scheduled, email.queued, email.canceled, email.submission_unknown | Trilhos de auditoria e envios agendados |
| Domínios | domain.created, domain.status_changed, domain.deleted | Saber quando o DNS deixa de funcionar |
| Projeto | suppression.created, suppression.deleted, project.quota_warning, project.reputation_warning, project.sending_paused, project.sending_resumed | Alertas operacionais |
Planeie isto antes de construir.
São as regras de qualquer sistema de webhooks honesto.
- A entrega é feita pelo menos uma vez: elimine duplicados pelo
iddo evento. - A ordem não é garantida:
email.deliveredpode chegar antes deemail.sent. - Responda com qualquer
2xxem 10 segundos, e faça o trabalho depois. - Após 20 falhas seguidas, o endpoint é desativado, e uma resposta
410desativa-o de imediato.
Receba o seu primeiro evento.
- 1
Adicione um endpoint
Um URL HTTPS público e os tipos de evento que quer. O segredo de assinatura é mostrado uma única vez.
- 2
Verifique a assinatura
Use o corpo em bruto, compare em tempo constante e rejeite timestamps antigos.
- 3
Desencadeie um evento de teste
Envie para
[email protected]com uma chave de teste, ou use o botão de teste no painel.
Perguntas sobre webhooks.
Os webhooks são assinados?
Sim. Cada entrega traz Outstamp-Signature: v1=, um HMAC-SHA256 do id da entrega, do timestamp e do corpo em bruto.
E se o meu endpoint estiver em baixo?
Repetimos 10 vezes ao longo de 48 horas. Após 20 falhas seguidas, o endpoint é desativado, e pode reenviar o que ele perdeu durante 30 dias.
Os emails de teste desencadeiam webhooks?
Sim. Os envios de teste produzem os mesmos eventos e webhooks que os de produção, marcados como test.
Receba hoje o seu primeiro evento assinado.
As chaves de teste e o simulador são grátis, sem cartão.
- Sem cartão para testar
- Preços em euros, sem IVA