Repull delivers each guest message to your model with the thread and booking behind it, and sends the answer back on Airbnb, Booking.com or Vrbo. You bring the intelligence; we handle the channels.
What your product gets
Your model decides what to say. Repull gets the message to it and the answer to the guest.
A signed webhook for each new guest message, with the thread id, channel, booking and text.
Thread history, the reservation with dates, guests and stay terms, and the listing — one call each.
When a channel rewrites a message (Airbnb strips links and phone numbers), the response tells you exactly what the guest received.
How it works
Subscribe to guest messages, look up the context, let your model write the reply, and send it. Use the event id as the idempotency key so a retried webhook never sends twice.
reservation.message.received arrives signed, with threadId and reservationId.
Fetch the thread history and the reservation. Add your own knowledge base.
POST the reply. Repull delivers it on the guest's channel and records it in the thread.
// api(): fetch on api.repull.dev with your API key
// Subscribed to reservation.message.received
export async function POST(req: Request) {
const event = await req.json() // verify X-Repull-Signature first
if (event.event !== 'reservation.message.received') return new Response(null)
const { threadId, reservationId, body } = event.data
// Context: the thread so far and the booking it belongs to
const history = await api(`/v1/conversations/${threadId}/messages?order=asc`)
const booking = reservationId ? await api(`/v1/reservations/${reservationId}`) : null
const reply = await yourModel.answer({ question: body, history, booking })
const sent = await api(`/v1/conversations/${threadId}/messages`, {
method: 'POST',
headers: { 'Idempotency-Key': event.eventId },
body: JSON.stringify({ message: reply }),
})
// Airbnb strips links and phone numbers — check what the guest actually got
if (sent.contentRewritten) log('delivered as', sent.deliveredContent)
return new Response(null)
}Channel coverage
Coverage is checked against the live API. Full channel and PMS coverage
Alongside any PMS
On Airbnb and Vrbo, Repull connects with messaging-level access. The host's PMS keeps managing listings and calendars, and your product never competes with it for control.
In beta: reservations, messages and reviews from Booking.com, without the host moving their connectivity provider away from their PMS.
The same endpoints and the same webhook events whether the guest booked on Airbnb, Booking.com or Vrbo. You build it once.
The API behind it
reservation.message.receivedWebhook: a new guest message, with thread, booking and channel.
GET /v1/conversations/{id}/messagesThe conversation so far, for context.
GET /v1/reservations/{id}Dates, guests, stay terms and status.
POST /v1/conversations/{id}/messagesSend the answer, idempotently.
POST /v1/reviews/{id}/replyLet the same assistant answer reviews, where the channel allows replies.
MCP server and AI SDK providerGive an agent Repull as tools instead of writing the calls yourself.
Free to start. Wire up one webhook and answer your first guest today.