Apply an amendment to a booking#
/v1/bookings/{bookingId}/amendmentsThis call changes the booking. Same body, same semantics and the same refusals as PATCH /v1/bookings/{bookingId} — which remains the read-only quote — but here the change is actually made: the channel manager is told first, then every row is rewritten, then your group's credit charge is moved to match. Amending is a separate call from quoting so that asking what a change would cost is never itself a commitment.
The order is strict and it matters. Nothing is written until the channel manager has accepted the amended stay. If it refuses, you get a 409 naming what it refused and nothing has changed anywhere. If it accepts and a later step fails, your original stay is pushed back to the channel and the failure is recorded against the amendment for a human to see.
An increase passes the same credit check a new booking passes. An amendment is not a way around your credit limit: if the extra amount would breach it you get the same 402 a booking would get, and the amendment is not applied. A decrease is never gated — giving credit back cannot breach a limit.
Retries are safe. An amendment is idempotent over its own content and the stay it applies to, so re-sending the identical request after a timeout resolves to the amendment that already happened and returns it with alreadyApplied: true — it never moves the money twice. Sending a genuinely different amendment is a new amendment. If two amendments race on one booking, exactly one applies and the other gets a 409 telling you to re-quote.
Two refusals specific to applying. A booking already billed on an issued invoice is a 409: an issued invoice is never edited, so that case needs a credit note and a fresh booking rather than an amendment. A booking held at a channel that cannot modify an existing reservation is also a 409 — that is a limitation of the property's channel, not of your request, and cancelling and rebooking is the way round it.
Request
curl -X POST 'https://partner-api.elivaas.com/v1/bookings/{bookingId}/amendments' \
-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}/amendments', {
method: 'POST',
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.post(
"https://partner-api.elivaas.com/v1/bookings/{bookingId}/amendments",
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",
"amendmentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"checkIn": "2026-08-01",
"checkOut": "2026-08-01",
"previousTotal": 0,
"newTotal": 0,
"delta": 0,
"amendmentDelta": 0,
"rateDriftAbsorbed": 0,
"warnings": [
"string"
],
"alreadyApplied": true
}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 applied (or was already applied by an earlier, identical request). |
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. |
402 | The increase would breach the group's credit limit. Nothing changed. |
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.