Entrega y Firmas

Platica envía cada webhook como un POST con Content-Type: application/json. Si configuras un secret, también incluimos una firma HMAC-SHA256 para que puedas validar que el evento viene de Platica.

Envelope

Los eventos de conversaciones, mensajes y clientes llegan con este envelope:

{
  "id": "9f8c...",
  "event": "conversation.created",
  "workspaceId": "ws_456",
  "timestamp": "2026-05-06T19:00:00.000Z",
  "source": "system.conversation.created",
  "resourceType": "conversation",
  "resourceId": "conv_123",
  "changes": null,
  "data": {}
}
CampoDescripción
idIdentificador único del evento
eventNombre del evento recibido
workspaceIdWorkspace donde ocurrió
timestampFecha ISO-8601 del evento
sourceOrigen del evento, en formato <origin>.<resource>.<action> — ver Campo source
resourceTypeconversation, message o client
resourceIdID del recurso afectado
changesDiff del cambio, cuando aplica
dataSnapshot normalizado del recurso

Para ver el contenido de data y los valores posibles de source, consulta Payloads .

Headers

HeaderDescripción
Content-Typeapplication/json
User-AgentUser-Agent de Platica
X-Webhook-EventIgual a payload.event
X-Webhook-IdIdentificador del webhook configurado
X-Webhook-Event-IdIgual a payload.id
X-Webhook-Resource-TypeTipo de recurso afectado
X-Webhook-Resource-IdID del recurso afectado
X-Webhook-TimestampIgual a payload.timestamp
X-Webhook-Signaturesha256=<hex> si configuraste secret

Validar firma

La firma se calcula con HMAC-SHA256 sobre el cuerpo crudo (rawBody) que recibió tu endpoint:

sha256=<hmac_sha256(secret, rawBody)>

Ejemplo en Node.js:

const crypto = require('crypto');

function verifyWebhook(secret, rawBody, signatureHeader) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signatureHeader)
  );
}

Respuestas y reintentos

Tu endpoint debe responder con un código 2xx cuando procese el evento correctamente. Para eventos de conversaciones, mensajes y clientes, el cuerpo de tu respuesta no se usa para continuar ningún flujo; sólo confirma que recibiste el webhook.