Volver al inicioDocs

Documentación

Todo lo necesario para recibir un email como una solicitud HTTP firmada.

Tu dirección

Cada cuenta recibe una dirección permanente con la forma inbox_ab12cd34ef@tempy.uk. No se puede cambiar y es la única que llega a tu webhook. Reenvíale correo desde cualquier proveedor, o da la dirección directamente.

inbox_7wgaav5mdb@tempy.uk

El payload

Un POST HTTPS por email, enviado como application/json. El cuerpo lleva el id del email, from, to, subject, los cuerpos de texto y HTML, todas las cabeceras originales y un array de adjuntos. Una cabecera que aparece una vez es una cadena; una cabecera repetida es un array de cadenas, en el orden en que venían en el mensaje.

Payload
{
  "id": "em_wnrppxfrp5p9wvv1",
  "from": "you@gmail.com",
  "to": "inbox_7wgaav5mdb@tempy.uk",
  "subject": "Your verification code",
  "text": "Your code is 482913",
  "html": "<p>Your code is <b>482913</b></p>",
  "headers": {
    "message-id": "<…@mail.gmail.com>"
  },
  "attachments": [],
  "received_at": "2026-09-03T10:42:11Z"
}

Verificar la firma

Cada solicitud lleva una cabecera X-Mailhook-Signature: sha256= seguido del HMAC-SHA256 del cuerpo bruto, con tu secreto de firma como clave. Calcúlalo sobre los bytes que recibiste, antes de parsear el JSON, y compara en tiempo constante. Rechaza todo lo que no coincida.

X-Mailhook-Signature: sha256=8f1c4e9a…

Verificar la firmaNode.jsPython

Rotar el secreto

Mientras dura una rotación, la firma principal se sigue calculando con tu secreto actual y el nuevo llega en X-Mailhook-Signature-Next. X-Mailhook-Secret-Version indica la versión que hay detrás de la cabecera principal. Despliega el secreto nuevo y luego actívalo: entre medias no se rompe nada.

X-Mailhook-SignatureX-Mailhook-Signature-NextX-Mailhook-Secret-Version

Reintentos y tiempos de espera

Cualquier 2xx cuenta como entregado. Un 5xx, un 429 o un fallo de red se reintenta hasta cinco veces, con unos 30 segundos, 1 minuto, 2 minutos y 4 minutos de separación más jitter. Un 4xx distinto de 429 es permanente y no se reintenta nunca. Tu endpoint tiene 30 segundos para responder.

5×+30s+1m+2m+4m30s

Adjuntos

Los archivos no van dentro del JSON. Cada adjunto lleva su nombre, tipo de contenido, tamaño y una URL firmada válida durante 24 horas desde que llegó el email. Descarga lo que necesites dentro de esa ventana: después el archivo desaparece con el resto del contenido.

filename · content_type · size · url · expires_at

Límites

Un mensaje puede ocupar hasta 20 MB con los adjuntos incluidos; lo que pase de ahí se rechaza en la puerta para que el remitente reciba un rebote sobre el que pueda actuar. Las solicitudes de prueba y los reintentos manuales tienen límite por cuenta, y una solicitud de prueba lleva X-Mailhook-Test: true para que la distingas.

20 MB · X-Mailhook-Test: true

Idempotencia

Un reintento reenvía el mismo cuerpo con el mismo id de email, así que usa ese id como clave de deduplicación. Dos POST con un mismo id son el mismo email, no dos.

X-Mailhook-Id: em_wnrppxfrp5p9wvv1