Documentación

Webhooks

Recibe eventos de conversaciones, tickets y presupuesto en tu servidor, firmados y con reintentos.

Configura endpoints en Configuración → Webhooks. Cada endpoint tiene una URL, un secreto y la lista de eventos a los que se suscribe.

Eventos

Evento Cuándo se envía
conversation.started Se abre una conversación nueva en el widget.
conversation.handoff El agente escala a una persona (por intención, horario, presupuesto o error técnico).
conversation.resolved La conversación se cierra, de forma automática o por una persona.
ticket.status_changed Un ticket cambia de estado.
budget.exceeded El costo de IA del mes superó el presupuesto de la cuenta; el agente pasa a escalar a humano.

Formato

{
  "id": "0192f1c3-...",
  "event": "conversation.handoff",
  "tenant_id": "0192f0aa-...",
  "created_at": "2026-09-01T15:04:05.000Z",
  "data": { "conversation_id": "0192f1b9-...", "reason": "intent" }
}

Cabeceras:

Cabecera Contenido
x-talkhero-event Nombre del evento.
x-talkhero-delivery Id único de la entrega (para deduplicar).
x-talkhero-timestamp Milisegundos Unix en el momento del envío.
x-talkhero-signature sha256=<HMAC_SHA256(secreto, timestamp + "." + cuerpo)>

Verificar la firma

Calcula el HMAC sobre timestamp + "." + cuerpo crudo con el secreto del endpoint y compáralo en tiempo constante. Rechaza timestamps con más de 5 minutos de diferencia para evitar repeticiones.

import crypto from "node:crypto";

export function verifyTalkHero(req, secret) {
  const timestamp = req.headers["x-talkhero-timestamp"];
  const expected = "sha256=" + crypto.createHmac("sha256", secret).update(`${timestamp}.${req.rawBody}`).digest("hex");
  const given = req.headers["x-talkhero-signature"] ?? "";
  return expected.length === given.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(given));
}

Reintentos

Responde 2xx en menos de 10 segundos. Cualquier otra respuesta o un timeout provoca reintentos con espera exponencial (30 s, 1 min, 2 min, 4 min, 8 min), hasta 6 intentos. El estado de cada entrega (pending, retrying, delivered, failed) queda registrado en tu cuenta.

Los eventos pueden llegar más de una vez: usa x-talkhero-delivery para deduplicar.