Webhooks de Chat en Vivo

Los webhooks permiten que onWebChat envíe eventos a tu servidor en tiempo real. Cada vez que ocurre algo en un chat: se inicia una conversación, se envía un mensaje, se cierra o valora un chat, o se deja un mensaje offline, enviamos un HTTP POST con un cuerpo JSON a una URL que tú eliges.

Es la forma más sencilla de sincronizar las transcripciones de chat en tu CRM o CMS, disparar emails de seguimiento, crear informes personalizados o notificar otro sistema, sin polling.

Los webhooks están disponibles en todos los planes de pago. Cada entrega está firmada para que puedas verificar que realmente proviene de onWebChat.



POST https://your-server.com/onwebchat-webhook
Content-Type: application/json
X-OWC-Event: chat.closed
X-OWC-Delivery: 9381
X-OWC-Signature: sha256=4f1c...c2a9

{ "event": "chat.closed", "siteid": 1234, ... }

Configurar Webhooks

Abre tu panel y ve a Configuración → Webhooks. Haz clic en "Añadir endpoint", pega la URL que debe recibir los eventos, elige qué eventos deseas (o selecciona "Todos los eventos") y guarda.

Al crear un endpoint generamos un secreto de firma. Usarás este secreto para verificar las solicitudes entrantes (ver Verificar Firmas). Puedes regenerarlo en cualquier momento.

Puedes añadir múltiples endpoints por sitio web y revisar las entregas recientes, incluyendo el estado HTTP, número de intentos y cualquier error, directamente en el panel.



/* Dashboard → Settings → Webhooks */

URL      : https://your-server.com/onwebchat-webhook
Events   : chat.closed, message.created
Secret   : whsec_3f9a...   (used to verify requests)
Status   : Enabled

Tipos de Evento

Suscríbete a cualquier combinación de los eventos. Cada mensaje lleva una etiqueta "author" de visitor, agent, ai o trigger, por lo que el mismo evento message.created cubre conversaciones gestionadas por tu equipo y por el chatbot de IA.

Evento Se envía cuando
chat.createdSe inicia un nuevo chat por un visitante, un trigger, el chatbot de IA o un agente.
chat.assignedUn agente asume una conversación: la toma, releva al bot de IA o acepta una transferencia.
message.createdSe envía un nuevo mensaje en un chat. Incluye mensajes del visitante, un agente y el chatbot de IA.
chat.closedUn chat termina. El payload incluye la transcripción completa, detalles del visitante y etiquetas.
chat.ratedUn visitante valora un chat.
offline_message.createdUn visitante envía el formulario offline mientras no hay agentes disponibles.
visitor.updatedUn agente actualiza el nombre, correo electrónico, teléfono o notas del visitante desde el panel.
visitor.bannedUn agente bloquea a un visitante desde el panel.
visitor.unbannedUn agente desbloquea a un visitante previamente bloqueado desde el panel.

Formato del Payload

Cada webhook es un objeto JSON con el mismo sobre: el nombre del evento, tu siteid, una marca de tiempo ISO-8601 y un objeto de datos cuya forma depende del evento.

El ejemplo muestra un payload de chat.closed, que contiene la conversación completa. Eventos más pequeños como message.created o chat.rated incluyen solo los campos relevantes.


{
  "event": "chat.closed",
  "siteid": 1234,
  "created_at": "2026-06-22T07:40:52.322Z",
  "data": {
    "chat_id": 1206836,
    "started_at": "22-06-2026 10:40",
    "closed_at": "2026-06-22T07:40:52.322Z",
    "visitor": {
      "name": "Sarah Chen",
      "email": "sarah@example.com",
      "phone": "",
      "country": "United States",
      "os": "Windows 10",
      "browser": "Chrome 149.0"
    },
    "agents": ["Alex"],
    "labels": [{ "name": "sales", "color": "#4caf50" }],
    "messages": [
      { "author": "visitor", "text": "pricing info please", "time": "10:40" },
      { "author": "ai", "text": "Here is a quick overview...", "time": "10:40" }
    ]
  }
}

Verificar Firmas

Cada solicitud incluye una cabecera X-OWC-Signature con un hash HMAC-SHA256 del cuerpo bruto exacto de la solicitud, calculado con el secreto de firma de tu endpoint.

Para verificar una solicitud, calcula el HMAC-SHA256 del cuerpo bruto con tu secreto y compáralo con el valor de la cabecera (la parte después de "sha256="). Usa una comparación en tiempo constante y siempre hashea el cuerpo bruto.

También recibes X-OWC-Event (el nombre del evento) y X-OWC-Delivery (un id único para idempotencia).


// Node.js / Express
const crypto = require('crypto');

app.post('/onwebchat-webhook',
  express.raw({ type: '*/*' }), (req, res) => {

  const secret = 'whsec_your_secret';
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(req.body)              // raw Buffer
    .digest('hex');

  const got = req.headers['x-owc-signature'] || '';

  // constant-time compare; guard length first (timingSafeEqual throws on mismatch)
  const a = Buffer.from(got), b = Buffer.from(expected);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.status(401).end();

  const payload = JSON.parse(req.body.toString());
  // ... handle payload.event ...
  res.sendStatus(200);
});

Verificar en PHP

La misma comprobación en PHP: lee el cuerpo bruto, recalcula el HMAC con tu secreto y compara con hash_equals().


<?php
$secret  = 'whsec_your_secret';
$payload = file_get_contents('php://input');
$got     = $_SERVER['HTTP_X_OWC_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $got)) {
    http_response_code(401);
    exit;
}

$event = json_decode($payload, true);
// ... handle $event['event'] ...
http_response_code(200);

Reintentos y Desactivación Automática

Tu endpoint debe responder con un estado 2xx lo más rápido posible. Cualquier respuesta no-2xx, timeout o error de conexión se trata como un fallo.

Las entregas fallidas se reintentarán con un retraso creciente: después de 1 minuto, 5 minutos, 20 minutos, 1 hora y 2 horas.

Si un endpoint sigue fallando (5 fallos consecutivos), se desactiva automáticamente y se notifica al propietario del sitio. Reactívalo desde el panel. Devolver HTTP 410 lo desactiva inmediatamente.



    Attempt 1  → immediately
    Attempt 2  → after  1 minute
    Attempt 3  → after  5 minutes
    Attempt 4  → after 20 minutes
    Attempt 5  → after  1 hour
    Attempt 6  → after  2 hours

    5 failures in a row → endpoint disabled

Buenas Prácticas

  • Siempre verifica el X-OWC-Signature antes de confiar en un payload.
  • Responde 2xx rápido, luego realiza el trabajo pesado de forma asíncrona para no agotar el tiempo.
  • Usa X-OWC-Delivery para deduplicar, ya que la misma entrega puede reintentarse tras un fallo transitorio.
  • Sirve tu endpoint sobre HTTPS.
  • Ignora los tipos de eventos desconocidos para que nuevos eventos no rompan tu integración.

¿Listo para empezar? Ver planes o abre Configuración → Webhooks en tu panel.

Usamos cookies y podemos grabar tu sesión para mejorar nuestro sitio web. No se capturan datos personales ni campos de formulario.