---
title: "Get Flight Booking Options"
method: GET
path: "/flight-booking/options"
tags: ["flight-booking"]
---

# Get Flight Booking Options

`GET /flight-booking/options`

Fetch fare families (Basic Economy, Main Cabin, etc.) for a flight observation.

Delegates observation lookup and route extraction to the content service.
Each option has its own observation_id suitable for POST /flight-booking/sessions/.

## Query parameters

- `observation_id` string, uuid, required — Base flight observation from search results
- `passengers` integer — Number of passengers
- `adults` integer, nullable
- `children` integer, nullable
- `infants_in_seat` integer, nullable
- `infants_on_lap` integer, nullable
- `conv_trip_id` string, uuid, nullable — Conversation trip id used to apply an active limited-time offer. Fare holds are user-scoped and overlaid with or without it.

## Response `200`

Successful Response

- FlightBookingOptionsResponse — Response for GET /flight-booking/options.
  - `passenger_mix` PassengerCount — Passenger breakdown for offers/searches. Simple counts by type.
    - `adults` integer
    - `children` integer
    - `infants_in_seat` integer
    - `infants_on_lap` integer
  - `options` FlightBookingOption[], required
    - `observation_id` string, required — Content DB observation ID for this fare option
    - `fare_name` string, required — Fare family display name (e.g. 'Main Cabin')
    - `price` Money, required — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `price_per_person` Money, required — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `flight_only_price` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `flight_only_price_per_person` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `member_price` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `member_price_per_person` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `savings_share_prices` FlightSavingsSharePrices
      - `public_price` Money, required — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
        - `amount` integer, required
        - `currency` string, required
      - `axel_rate_price` Money, required — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
        - `amount` integer, required
        - `currency` string, required
      - `customer_price` Money, required — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
        - `amount` integer, required
        - `currency` string, required
      - `member_price` Money, required — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
        - `amount` integer, required
        - `currency` string, required
    - `limited_time_offer_id` string, uuid, nullable — Active limited-time Axel offer applied to this fare option.
    - `limited_time_price` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `limited_time_price_per_person` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `limited_time_expires_at` string, date-time, nullable — When the locked limited-time offer expires.
    - `limited_time_locked` boolean — True on the option whose exact dollar price the active limited-time offer locks (the originally quoted fare). Other options carry the offer's percentage discount but no dollar guarantee.
    - `fare_hold_id` string, nullable — Active fare hold whose held price applies to this option.
    - `fare_hold_price` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `fare_hold_price_per_person` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `fare_hold_expires_at` string, date-time, nullable — When the free 24h fare hold lapses.
    - `bundle_price_per_person` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `baggage` string[]
    - `baggage_policy` FareBaggagePolicy — Structured fare baggage policy, with raw supplier text preserved.
      - `source` 'serpapi_google_flights' | 'unknown'
      - `quotes` FareBaggageQuote[]
        - `bag_type` 'personal_item' | 'carry_on' | 'checked' | 'checked_first' | 'checked_second' | 'unknown'
        - `quantity` integer, nullable — Bag count when the supplier text states one; 0 for explicit restrictions.
        - `is_included` boolean
        - `is_restriction` boolean
        - `fee_amount` string, nullable
        - `fee_currency` string, nullable
        - `fee_basis` 'round_trip' | 'one_way' | 'per_segment' | 'unknown'
        - `pax_basis` 'per_pax' | 'total' | 'unknown'
        - `fee_amount_per_direction` string, nullable — Per-passenger one-way fee amount when it can be normalized from the supplier quote. For round-trip totals, this is half of fee_amount.
        - `source_key` 'together' | 'departing' | 'returning' | 'unknown'
        - `raw_text` string, required
    - `features` string[]
    - `book_with` string — Booking channel (e.g. 'Delta Air Lines')
    - `separate_tickets` boolean
    - `raw_option_title` string, nullable — Raw Google/SerpAPI fare option title when supplied.
    - `option_title_present` boolean — Whether the supplier supplied a fare option title.
    - `fallback_label_used` boolean — Whether fare_name is a cabin/default fallback instead of supplier text.
    - `fallback_label` string, nullable
    - `fare_family_id` string, nullable
    - `fare_family_source` string, nullable
    - `fare_family_blocker_reason` string, nullable
    - `source_evidence` object, nullable — Selected fare evidence carried from Content observation.
  - `google_flights_url` string, nullable — Google Flights page for the selected itinerary's booking options, captured verbatim from the supplier response (FAC-912). Optional: absent for cached/legacy evaluations — render-if-present.
  - `price_source` 'live' | 'stored_fallback' — Whether these fare prices are a live supplier reprice ('live') or the backend-owned stored-flight fallback ('stored_fallback'), served when live fare families do not load (FAC-934).
  - `fare_hold_offer` FareHoldOffer — Server-driven decision on what the hold slot shows. ``available`` renders the tappable line; ``membership_required`` renders the locked member-benefit row; every other reason renders nothing (the client never re-derives these from flags or membership state).
    - `available` boolean, required
    - `reason` 'membership_required' | 'membership_unavailable' | 'paused' | 'already_held' | 'cap_reached' | 'session_not_holdable' | 'departs_too_soon', nullable
    - `min_departure_lead_hours` integer, nullable
    - `hold_hours` integer, nullable
  - `fare_hold` FareHoldSummary — One fare_holds row as clients see it. Money is integer cents.
    - `id` string, uuid, required
    - `status` 'active' | 'redeemed' | 'released' | 'expired', required
    - `armed_at` string, date-time, required
    - `expires_at` string, date-time, required
    - `basis_tier` 'free' | 'member' | 'acquisition', required
    - `currency` string, required
    - `held_flight_cents` integer, required
    - `held_items_total_cents` integer
    - `held_items` FareHoldHeldLine[], nullable
      - `kind` 'bag' | 'seat', required
      - `anchor` FareHoldHeldLineAnchor, required — Which flight (seat) or journey (bag) a held line rides. ``schemas.domain.ancillary_identity.SegmentAnchor.as_dict()``.
        - `carrier` string, nullable
        - `flight_number` string, nullable
        - `origin` string, nullable
        - `destination` string, nullable
        - `departure_date` string, nullable
      - `designator` string, nullable
      - `bag` FareHoldHeldBag
        - `checked` boolean, nullable
        - `cabin` boolean, nullable
        - `weight_norm` string, nullable
        - `display_name` string, nullable
      - `quantity` integer, required
      - `traveler_profile_id` string, nullable
      - `held_amount_cents` integer, required
      - `currency` string, required
    - `held_fares` FareHoldHeldFare[], nullable
      - `fare_family_id` string, nullable
      - `fare_label` string, nullable
      - `cabin` string, nullable
      - `held_flight_cents` integer, required
      - `currency` string, required
      - `source` 'session' | 'ladder', required
      - `selected` boolean
    - `itinerary_fingerprint` string, required
    - `fare_match` FareHoldFareMatch — Arm-time fare identity (``schemas.domain.fare_hold_identity.build_fare_match``).
      - `itinerary_fingerprint` string, nullable
      - `fare_family_id` string, nullable
      - `fare_label` string, nullable
      - `cabin` string, nullable
      - `observation_id` string, nullable
    - `pax_count` integer, required
    - `passenger_mix` PassengerCount — Passenger breakdown for offers/searches. Simple counts by type.
      - `adults` integer
      - `children` integer
      - `infants_in_seat` integer
      - `infants_on_lap` integer
    - `flight_summary` FareHoldFlightSummary — Display-only card facts snapshotted at arm time. Built by ``services.fare_hold_service.build_flight_summary``: nulls where the session payload was thin, never a guess. Forwards everything the payload has so the card can grow without a backend change.
      - `origin` string, nullable
      - `destination` string, nullable
      - `departure_date` string, nullable
      - `return_date` string, nullable
      - `carrier` string, nullable
      - `flight_numbers` string[]
      - `fare_label` string, nullable
      - `origin_city` string, nullable
      - `destination_city` string, nullable
      - `trip_type` 'one_way' | 'round_trip' | 'multi_city', nullable
      - `is_international` boolean, nullable
      - `carriers` string[]
      - `fare_family_id` string, nullable
      - `cabin` string, nullable
      - `requested_cabin` string, nullable
      - `fare_features` string[]
      - `baggage_notes` string[]
      - `book_with` string, nullable
      - `separate_tickets` boolean, nullable
      - `source` string, nullable
      - `observed_at` string, date-time, nullable
      - `seats_available` integer, nullable
      - `total_stops` integer, nullable
      - `total_duration_minutes` integer, nullable
      - `legs` FareHoldFlightLeg[]
        - `direction` 'outbound' | 'return' | 'leg', required
        - `origin` string, nullable
        - `destination` string, nullable
        - `origin_city` string, nullable
        - `destination_city` string, nullable
        - `departure_date` string, nullable
        - `departure_time` string, nullable
        - `arrival_date` string, nullable
        - `arrival_time` string, nullable
        - `stops` integer
        - `duration_minutes` integer, nullable
        - `carrier` string, nullable
        - `carriers` string[]
        - `cabin` string, nullable
        - `fare_family` string, nullable
        - `fare_family_id` string, nullable
        - `flight_numbers` string[]
        - `overnight` boolean, nullable
        - `layovers` FareHoldFlightLayover[]
          - `airport` string, nullable
          - `city` string, nullable
          - `duration_minutes` integer, nullable
        - `segments` FareHoldFlightSegment[]
          - `origin` string, nullable
          - `destination` string, nullable
          - `origin_city` string, nullable
          - `destination_city` string, nullable
          - `origin_terminal` string, nullable
          - `destination_terminal` string, nullable
          - `departure_date` string, nullable
          - `departure_time` string, nullable
          - `arrival_date` string, nullable
          - `arrival_time` string, nullable
          - `duration_minutes` integer, nullable
          - `carrier` string, nullable
          - `marketing_carrier` string, nullable
          - `operating_carrier` string, nullable
          - `flight_number` string, nullable
          - `raw_flight_number` string, nullable
          - `marketing_flight_number` string, nullable
          - `cabin` string, nullable
          - `raw_supplier_cabin` string, nullable
          - `cabin_confidence` string, nullable
          - `booking_class` string, nullable
          - `fare_family` string, nullable
          - `fare_family_id` string, nullable
          - `aircraft` string, nullable
          - `overnight` boolean, nullable
          - `often_delayed` boolean, nullable
    - `conv_trip_id` string, uuid, nullable
    - `source_session_id` string, uuid, required
    - `observation_id` string, uuid, nullable
    - `card_observation_id` string, uuid, nullable
    - `last_live_cents` integer, nullable
    - `last_quoted_at` string, date-time, nullable
    - `last_quote_reason` 'ok' | 'fare_gone' | 'unknown', nullable
    - `dismissed_at` string, date-time, nullable
    - `redeemed_booking_id` string, uuid, nullable
    - `ended_at` string, date-time, nullable

## Other responses

- `422` — Validation Error

## Changes

> 13 revisions in range; 1 not diffed.

- **2026-09-10** `09ac75a22f0e` — 1 info
  - added the optional property `fare_hold/anyOf[subschema #1: FareHoldSummary]/card_observation_id` to the response with the `200` status
- **2026-09-06** `fa0678aea849` — 2 info
  - added the optional property `fare_hold` to the response with the `200` status
  - added the optional property `fare_hold_offer` to the response with the `200` status

[Change history](https://skmtc.dev/helloaxel/apis/client-api-gateway/changes/flight-booking/options/get.md)

---

[API](https://skmtc.dev/helloaxel/apis/client-api-gateway.md) · [All operations](https://skmtc.dev/helloaxel/apis/client-api-gateway/llms.txt) · [OpenAPI document](https://skmtc.dev/helloaxel/apis/client-api-gateway/revisions/c2bf613dbe8f?raw)
