Saltar al contenido

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
verify.js
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.

Eventos a los que te puedes suscribir.
GrupoEventosUso típico
Entregaemail.sent, email.delivered, email.delivery_delayedMarcar un mensaje como entregado en tu app
Problemasemail.bounced, email.complained, email.rejected, email.failed, email.suppressedDejar de enviar a una dirección, o avisar a soporte
Ciclo de vidaemail.accepted, email.scheduled, email.queued, email.canceled, email.submission_unknownRegistros de auditoría y envíos programados
Dominiosdomain.created, domain.status_changed, domain.deletedSaber cuándo se rompe el DNS
Proyectosuppression.created, suppression.deleted, project.quota_warning, project.reputation_warning, project.sending_paused, project.sending_resumedAlertas 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 id del evento.
  • El orden no está garantizado: email.delivered puede llegar antes que email.sent.
  • Responde con cualquier 2xx en 10 segundos y haz el trabajo después.
  • Tras 20 fallos seguidos el endpoint se desactiva, y una respuesta 410 lo desactiva al momento.

Recibe tu primer evento.

  1. 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. 2

    Verifica la firma

    Usa el cuerpo en bruto, compara en tiempo constante y rechaza las marcas de tiempo antiguas.

  3. 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