Flight passengers & ages
Flight passenger types, age rules evaluated at departure, seated vs lap infants, required age arrays, and capacity limits.
These rules are specific to flights. Hotels and eSIMs have their own passenger/guest requirements, documented under their own sections as those products launch.
Ages are evaluated at the departure date of the first flight segment, not the booking date. A passenger who turns 12 on/before departure must be ticketed as an adult; an infant who turns 2 on/before departure must be ticketed as a child (and given a seat). The wrong type causes check-in rejection and possible rebooking fees.
Passenger types
| Search count field | Booking type | Age at departure | Seat | Age array (search) |
|---|---|---|---|---|
adults | adult | 18+ | own | — |
seniors | senior | 60+ | own | — |
young_adults | young_adult | 12–17 | own | young_adult_ages |
children | child | 2–11 | own | child_ages (required) |
infants | infant | under 2 | lap (on an adult) | infant_ages (required) |
seated_infants | seated_infant | under 2 | own seat | seated_infant_ages (required) |
- Lap infant (
infants): sits on an adult's lap, no seat, no separate ticket in most markets. - Seated infant (
seated_infants): occupies a full seat and needs a ticket. Use this when the family wants a dedicated seat for an under-2, or when the infant will turn 2 before travel. - Child age 2+ (
children): is a regular seated child. One adult may travel with multiple children, and an age-2 child can travel alongside one lap infant.
Search — passengers object
Pass counts plus a parallel _ages array for every type that requires one. Array length must
equal the count.
The following is a valid six-passenger request: two adults, two children, one lap infant, and one seated infant.
{
"adults": 2,
"seniors": 0,
"young_adults": 0,
"children": 2,
"child_ages": [10, 6],
"infants": 1,
"infant_ages": [1],
"seated_infants": 1,
"seated_infant_ages": [1]
}| Array | Required when | Value range (years at departure) |
|---|---|---|
child_ages | children > 0 | 2–11 |
infant_ages | infants > 0 | 0–1 |
seated_infant_ages | seated_infants > 0 | 0–1 |
young_adult_ages | young_adults > 0 | 12–17 |
Passenger limits can be supplier-specific. Some suppliers require one distinct adult or
senior for every under-2 passenger across seated and lap infants. During automatic or
multi-supplier searches, FX-Port silently skips any incompatible supplier and returns results
from the compatible suppliers. HTTP 400 is returned only when no selected supplier can serve
the passenger mix. This restriction does not apply to normal children aged 2–11.
Capacity constraints
| Rule | Limit |
|---|---|
| Maximum seated passengers | 9 (adults + seniors + young_adults + children + seated_infants) |
Lap infants (infants) | Cannot exceed adults + seniors (each lap infant needs a lap) |
Under-2 seated infants (seated_infants) | Cannot exceed adults + seniors; children aged 2–11 are unrestricted by this rule |
| Supplier-specific under-2 rule | Some suppliers require seated_infants + infants <= adults + seniors |
| Accompanying traveler | Standard online bookings should include at least 1 adult or senior. Unaccompanied-minor availability is airline-specific. |
When no selected supplier is compatible, the API returns:
{
"success": false,
"error": "SUPPLIER_PASSENGER_COMBINATION_UNSUPPORTED",
"message": "No available flight provider supports this passenger combination. Some providers require one adult or senior for each passenger under age 2.",
"limitation": {
"scope": "supplier_specific",
"code": "UNDER_TWO_HOST_RATIO",
"underTwoPassengers": 2,
"adultSeniorHosts": 1
}
}Common mistakes
These are the most frequent errors that cause bookings to fail, get rejected at check-in, or misprice.
// ❌ children count without ages → validation error / wrong price
{
"adults": 1,
"children": 2
}
// ✅
{
"adults": 1,
"children": 2,
"child_ages": [8, 5]
}
// ❌ infant turning 2 before departure booked as lap "infant"
// → airline rejects at check-in; they need their own seat
{
"adults": 1,
"infants": 1
}
// ✅ classify a passenger who is 2 at departure as a child
{
"adults": 1,
"children": 1,
"child_ages": [2]
}
// ❌ more lap infants than adults
{
"adults": 1,
"infants": 2,
"infant_ages": [0, 1]
}
// ❌ 10 seated passengers (exceeds the 9-seat limit)
{
"adults": 5,
"children": 5,
"child_ages": [4, 5, 6, 7, 8]
}
// ✅ split into two separate bookings (max 9 seated each)Booking — passenger object
When building the passengers array for book_flight, each object must have:
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | adult, senior, young_adult, child, infant, or seated_infant |
gender | string | Yes | MALE or FEMALE |
first_name | string | Yes | Given name as on passport |
last_name | string | Yes | Family name as on passport |
date_of_birth | string | Yes | YYYY-MM-DD — used to verify age at departure |
identity_documents | array | Yes | One passport per passenger |
Names must use plain Latin (ASCII) letters only. Airlines and GDS systems reject accents and
non-Latin scripts. Romanize before sending: Jose not José, Muller not Müller; transliterate
Arabic/Cyrillic/Chinese (Mohammed, Ivanov, Wang). Allowed: A–Z, a–z, spaces, hyphens.
This name rule applies to all bookings (flights, hotels, transfers, eSIMs) — the hotels and eSIMs sections will restate it as those products launch.
Identity document object
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | passport |
number | string | Yes | Document number |
issuing_country | string | Yes | ISO 3166-1 alpha-2 (e.g. DZ, EG, FR) |
expiry_date | string | Yes | YYYY-MM-DD |
nationality | string | No | ISO 3166-1 alpha-2 |
Always supply a passport — it is accepted for both domestic and international travel.