Delivery and Signatures

Platica sends every webhook as a POST with Content-Type: application/json. If you configure a secret, we also include an HMAC-SHA256 signature so you can verify the event comes from Platica.

Envelope

Conversation, message, customer, and WhatsApp Flows events arrive in this 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": {}
}
FieldDescription
idUnique event identifier
eventName of the event received
workspaceIdWorkspace where it happened
timestampISO-8601 date of the event
sourceOrigin of the event in <origin>.<resource>.<action> format — see the source field
resourceTypeconversation, message, client, or flow_response
resourceIdID of the affected resource
changesChange diff, when applicable
dataNormalized snapshot of the resource

For the contents of data and the possible values of source, see Payloads .

Headers

HeaderDescription
Content-Typeapplication/json
User-AgentPlatica's User-Agent
X-Webhook-EventMatches payload.event
X-Webhook-IdIdentifier of the configured webhook
X-Webhook-Event-IdMatches payload.id
X-Webhook-Resource-TypeAffected resource type
X-Webhook-Resource-IdID of the affected resource
X-Webhook-TimestampMatches payload.timestamp
X-Webhook-Signaturesha256=<hex> if you configured secret

Validate the signature

The signature is computed with HMAC-SHA256 over the raw body (rawBody) received by your endpoint:

sha256=<hmac_sha256(secret, rawBody)>

Node.js example:

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)
  );
}

Responses and retries

Your endpoint must respond with a 2xx status code when it processes the event successfully. For conversation, message, and customer events, your response body is not used to continue any flow; it only confirms the webhook was received.