Un endpoint de webhook es una URL en tu servidor a la que DynamiHost llama cuando ocurre algo en tu cuenta. Hoy el catálogo de eventos tiene un solo evento: scan.created, enviado en cada escaneo de tus códigos.
Configura uno
- Abre Webhooks en el panel y añade la URL de tu endpoint. Debe ser una dirección HTTPS pública.
- Guarda el secreto de firma mostrado para el endpoint. Lo necesitas para verificar que las entregas vienen realmente de DynamiHost.
- Usa el botón Probar para enviar una entrega de ejemplo y observar el registro de tu servidor.

Cómo es una entrega
http
POST /your-endpoint HTTP/1.1
Content-Type: application/json
x-dynamihost-event: scan.created
x-dynamihost-signature: 9f2c... (hex HMAC)
{"event": "scan.created", "timestamp": 1792400000, "data": { "...": "scan details" }}Verifica la firma
La firma es el HMAC-SHA256 hexadecimal de timestamp + "." + raw body, con el secreto de firma de tu endpoint como clave. Verifícala antes de confiar en una entrega:
js
import { createHmac, timingSafeEqual } from "node:crypto";
function isGenuine(secret, timestamp, rawBody, header) {
const expected = createHmac("sha256", secret)
.update(timestamp + "." + rawBody, "utf8")
.digest("hex");
const a = Buffer.from(expected, "hex");
const b = Buffer.from(header, "hex");
return a.length === b.length && timingSafeEqual(a, b);
}Verifica siempre contra el cuerpo sin procesar de la petición, exactamente como se recibió. Analizar y recodificar el JSON primero cambiará los bytes y todas las comprobaciones de firma fallarán.
Reintentos y desactivación automática
- Las entregas fallidas (respuestas no 2xx, tiempos agotados, hosts inalcanzables) se reintentan con retrasos crecientes.
- Un endpoint que sigue fallando se desactiva automáticamente tras 10 fallos consecutivos, y la cuenta es notificada por correo. Corrige el receptor y vuelve a activarlo desde la página Webhooks.
- Rota el secreto de firma desde la misma página siempre que pueda haberse filtrado. El secreto antiguo deja de funcionar inmediatamente.
Responde a las entregas rápido y haz el trabajo lento después. Devuelve un 2xx en cuanto hayas almacenado el evento; los endpoints que procesan durante segundos son los que agotan el tiempo y se reintentan.