Flight booking API
The flight booking API reserves a revalidated itinerary and holds it until a ticketing deadline.
POST/Air/AirBook
Access requires the permission air_book
Book after you revalidate. Send the passengers and a lead contact. The response gives you a UniqueId and a TktTimeLimit. Nothing is ticketed yet. The seat is held until the deadline, so issue the ticket before then.
Path parameters
None.
Query parameters
None.
Body parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
SessionId | string | Yes | - | Your session id. |
FareSourceCode | string | Yes | - | The code returned by revalidate. |
ClientUniqueId | string | No | - | Your own reference. Later usable in booking data instead of UniqueId. |
MarkupForAdult | number | No | 0 | Markup added per adult. |
MarkupForChild | number | No | 0 | Markup added per child. |
MarkupForInfant | number | No | 0 | Markup added per infant. |
Request
curl -X POST https://api.hermeseus.com/api/Air/AirBook \
-H "Content-Type: application/json" \
-d '{
"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"FareSourceCode": "dHA6ODc0NTE6ZmwxMjM0OjMyNw==",
"ClientUniqueId": "order-0001",
"TravelerInfo": {
"PhoneNumber": "+441234567890",
"Email": "traveller@example.com",
"AirTravelers": [
{
"PassengerType": 1,
"Gender": 0,
"DateOfBirth": "1990-05-14",
"PassengerName": {
"PassengerFirstName": "Jane",
"PassengerLastName": "Doe"
}
}
]
}
}'const res = await fetch("https://api.hermeseus.com/api/Air/AirBook", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
SessionId: "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
FareSourceCode: "dHA6ODc0NTE6ZmwxMjM0OjMyNw==",
ClientUniqueId: "order-0001",
TravelerInfo: {
PhoneNumber: "+441234567890",
Email: "traveller@example.com",
AirTravelers: [
{
PassengerType: 1,
Gender: 0,
DateOfBirth: "1990-05-14",
PassengerName: { PassengerFirstName: "Jane", PassengerLastName: "Doe" }
}
]
}
})
});
const data = await res.json();import requests
res = requests.post(
"https://api.hermeseus.com/api/Air/AirBook",
json={
"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"FareSourceCode": "dHA6ODc0NTE6ZmwxMjM0OjMyNw==",
"ClientUniqueId": "order-0001",
"TravelerInfo": {
"PhoneNumber": "+441234567890",
"Email": "traveller@example.com",
"AirTravelers": [
{
"PassengerType": 1,
"Gender": 0,
"DateOfBirth": "1990-05-14",
"PassengerName": {
"PassengerFirstName": "Jane",
"PassengerLastName": "Doe",
},
}
],
},
},
)
data = res.json()Response
| Field | Type | Description |
|---|---|---|
Success | boolean | true on success. |
UniqueId | string | The booking id. Carry it into ticketing, tracking, and cancellation. |
TktTimeLimit | string | Deadline to issue the ticket. Issue before this time or the hold is released. |
TktTimeLimitTimeZone | string | Timezone of TktTimeLimit. |
Category | integer | 10. Booked, awaiting ticketing. |
Status | integer | 10. Booked, awaiting ticketing. |
PriceChange | boolean | true if the fare changed during booking. |
WarningMessage | string | Any non-fatal warning, otherwise null. |
Error | object | null on success. |
{
"Success": true,
"UniqueId": "TP-2026-000512",
"TktTimeLimit": "2026-10-10T18:00:00",
"TktTimeLimitTimeZone": "UTC",
"Category": 10,
"Status": 10,
"PriceChange": false,
"WarningMessage": null,
"Error": null
}
A booking is not a ticket.
Status
10 holds a seat. Issue the ticket with AirOrderTicket before TktTimeLimit, otherwise the reservation is released.
Errors
| Code | Meaning | Fix |
|---|---|---|
Err0106001 | A required traveller field is missing or invalid. | Fix the field named in the message. |
Err0102003 | The fare is no longer available. | Search and revalidate again. |
Err0102005 | The fare has expired. | Search and revalidate again. |

