Docs/Webhooks/Conversation

conversation.updated

Fired when a new message is received in a guest conversation, or a conversation status changes.

Payload

Every delivery uses the same outer envelope (event, eventId, apiVersion, timestamp, data). Dedupe on eventId — it stays stable across retries and replays, while the X-Repull-Delivery-Id header changes on every attempt.

{
  "event": "conversation.updated",
  "timestamp": "2026-04-04T15:45:00Z",
  "data": {
    "threadId": "thread_abc123",
    "reservationId": "215906",
    "platform": "airbnb",
    "latestMessage": {
      "sender": "guest",
      "text": "What time can we check in?",
      "sentAt": "2026-04-04T15:44:30Z"
    }
  }
}

Verifying signatures

Every delivery includes a timestamped X-Repull-Signature header of the form t=<unix_ts>,v1=<hex>, where v1 is HMAC-SHA256(signing_secret, `${t}.${raw_body}`). Verify it before processing — see Verify Signatures for full Node.js and Python examples.

Use the raw body

Sign the raw request body exactly as received, not a re-stringified JSON object. Re-serialisation can reorder keys or change whitespace and break the signature.

Example handler

if (event === 'conversation.updated') {
  const { latestMessage } = data
  if (latestMessage.sender === 'guest') {
    // Auto-respond or notify host
    console.log('New guest message:', latestMessage.text)
  }
}

Tip: Acknowledge with a 2xx status within 10 seconds. Failed deliveries are retried up to 5 times with exponential backoff.Webhook reliability →

AI