---
title: "Complete a hard amendment (rebook)"
method: POST
path: "/rates/rebook"
tags: ["Manage bookings"]
---

# Complete a hard amendment (rebook)

`POST /rates/rebook`

## Overview

**Step 2 of 2** in the **hard amendment** flow. Use a `prebookId` produced by `POST /bookings/{bookingId}/alternative-prebooks` to create the replacement booking. On success, the new booking is created **and the original booking is automatically cancelled** — you do **not** need to call the cancel endpoint.

## When to Use

- **After alternative-prebooks** — Once the guest has chosen one of the alternative prebooks returned by `POST /bookings/{bookingId}/alternative-prebooks`.
- **Date or occupancy changes** — The guest needs different check-in/check-out dates or a different number of adults/children at the same hotel.
- **Hard amendments only** — For simple guest-name updates use `PUT /bookings/{bookingId}/amend` instead.

## How It Works

1. The provided `prebookId` is validated against the booking referenced by `existingBookingId` (it must have been produced by an `alternative-prebooks` call for that booking).
2. The new booking is created with the supplier using the alternative rate.
3. The original booking is then automatically cancelled. If the cancellation fails after the new booking is confirmed, the error is logged but the new booking is still returned — contact support to reconcile.

## Payment

- No payment is collected on this endpoint. The `payment.method` value is ignored — the request body must still include a `payment` object to satisfy the schema, but the server forces the method to `NONE` internally. Any price delta between the original and new rate is settled out of band.

## Refundable vs Non-refundable Originals

- **Refundable original** — Returns `200 OK` with the new booking, and the original is cancelled immediately.
- **Non-refundable original** — Returns `202 Accepted` with a booking amendment record. The request is queued for the Nuitee operations team to handle manually (the original booking may incur cancellation fees).

## Required Information

- **prebookId** — A prebook session returned by `POST /bookings/{bookingId}/alternative-prebooks`.
- **existingBookingId** — The `bookingId` of the original confirmed booking being replaced. Must match the `bookingId` that produced the prebook.
- **holder** and **guests** — Same structure as `POST /rates/book`. If `holder` fields are empty they are copied from the original booking.

## Quick Start

1. Call `POST /bookings/{bookingId}/alternative-prebooks` and pick one of the returned `prebookId` values.
2. Call this endpoint with that `prebookId`, the original `bookingId` as `existingBookingId`, and guest information.
3. On success, the new booking is confirmed and the original is cancelled — no further calls are needed.

## Query parameters

- `timeout` integer

## Request body

- object
  - `prebookId` string, required — A prebook session returned by `POST /bookings/{bookingId}/alternative-prebooks`. Must reference the same booking as `existingBookingId`.
  - `existingBookingId` string, required — The `bookingId` of the confirmed booking being replaced. The original booking is cancelled automatically when the new booking is confirmed.
  - `clientReference` string — An optional client-defined reference ID. Acts as an idempotency key to prevent duplicate rebooks. If a booking already exists with the same client reference, the API will return a 4005 error.
  - `holder` object, required — Information on the person responsible for the booking. Any field left empty is populated from the original booking's holder.
    - `firstName` string — First name of the holder. Defaults to the original booking's holder first name when empty.
    - `lastName` string — Last name of the holder. Defaults to the original booking's holder last name when empty.
    - `email` string — Email of the holder. Defaults to the original booking's holder email when empty.
    - `phone` string — Phone number of the holder.
  - `guests` object[], required — List of guests for the new booking. There is a 1:1 mapping between guests and rooms (one guest entry per `occupancyNumber`).
    - `occupancyNumber` integer, required — Which occupancy/room this guest belongs to. Must match an occupancy on the prebook.
    - `firstName` string, required — Guest first name.
    - `lastName` string, required — Guest last name.
    - `email` string, required — Guest email.
    - `phone` string — Guest phone number.
    - `remarks` string — Optional remarks for this guest (not guaranteed).
  - `payment` object, required — Required by the schema but ignored. The server forces the payment method to `NONE` for rebooks — no charge is taken on this endpoint. Send `{"method": "NONE"}` to be explicit.
    - `method` 'NONE', required — Always `NONE` for rebook. Any other value supplied by the client is overridden.
  - `trackingId` string — Optional tracking ID for analytics or partner attribution.
  - `customTags` object — Optional bag of up to 5 user-defined key/value labels persisted with the booking. Keys must match `^[A-Z0-9_-]+$` and values are strings up to 255 characters. See `POST /rates/book` for the full description.

## Response `200`

Rebook completed. The original booking has been cancelled and a new confirmed booking has been created. Response shape matches `POST /rates/book`.

- object
  - `data` object — The newly created booking. See `POST /rates/book` for the full schema.
    - `bookingId` string — The unique identifier of the new confirmed booking.
    - `status` string — `CONFIRMED` when the rebook succeeded.
    - `rebookFrom` string — The `bookingId` of the original booking that was cancelled as part of this rebook.
    - `checkin` string, date
    - `checkout` string, date
    - `price` number
    - `currency` string
    - `prebookId` string — Echo of the prebook used to create this booking.
  - `guestLevel` integer
  - `sandbox` boolean

## Other responses

- `202` — Rebook request queued for manual handling. Returned when the original booking is **non-refundable** — the Nuitee operations team will process the amendment manually and any cancellation fees will be handled separately. No new booking is created at this point.
- `400` — Bad request. Validation failed or the rebook is not allowed for this offer.
- `401` — Unauthorized. Invalid or missing API key, or the caller is not allowed to rebook.
- `409` — Conflict. A rebook for the same prebook has already been completed.
- `500` — Internal server error. Failed to create the new booking or to retrieve booking/prebook data.

---

[API](https://skmtc.net/liteapi/apis/api-search.md) · [All operations](https://skmtc.net/liteapi/apis/api-search/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/liteapi/api-search/versions/315ba2a4dcf4/schema)
