Amend a booking in place#
/v1/bookings/{bookingId}Evaluates a change to a live booking — new dates, occupancy, meals, services or guests — keeping the SAME booking id. This call changes nothing. It returns the availability verdict for the requested stay and the priced delta against what your group is currently charged; no row is updated, nothing is pushed to the channel manager, and no credit moves.
Omitted means unchanged; empty means cleared. Every field is optional. Omit meals and the booking's meals are left exactly as they are; send "meals": [] and every meal is removed; send a non-empty list and it REPLACES the selection wholesale — so include the add-ons you want to keep. vas and guests behave identically. Scalars have no cleared state: an explicit "checkIn": null is a 400, because reading it as "unchanged" would let you believe you had moved a stay you had not.
Availability is night-by-night, and partial availability is a named outcome. availability.status is AVAILABLE, PARTIALLY_AVAILABLE or UNAVAILABLE. When some nights are free and some are not you get PARTIALLY_AVAILABLE with the exact nights in availability.unavailableNights and a per-property breakdown in availability.shortfalls — never a bare failure that leaves you guessing which night to try next. An amendment is never applied to only the nights that fit. The nights your booking already holds are credited back before the comparison, so a stay is never blocked by its own reservation.
The delta is decomposed, and it adds up. pricing.delta breaks the change into stay, discount, meals, services and tax, with stay - discount + meals + vas + tax == total on every side. pricing.current is your booking's unchanged stay repriced at today's rates, so the delta isolates the amendment's own cost; compare pricing.current.total with chargedTotal to see rate drift separately. pricing is null when the stay is not available — there is no price to quote for a stay that cannot happen.
Refused stays. A cancelled booking, a stay that has already started, and a stay that has already ended are all 409. A booking belonging to another agent group is 404, worded identically to one that does not exist.
Request
curl -X PATCH 'https://partner-api.elivaas.com/v1/bookings/{bookingId}' \
-u "$ELIVAAS_API_KEY:" \
-H 'Content-Type: application/json' \
-d '{"checkIn":"2026-08-11","checkOut":"2026-08-15","adults":3,"children":1,"infants":0,"meals":[{"mealId":"meal_breakfast","dates":["2026-08-01"],"unsureOfDates":true,"adults":0,"children":0,"chefOnCall":true}],"vas":[{"vasId":"vas_airport_transfer","variantId":"string","dates":["2026-08-01"],"unsureOfDates":true,"quantity":0,"dateQuantities":[{"date":"2026-08-01","quantity":0}]}],"guests":[{"guestId":"string","salutation":"string","firstName":"string","lastName":"string","email":"string","phone":"string","countryCode":"string","city":"string","dob":"2026-08-01","anniversary":"2026-08-01","position":0}]}'const res = await fetch('https://partner-api.elivaas.com/v1/bookings/{bookingId}', {
method: 'PATCH',
headers: {
Authorization: 'Basic ' + Buffer.from(process.env.ELIVAAS_API_KEY + ':').toString('base64'),
'Content-Type': 'application/json',
},
body: JSON.stringify({"checkIn":"2026-08-11","checkOut":"2026-08-15","adults":3,"children":1,"infants":0,"meals":[{"mealId":"meal_breakfast","dates":["2026-08-01"],"unsureOfDates":true,"adults":0,"children":0,"chefOnCall":true}],"vas":[{"vasId":"vas_airport_transfer","variantId":"string","dates":["2026-08-01"],"unsureOfDates":true,"quantity":0,"dateQuantities":[{"date":"2026-08-01","quantity":0}]}],"guests":[{"guestId":"string","salutation":"string","firstName":"string","lastName":"string","email":"string","phone":"string","countryCode":"string","city":"string","dob":"2026-08-01","anniversary":"2026-08-01","position":0}]}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();import os, requests
res = requests.patch(
"https://partner-api.elivaas.com/v1/bookings/{bookingId}",
auth=(os.environ["ELIVAAS_API_KEY"], ""),
json={"checkIn":"2026-08-11","checkOut":"2026-08-15","adults":3,"children":1,"infants":0,"meals":[{"mealId":"meal_breakfast","dates":["2026-08-01"],"unsureOfDates":true,"adults":0,"children":0,"chefOnCall":true}],"vas":[{"vasId":"vas_airport_transfer","variantId":"string","dates":["2026-08-01"],"unsureOfDates":true,"quantity":0,"dateQuantities":[{"date":"2026-08-01","quantity":0}]}],"guests":[{"guestId":"string","salutation":"string","firstName":"string","lastName":"string","email":"string","phone":"string","countryCode":"string","city":"string","dob":"2026-08-01","anniversary":"2026-08-01","position":0}]},
timeout=30,
)
res.raise_for_status()
data = res.json(){
"bookingId": "string",
"amendable": true,
"reason": "string",
"checkIn": "2026-08-01",
"checkOut": "2026-08-01",
"availability": {
"status": "AVAILABLE",
"nightsRequested": 0,
"unavailableNights": [
"2026-08-01"
],
"shortfalls": [
{
"date": "2026-08-01",
"propertyId": "string",
"requiredUnits": 0,
"availableUnits": 0
}
],
"minimumStayViolations": [
{
"propertyId": "string",
"minimumNights": 0,
"requestedNights": 0
}
]
},
"pricing": {
"currency": "string",
"current": {
"stay": 0,
"discount": 0,
"meals": 0,
"vas": 0,
"tax": 0,
"total": 0
},
"amended": {
"stay": 0,
"discount": 0,
"meals": 0,
"vas": 0,
"tax": 0,
"total": 0
},
"delta": {
"stay": 0,
"discount": 0,
"meals": 0,
"vas": 0,
"tax": 0,
"total": 0
},
"warnings": [
"string"
]
},
"chargedTotal": 0
}Path parameters#
bookingIdstringrequiredNo description in the spec.
Request body#
checkInstring<date>New check-in date (ISO 8601). Omit to keep the current one.
checkOutstring<date>New check-out date (ISO 8601). Omit to keep the current one.
adultsinteger<int32>New adult count. Omit to keep the current one.
childreninteger<int32>New child count. Omit to keep the current one.
infantsinteger<int32>New infant count. Omit to keep the current one.
mealsobject[]The complete meal selection the amended stay should have. Omit to leave the current meals alone; send
[]to remove every meal.vasobject[]The complete value-added-service selection the amended stay should have. Omit to leave the current services alone; send
[]to remove every service.guestsobject[]The complete guest list for the amended stay, lead guest first. Omit to leave the current guests alone. Accepted and validated for shape today; guests change neither the price nor the availability verdict, so this preview echoes them back rather than acting on them — the amendment itself applies them.
Responses#
| Status | Meaning |
|---|---|
200 | The amendment was evaluated. Check amendable — a 200 means the question was answered, not that the answer was yes. |
400 | Validation failure. The message names the offending parameter. Limits are rejected, never silently clamped: an over-length id list, a page size above 100 or a date window longer than 365 days all land here rather than coming back quietly truncated. |
401 | Missing, malformed, revoked or unknown API key, or an agent group whose distribution access is disabled. Pass the key as the HTTP Basic username with an empty password. |
429 | Rate limit exhausted for this credential. Wait Retry-After seconds before retrying; the budget is per credential, not per IP. |
See Errors for the error body shape and which statuses are worth retrying.