Webhooks de email que puedes verificar, reintentar y reenviar.
Sabe cuándo un email se entrega, rebota o recibe una queja, con eventos en los que tu endpoint puede confiar y que no se pierden sin avisar.
- Sin tarjeta para probar
- Precios en euros, sin 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")));
}Lo que lleva cada entrega.
Una firma sobre el cuerpo en bruto
Outstamp-Signature: v1=es un HMAC-SHA256 del id de la entrega, la marca de tiempo y el cuerpo exacto. Rechaza todo lo que tenga más de 5 minutos.Reintentos durante 48 horas
10 intentos: al instante, y después a los 5 segundos, 1, 5 y 30 minutos, y 2, 6, 12, 24 y 48 horas.
Reenvío durante 30 días
Reenvía cualquier evento desde el panel o la API. Recibe un nuevo id de entrega y conserva su id de evento.
Rotación sin interrupciones
Al rotar el secreto, se envían la firma antigua y la nueva durante 24 horas.
Eventos a los que te puedes suscribir.
| Grupo | Eventos | Uso típico |
|---|---|---|
| Entrega | email.sent, email.delivered, email.delivery_delayed | Marcar un mensaje como entregado en tu app |
| Problemas | email.bounced, email.complained, email.rejected, email.failed, email.suppressed | Dejar de enviar a una dirección, o avisar a soporte |
| Ciclo de vida | email.accepted, email.scheduled, email.queued, email.canceled, email.submission_unknown | Registros de auditoría y envíos programados |
| Dominios | domain.created, domain.status_changed, domain.deleted | Saber cuándo se rompe el DNS |
| Proyecto | suppression.created, suppression.deleted, project.quota_warning, project.reputation_warning, project.sending_paused, project.sending_resumed | Alertas operativas |
Tenlo en cuenta antes de construir.
Son las reglas de cualquier sistema de webhooks honesto.
- La entrega es al menos una vez: deduplica por el
iddel evento. - El orden no está garantizado:
email.deliveredpuede llegar antes queemail.sent. - Responde con cualquier
2xxen 10 segundos y haz el trabajo después. - Tras 20 fallos seguidos el endpoint se desactiva, y una respuesta
410lo desactiva al momento.
Recibe tu primer evento.
- 1
Añade un endpoint
Una URL HTTPS pública y los tipos de evento que quieras. El secreto de firma se muestra una sola vez.
- 2
Verifica la firma
Usa el cuerpo en bruto, compara en tiempo constante y rechaza las marcas de tiempo antiguas.
- 3
Lanza un evento de prueba
Envía a
[email protected]con una clave de prueba, o usa el botón de prueba del panel.
Preguntas sobre webhooks.
¿Los webhooks van firmados?
Sí. Cada entrega lleva Outstamp-Signature: v1=, un HMAC-SHA256 del id de la entrega, la marca de tiempo y el cuerpo en bruto.
¿Y si mi endpoint está caído?
Reintentamos 10 veces durante 48 horas. Tras 20 fallos seguidos el endpoint se desactiva, y puedes reenviar lo que se perdió durante 30 días.
¿Los emails de prueba disparan webhooks?
Sí. Los envíos de prueba producen los mismos eventos y webhooks que los de producción, marcados como test.
Recibe hoy tu primer evento firmado.
Las claves de prueba y el simulador son gratis, sin tarjeta.
- Sin tarjeta para probar
- Precios en euros, sin IVA