Hermeseus

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

NameTypeRequiredDefaultDescription
SessionIdstringYes-Your session id.
FareSourceCodestringYes-The code returned by revalidate.
ClientUniqueIdstringNo-Your own reference. Later usable in booking data instead of UniqueId.
MarkupForAdultnumberNo0Markup added per adult.
MarkupForChildnumberNo0Markup added per child.
MarkupForInfantnumberNo0Markup added per infant.
TravelerInfo object, required
NameTypeRequiredDescription
PhoneNumberstringYesLead contact phone.
EmailstringYesLead contact email.
AirTravelersarray of objectYesOne entry per passenger. Minimum 1. The count must match the search pax mix.
AirTravelers[] object
NameTypeRequiredDescription
PassengerTypeintegerYesPassenger type code, for example 1 for an adult.
GenderintegerYes0 Male, 1 Female.
DateOfBirthstringYesDate of birth, YYYY-MM-DD.
PassengerName.PassengerFirstNamestringYesGiven name as on the passport.
PassengerName.PassengerLastNamestringYesSurname as on the passport.

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

FieldTypeDescription
Successbooleantrue on success.
UniqueIdstringThe booking id. Carry it into ticketing, tracking, and cancellation.
TktTimeLimitstringDeadline to issue the ticket. Issue before this time or the hold is released.
TktTimeLimitTimeZonestringTimezone of TktTimeLimit.
Categoryinteger10. Booked, awaiting ticketing.
Statusinteger10. Booked, awaiting ticketing.
PriceChangebooleantrue if the fare changed during booking.
WarningMessagestringAny non-fatal warning, otherwise null.
Errorobjectnull 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

CodeMeaningFix
Err0106001A required traveller field is missing or invalid.Fix the field named in the message.
Err0102003The fare is no longer available.Search and revalidate again.
Err0102005The fare has expired.Search and revalidate again.