Realtime

Webhooks

Firma, entrega, inspecciona, reintenta y repara webhooks.

Horato firma eventos salientes, conserva entregas y permite replay para que los consumidores puedan recuperarse de fallos.

Firmas

Cada entrega es un POST con el evento JSON como cuerpo y dos headers: `horato-event` (el tipo de evento) y `horato-signature` con la forma `t=<timestamp>,v1=<firma>`. La firma es `HMAC-SHA256(secret, "<timestamp>.<cuerpo_crudo>")` en hex, usando el secreto de firma que se devuelve una sola vez al crear el webhook.

Verifica sobre el cuerpo crudo antes de parsear JSON, compara firmas en tiempo constante y rechaza timestamps de más de unos minutos para reducir el riesgo de replay. Los nombres antiguos `x-okcal-event` / `x-okcal-signature` se envían como alias para consumidores que verificaban contra los nombres previos al rebrand.

Verificación en Nodejavascript
import crypto from "node:crypto";

function verifyHoratoWebhook(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`)
    .digest("hex");
  const ok = crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return ok && fresh;
}

verifyHoratoWebhook(rawBody, req.headers["horato-signature"], process.env.HORATO_WEBHOOK_SECRET);

Catálogo de eventos

Suscribe un webhook a tipos de evento específicos, u omite el filtro para recibirlos todos. Los eventos se nombran por dominio.

  • Conexiones: `connection.reauth_required`.
  • Email: `email.received`, `email.sent`, `email.draft.created`, `email.draft.updated`.
  • Agendamiento: `scheduling.booking.created`, `scheduling.booking.rescheduled`, `scheduling.booking.cancelled`.
  • Grabación: `recording.bot.started`, `recording.meeting.status_change`, `recording.transcript.updated`, `recording.recording.completed`.
  • La lista completa y vigente está en `/docs/openapi.json` y en la columna de eventos de la referencia.

Reparación de entregas

Horato reintenta entregas fallidas con backoff exponencial y mueve los eventos agotados a una cola dead-letter. Usa el inspector cuando un receptor devuelva un estado distinto de 2xx: arregla el receptor, reproduce la entrega y luego limpia las colas dead-letter de forma intencional.

  • Lista entregas con `/v1/webhooks/deliveries`.
  • Reproduce una entrega con `/v1/webhooks/deliveries/{delivery_id}/replay`.
  • Reencola eventos dead-letter con `/v1/webhooks/dead-letter/{event_id}/requeue`.