Cancelling
| Call | Cancels |
|---|---|
DELETE /v2/bookings/{booking_id} | every reservation in the booking |
DELETE /v2/bookings/{booking_id}/reservations/{reservation_id} | one reservation (unit) |
Like booking, cancellation is asynchronous.
Cancel the whole booking when you can. For a multi-unit booking, cancelling one reservation means the hotel has to modify the booking, which is slower and fails more often for some hotel systems. If the guest is cancelling every unit, use DELETE /v2/bookings/{booking_id}.
What 204 No Content means: we accepted the request and are sending it to the hotel. The reservation moves to TO_BE_CANCELLED.
What to do next: poll GET /v2/bookings/{booking_id} (same pattern as Booking) until the status is one of:
CANCELLED: done.CANCELLATION_FAILED: the hotel did not accept the cancellation, and the reservation is still active. Checkerrors(usuallyCANCELLATION_REJECTED). See When a cancellation fails.
Most cancellations complete within 10 seconds. Keep polling as for bookings: up to 120 seconds.
Errors when submitting a cancellation
| HTTP | error_codes[].code | Message / meaning |
|---|---|---|
| 400 | NON_CANCELLABLE | Reservation with status <STATUS> cannot be cancelled. The reservation is in a status that can't be cancelled, for example still TO_BE_DELIVERED. Wait until it is CONFIRMED. |
| 400 | NON_CANCELLABLE | Cancelling a reservation after check in date is not allowed |
| 400 | NON_CANCELLABLE | The reservation cannot be cancelled at the moment, try again in N minutes. Retry after N minutes. |
| 400 | ALREADY_CANCELLED | Already cancelled. |
| 404 | NOT_FOUND | No such reservation for your account. |
| 500 | INTERNAL_SERVER_ERROR | Retry later. |
Common mistake: treating every
400as "already cancelled". Checkerror_codes[].code. OnlyALREADY_CANCELLEDmeans the reservation is cancelled;NON_CANCELLABLEmeans it is still active.
When a cancellation fails
Common causes:
- Hotel system unavailable: the hotel system is down or in maintenance. Hotel chains announce these windows and we relay them. Retry after the window: send the same
DELETEagain. A reservation inCANCELLATION_FAILEDcan be cancelled again. - Hotel refusal: the hotel refused, for example because the reservation is non-refundable or the guest has already checked in.
Status at the hotel can differ. Occasionally, a reservation is CANCELLED with us but still visible at the hotel, or the other way round. This happens because hotels' booking and front-desk systems don't always sync. Contact support with the booking ID and supplier_confirmation_id.
Cancellation policies
Which policy applies. The policy at the time of booking applies. It is stored on the reservation (cancellation_policies, no_show_policy) and returned by GET /bookings/{id}. A hotel may change a rate plan's policy later; that doesn't affect existing reservations.
Where to read policies:
- Before booking: read them from
data.rate_plans[rate_plan_id]in the availability response. Every bookable rate has them there. - Don't rely on
/properties: the policies on/propertiesand the rate plan endpoints describe the rate plan in general and can be empty.
Refunds. Refunds for cancellation charges are handled by the hotel.
No policy is not "non-refundable". If cancellation_policies is empty, the hotel hasn't provided a policy for that rate. Treat it as unknown and report it to us; don't show the rate as non-refundable or free to cancel.
Fields
{
"name": "Free cancellation until 2 days before arrival",
"description": "…text from the hotel…",
"charge_type": "percentage",
"amount": 100,
"reference": "prior-to-arrival",
"days_before_activation": 2,
"hours_before_activation": 0,
"type": "static"
}| Field | Meaning |
|---|---|
charge_type | fixed: a fixed amount in the property's currency. percentage: a percentage of the reservation total. nights: the price of a number of nights. |
amount | The value for charge_type. For percentage it is a percentage (100 = full price). For fixed it is a currency amount (e.g. 123.5). For nights it is a number of nights (1 = the price of one night). |
reference | The moment the deadline is counted from. prior-to-arrival: before the property's check-in date/time (local time, see the property's timezone and check-in time). after-booking: after the booking was confirmed. |
days_before_activation | Days before (or after, for after-booking) the reference when the charge starts to apply. |
hours_before_activation | Despite its name, this is the hour of the day (0–23, property local time) on the deadline day. It is not a number of hours. |
name, description | Free text from the hotel, for display only. Don't parse it. |
A reservation can have several policies, for example a free period followed by a 100% charge. The one that applies is the latest one whose deadline has passed.
Worked examples
Example 1. Property in Europe/London, check-in 2026-11-10. Policy:
{ "charge_type": "percentage", "amount": 100, "reference": "prior-to-arrival",
"days_before_activation": 2, "hours_before_activation": 14 }- Deadline: 2 days before check-in at 14:00 local time, i.e. 2026-11-08 14:00 Europe/London.
- Before the deadline: free cancellation.
- From the deadline on: cancelling costs 100% of the reservation total.
Example 2: same day. Check-in 2026-11-10 at 15:00. Policy:
{ "charge_type": "nights", "amount": 1, "reference": "prior-to-arrival",
"days_before_activation": 0, "hours_before_activation": 13 }Free cancellation until 13:00 on the day of arrival. From then on, cancelling costs one night.
Example 3: one day before. days_before_activation: 1, hours_before_activation: 16 means free cancellation until 16:00 the day before arrival.
Example 4: after booking. reference: after-booking, days_before_activation: 1. Booked on 1 August at 14:00: free cancellation until 2 August at 14:00.
No-show policy
no_show_policy uses the same charge_type and amount. It applies if the guest doesn't arrive and the reservation wasn't cancelled.