reservation.message.updated
A message on a reservation thread was edited on the channel (Airbnb reports the edit). body is the new text, previousBody the text before, editedAt when. Guest and host messages both; read receipts and reactions do not fire it.
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": "reservation.message.updated",
"eventId": "3f1c9a2e-8b7d-4c6a-9e0f-1a2b3c4d5e6f",
"apiVersion": "2026-04",
"timestamp": "2026-05-01T12:34:56.000Z",
"data": {
"reservationId": "235970",
"threadId": "900301",
"from": {
"type": "host",
"name": "Casey"
},
"body": "The unit is free from the 18th, so an early check-in should work. I will confirm by noon.",
"previousBody": "The unit is free from the 18th, so an early check-in shoud work. I will confirm by noon.",
"editedAt": "2026-09-25T13:02:28.000Z",
"sentAt": "2026-09-25T13:02:17.000Z",
"messageId": "1854462",
"externalMessageId": "32877308873",
"externalThreadId": "2648057088",
"confirmationCode": "HMJTFCEDFB",
"listingId": "23893",
"channel": "airbnb",
"direction": "outbound",
"senderType": "host",
"senderName": "Casey",
"senderAvatar": null,
"translatedBody": null,
"attachments": [],
"isAutomated": false,
"aiGenerated": false,
"status": null,
"revision": "2026-09-25T13:02:28.000Z"
}
}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
Tip: Acknowledge with a 2xx status within 10 seconds. Failed deliveries are retried up to 5 times with exponential backoff.Webhook reliability →