Webhooks
TL;DR
POST /v1/webhookswith a URL and event list. Repull sends HMAC-SHA256 signed JSON payloads on reservation changes, guest messages, listing & calendar updates, payments, and account events.
Receive real-time HTTP POST notifications when events happen in connected PMS accounts. Instead of polling the API, webhooks push data to your server the moment something changes.
How It Works
- You register a webhook URL and select which event types to subscribe to
- When an event occurs (e.g. a new reservation is created), Repull sends an HTTP POST to your URL
- The request body contains the full event payload with all relevant data
- Your server verifies the HMAC-SHA256 signature and processes the event
- Return a 2xx status within 5 seconds to acknowledge receipt
Available Events
| Event | Description |
|---|---|
reservation.created | A new reservation arrived from any connected channel or direct booking |
reservation.updated | Dates, guest count, status, or pricing changed on a reservation |
reservation.cancelled | A reservation was cancelled by the guest, host, or platform |
reservation.message.received | A new inbound guest message arrived on a reservation thread |
reservation.message.sent | A host message was sent on a reservation thread, in the channel's app or through Repull |
reservation.message.updated | A message was edited on the channel; carries the new and previous text |
listing.created | A new property was synced from a connected PMS or channel |
listing.updated | Listing content, amenities, photos, or status changed |
listing.deleted | A property was removed from Repull or the upstream PMS |
calendar.updated | Availability or pricing for a listing was updated |
account.created | An OAuth or API credential connection was completed |
account.disconnected | A connection was revoked, expired, or rejected upstream |
ai.operation.completed | An async AI run (review response, message draft, pricing) finished |
ai.operation.failed | An async AI run terminated with an error and will not retry |
payment.completed | A guest payment was successfully captured |
payment.refunded | A previous payment was refunded in part or in full |
repull.ping | A diagnostic delivery used to verify endpoint reachability |
See Event Types for the full payload schema of each event.
Inactive listings do not send events
Connecting an account does not replay its history
account.created, read what is already there with GET /v1/reservations and the other list endpoints, then rely on webhooks for everything that changes from then on. New bookings, messages, payments and reviews after the connection, and changes to anything you already have, are delivered as usual. Each change is delivered once, even if the account is synced again or reconnected.Quick Example
Create a webhook subscription that listens for new and updated reservations:
curl -X POST https://api.repull.dev/v1/webhooks \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks",
"events": ["reservation.created", "reservation.updated"]
}'Security
Every delivery is signed with HMAC-SHA256 using a per-subscription signing secret. Always verify the X-Repull-Signature header before processing events. See Verify Signatures for implementation examples in Node.js and Python.
Reliability