Cancel a Reservation

Cancel a booking where it lives: in the PMS that manages the listing, in Repull for a direct booking, or on the channel that owns it.

Cancel through the reservation

POST/v1/reservations/{id}/cancel
curl -X POST "https://api.repull.dev/v1/reservations/215708/cancel" \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7a3f1e92-0c5b-4d8e-b6a4-9e2d1c0f8b37" \
  -d '{"reason": "Guest changed plans"}'
  • A booking managed in a connected PMS is cancelled in the PMS, then read back so Repull and the PMS agree. No cancellation fee is charged. Lodgify declinesthe booking rather than deleting it. OwnerRez's API cannot cancel — 422 pms_write_unsupported; cancel it in OwnerRez. Per PMS: PMS reservation support.
  • Direct, website and owner bookings are cancelled in Repull, releasing the nights.
  • A channel booking (Airbnb, Booking.com, Vrbo), including one that came in through a PMS, answers 409 reservation_owned_by_channel. Cancel it on the channel, as below.
  • Cancelling a booking that is already cancelled returns alreadyCancelled: true, not an error.

GET /v1/listings/{id} → capabilities.reservations.cancelsays in advance whether a listing's bookings can be cancelled here. PATCH /v1/reservations/{id} refuses status by name: cancelling is its own operation.

Airbnb

Host cancellation is one of the state actions on an Airbnb reservation. Use the Airbnb confirmation code, not the Repull reservation id.

POST/v1/channels/airbnb/reservations/{code}
curl -X POST "https://api.repull.dev/v1/channels/airbnb/reservations/HMABCD1234" \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action": "cancel"}'

The same route carries the other state actions: accept and decline for inquiries and reservation requests, and pre-approve for inquiries.

Host cancellations carry penalties

Cancelling as the host is not the same as a guest cancelling. Airbnb applies host cancellation penalties — fees, a blocked calendar, and a public note on the listing. Confirm the cancellation policy and, where possible, have the guest cancel from their side instead.

Cancelling a reservation that is already cancelled returns invalid_state. Treat that as a soft success — the reservation is in the state you wanted.

Booking.com

Booking.com reservations cannot be cancelled through this API. POST /v1/channels/booking/reservations acknowledges reservations so Booking.com removes them from the new queue — it does not cancel them. Cancel from the Booking.com extranet, then re-read the reservation to pick up the new state.

Other channels

A Vrbo booking, or a channel booking that reached you through a PMS, is cancelled on that channel; the cancellation arrives with the next sync.

Reacting to a cancellation

However a booking is cancelled, subscribe to reservation.cancelled so your system hears about it once rather than polling. That covers cancellations made in an extranet or a PMS, which you would otherwise miss entirely.

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/hooks/repull",
    "events": ["reservation.cancelled"]
  }'

API Reference

See the complete Reservations API Reference for list, create, update and cancel, and the capability matrix for what each channel supports.

AI