Book a hotel
Hold a room with the validated rate and the guest details.
POST/v2/Hotel/HotelBook
Access requires the permission hotel_book
Book after you validate the rate. Send the guests and a lead contact. The response returns a UniqueId. This is a temporary hold. Nothing is charged yet. Place the order to finalize it.
Two versions.
The v1 path
/Hotel/HotelBook is the same operation with the same body. New integrations should use the v2 path above.
Path parameters
None.
Query parameters
None.
Body parameters
| Name | Type | Required | Description |
|---|---|---|---|
SessionId | string | Yes | Your session id. |
FareSourceCode | string | Yes | The validated code from check rate. |
PhoneNumber | string | Yes | Lead contact phone. |
Email | string | Yes | Lead contact email. |
HotelTransfers | array | Present | Must be present. Send [] when there are no transfers. |
Nationality | string | No | Lead guest nationality (ISO country code). Some rates are nationality scoped. |
ClientUniqueId | string | No | Your own reference. Usable later in booking data. |
Note | string | No | Free-text request passed to the property. |
Request
curl -X POST https://api.hermeseus.com/api/v2/Hotel/HotelBook \
-H "Content-Type: application/json" \
-d '{
"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"FareSourceCode": "YmE6OTk4MjE6cnI3ZjMy",
"PhoneNumber": "+441234567890",
"Email": "traveller@example.com",
"Nationality": "GB",
"ClientUniqueId": "hotel-order-0001",
"Rooms": [
{
"Passengers": [
{ "FirstName": "Jane", "LastName": "Doe", "PassengerType": 1, "PassengerTitle": 2 }
]
}
],
"HotelTransfers": []
}'const res = await fetch("https://api.hermeseus.com/api/v2/Hotel/HotelBook", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
SessionId: "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
FareSourceCode: "YmE6OTk4MjE6cnI3ZjMy",
PhoneNumber: "+441234567890",
Email: "traveller@example.com",
Nationality: "GB",
ClientUniqueId: "hotel-order-0001",
Rooms: [
{ Passengers: [ { FirstName: "Jane", LastName: "Doe", PassengerType: 1, PassengerTitle: 2 } ] }
],
HotelTransfers: []
})
});
const data = await res.json();import requests
res = requests.post(
"https://api.hermeseus.com/api/v2/Hotel/HotelBook",
json={
"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"FareSourceCode": "YmE6OTk4MjE6cnI3ZjMy",
"PhoneNumber": "+441234567890",
"Email": "traveller@example.com",
"Nationality": "GB",
"ClientUniqueId": "hotel-order-0001",
"Rooms": [
{"Passengers": [
{"FirstName": "Jane", "LastName": "Doe", "PassengerType": 1, "PassengerTitle": 2}
]}
],
"HotelTransfers": [],
},
)
data = res.json()Response
| Field | Type | Description |
|---|---|---|
Success | boolean | true on success. |
UniqueId | string | The booking id. Carry it into order, tracking, and cancellation. |
Status | integer | Booking status. Held, awaiting the order. |
Error | object | null on success. |
{
"Success": true,
"UniqueId": "HB-2026-004417",
"Status": 10,
"Error": null
}
This is a hold, not a confirmation.
Nothing is charged at book. The hold lasts about 15 minutes. Place the order before it lapses.
Errors
| Code | Meaning | Fix |
|---|---|---|
Err0106001 | A required guest or contact field is missing. | Fix the field named in the message. |
Err0102003 | The rate is no longer available. | Validate the rate again. |

