Docs/Webhooks/Reservation

reservation.updated

Dates, guest count, status, or pricing changed on an existing reservation.

When it fires

Fires when any meaningful field on a reservation changes after creation — date shift, guest count update, status transition (e.g. confirmed → checked-in), pricing adjustment, or assigned-listing change.

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.updated",
  "eventId": "3f1c9a2e-8b7d-4c6a-9e0f-1a2b3c4d5e6f",
  "apiVersion": "2026-04",
  "timestamp": "2026-05-01T12:34:56.000Z",
  "data": {
    "object": {
      "id": "900001",
      "uid": "HMEXAMPLE1",
      "channel": "airbnb",
      "listingId": "5668",
      "customerId": "1",
      "checkinDate": "2026-06-10",
      "checkoutDate": "2026-06-16",
      "status": "confirmed",
      "cancellationPolicy": "firm_14",
      "checkInTime": "16:00",
      "checkOutTime": "10:00"
    },
    "previousAttributes": {
      "checkinDate": "2026-06-11",
      "checkoutDate": "2026-06-16"
    }
  }
}

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 (type === 'reservation.updated') {
  const { id, changes } = data
  if (changes.checkOut) {
    // Date shift — re-issue check-in instructions, re-block the calendar
    console.log('Checkout moved to', changes.checkOut.to)
  }
  if (changes.pricing) {
    // Re-charge the difference, update the owner statement
  }
}

Common patterns

  • The changes object only contains fields that actually changed. Diff against your last-known state — do not assume any specific field will be present in every delivery.
  • Fetch the full reservation after a change. The changes diff is enough to know what shifted, but downstream systems (CRM, accounting, cleaning rota) should reconcile against GET /v1/reservations/{id}.
  • Best-effort ordering — a reservation.updated and a payment.completed for the same reservation may arrive out of order. Reconcile against the latest API state when ordering matters.

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

AI