Getting Started with the Xeni Activities APIHow to Book an ActivityHow to Browse Activity Tags and CategoriesHow to Cancel an Activity BookingHow to Check Activity AvailabilityHow to Get Activity DetailsHow to Retrieve Activity Booking DetailsHow to Search for Activities with FiltersHow to Search for Activity DestinationsCar Rental API - Getting StartedCar Rental API - Understanding Response FieldsHow to Book a Car RentalHow to Get Rental Car Details and Equipment Add-OnsHow to Retrieve or Cancel a Car Rental BookingHow to Search for Available Rental CarsHow to Search for Pickup LocationsHow to Use Car Rental Search FiltersDeals API Best Practices for IntegrationDeals API Frequently Asked QuestionsGetting Started with the Xeni Deals APIDeals API Request Parameters and Headers ReferenceDeals API Supported Currencies and LocalizationHow to Display Deals in Your ApplicationHow to Fetch Hotel Deals by LocationFlights API Error Codes and TroubleshootingGetting Started with the Xeni Flights APIHow to Book a FlightHow to Check Flight Availability and PricingHow to Confirm or Cancel a Flight BookingHow to Retrieve Fare Rules for a FlightHow to Retrieve Flight Booking DetailsHow to Search for Airports Using AutocompleteHow to Search for FlightsHow to Use Flight Search Filters, Sorting, and PaginationHow to Check Room Availability and PricingHow to Filter Vacation Rental ResultsHow to Get Resort Property Details, Amenities, and AccessibilityHow to Hold and Confirm a Resort BookingHow to Release a Resort HoldHow to Retrieve Resort Booking DetailsHow to Search for Available ResortsHow to Search for Resort DestinationsHow to Search for Vacation Rental LocationsHow to Search for Vacation RentalsHow to Use Resort Search Filters and SortingGetting Started with the Xeni Resorts APIResorts API: Understanding Booking Statuses and PoliciesGetting Started with the Vacation Rentals APIVacation Rentals Frequently Asked QuestionsVacation Rentals Supported Property TypesUnderstanding Async Search for Vacation RentalsAuthentication & API SignaturesBooking Hotels — Direct API & SSO CheckoutError Handling, Rate Limits & Best PracticesGetting Started with the Xeni Hotels APIManaging Bookings: Status, Retrieval & CancellationPricing Confirmation & Token LifecycleRetrieving Hotel Details & Room AvailabilitySearching for Hotels: Locations, Filters & PaginationSearching for HotelsSession Management & Correlation IDsAPI authentication and getting your API keys

How to Hold and Confirm a Resort Booking

Last updated: 2026-03-03

How to Hold and Confirm a Resort Booking

The Resorts API uses a two-step booking process: first you create a hold on the reservation, then you confirm it. This gives you a window to finalize payment or perform additional validation before the booking is committed.

Step 1: Create a Hold

Endpoint

POST {{apihost}}/resorts/api/v2/itineraries?token={token}&recommendationid={recommendation_id}

Required Headers

HeaderValueRequired
Content-Typeapplication/jsonYes
x-api-keyYour API keyYes
x-correlation-idUnique correlation identifierYes

Query Parameters

ParameterTypeRequiredDescription
tokenstringYesThe room-specific token from the availability or pricing response
recommendation_idstringYesThe recommendation ID from the search results

Request Body

JSON
{
  "property_id": "RST-98765",
  "checkin": "2026-04-01",
  "checkout": "2026-04-07",
  "total_rate": 1710,
  "currency": "USD",
  "action": "CONFIRM",
  "communication_details": {
    "email": "guest@example.com",
    "phone": "+1-555-123-4567"
  },
  "traveler": {
    "first_name": "Jane",
    "middle_name": "",
    "last_name": "Doe",
    "address": "456 Palm Avenue",
    "city": "Los Angeles",
    "state": "CA",
    "zip_code": "90001",
    "country": "US",
    "email": "guest@example.com",
    "phone": "+1-555-123-4567"
  }
}

Request Body Fields

FieldTypeRequiredDescription
propertyidstringYesThe property ID
checkinstringYesCheck-in date in YYYY-MM-DD format
checkoutstringYesCheck-out date in YYYY-MM-DD format
totalratenumberYesThe confirmed total rate from the pricing endpoint. Must match exactly.
currencystringYesThree-letter ISO 4217 currency code
actionstringYesMust be "CONFIRM"
communicationdetails.emailstringYesEmail address for booking confirmations
communicationdetails.phonestringYesPhone number for booking communications
traveler.firstnamestringYesGuest's first name
traveler.middlenamestringNoGuest's middle name (can be empty string)
traveler.lastnamestringYesGuest's last name
traveler.addressstringYesGuest's street address
traveler.citystringYesGuest's city
traveler.statestringYesGuest's state or province
traveler.zipcodestringYesGuest's postal code
traveler.countrystringYesGuest's country code
traveler.emailstringYesGuest's email address
traveler.phonestringYesGuest's phone number

Example Response — Hold Created

JSON
{
  "status": 200,
  "data": {
    "reference_number": "XRN-2026040100123",
    "status": "HOLD"
  }
}

Example Response — Booking Confirmed Immediately

In some cases, the booking may be confirmed immediately without going through a hold state:

JSON
{
  "status": 200,
  "data": {
    "reference_number": "XRN-2026040100123",
    "status": "CONFIRMED"
  }
}

Error: Rate Mismatch

If the total_rate in your request does not match the confirmed pricing, the API returns a 400 error:

JSON
{
  "message": "Total rate does not match the confirmed price",
  "status": 400
}

Always use the totalRate value from the pricing confirmation endpoint to avoid this error.


Step 2: Confirm the Hold

If the booking was created with a "HOLD" status, you must explicitly confirm it to finalize the reservation.

Endpoint

PUT {{apihost}}/resorts/api/v2/itineraries?referencenumber={reference_number}&status=CONFIRM

Required Headers

HeaderValueRequired
Content-Typeapplication/jsonYes
x-api-keyYour API keyYes
x-correlation-idUnique correlation identifierYes

Query Parameters

ParameterTypeRequiredDescription
reference_numberstringYesThe booking reference number from the hold response
statusstringYesMust be "CONFIRM"

Request Body

The request body should be empty.

Example Response

JSON
{
  "status": 200,
  "data": {
    "reference_number": "XRN-2026040100123",
    "status": "CONFIRMED"
  }
}

Error: Invalid Hold State

If the booking is not currently in a HOLD state (for example, it has already been confirmed or released), the API returns a 417 error:

JSON
{
  "message": "Booking is not in HOLD state",
  "status": 417
}

Complete Booking Flow

Here is the full sequence from search to confirmed booking:

  1. Autocomplete — Get the region code for the destination.
  2. Property Search — Find available resorts and get a recommendation_id.
  3. Availability — Check room availability and get a token.
  4. Price — Confirm the final rate using the token and recommendation_id.
  5. Hold — Create a hold with the confirmed total_rate, token, and traveler details.
  6. Confirm — If the response status is "HOLD", confirm the booking to finalize it.

Best Practices


  • Always confirm pricing first — Never create a hold using rates from the search or availability response. Always use the rate returned by the pricing endpoint.
  • Handle both statuses — Your integration should handle both "HOLD" and "CONFIRMED" responses from the hold endpoint. If the status is "CONFIRMED", no further action is needed.
  • Confirm promptly — Holds are time-limited. Confirm the booking as soon as your payment or validation process is complete.
  • Store the reference number — The reference_number is your primary identifier for all subsequent operations (confirm, release, retrieve).


Was this article helpful?