---
title: "Get In Progress Flight Booking Session"
method: GET
path: "/flight-booking/sessions/in-progress"
tags: ["flight-booking"]
---

# Get In Progress Flight Booking Session

`GET /flight-booking/sessions/in-progress`

Fetch latest active or failed non-expired flight-booking session.

## Query parameters

- `conv_trip_id` string, uuid, nullable — Scope the lookup to one conversational trip. Without it the lookup returns the user's most recent resumable session across every trip, which the checkout resume gate then has to reject on weaker evidence.

## Response `200`

Successful Response

- FlightBookingSessionResponse — Persisted flight-booking checkout session.
  - `id` string, uuid, required
  - `user_id` string, uuid, required
  - `observation_id` string, uuid, required
  - `checkout_step` 'info' | 'ancillaries' | 'payment' | 'processing' | 'confirmed' | 'failed', required
  - `status` 'active' | 'awaiting_payment' | 'processing' | 'completed' | 'failed' | 'abandoned' | 'manual_recovery_required', required
  - `payload` object, required
  - `pricing_breakdown` FlightPricingBreakdown — Typed price summary for an Axel-booked flight.
    - `supplier_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
    - `price_after_axel_deal` 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
    - `final_customer_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
    - `discounts` FlightDiscountLineItem[] — Typed discount line items in the order they were applied.
      - `type` 'axel_deal' | 'member_deal' | 'promo_code' | 'axel_negotiation', required — Discount source. Frontend can use this as a stable discriminator.
      - `label` string, required — Human-readable display label for the discount.
      - `amount` 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
      - `code` string, nullable — Promo code when this line is a promo_code discount.
      - `percentage` union — Configured promo percentage when this line is a percentage promo.
        - integer
        - number
      - `basis` 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
      - `offer_id` string, nullable — Limited-time offer id when this line comes from a time-limited Axel Deal.
      - `status` string, nullable — Offer status when this line comes from a time-limited offer.
      - `expires_at` string, date-time, nullable — Expiration timestamp for time-limited discount lines.
  - `active_negotiation_offer` FlightNegotiationOfferResponse — A time-limited locked-price Axel Deal for one flight itinerary.
    - `id` string, uuid, required
    - `user_id` string, uuid, required
    - `conv_trip_id` string, uuid, required
    - `observation_id` string, uuid, required
    - `status` 'active' | 'expired' | 'redeemed' | 'cancelled' | 'delivery_failed', required
    - `percentage` integer
    - `itinerary_fingerprint` string, required
    - `cabin` string, nullable
    - `departure_date` string, nullable
    - `passenger_count` integer, nullable
    - `total_savings_percentage` string, nullable
    - `google_flights_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_deal_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
    - `locked_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_deal_discount` 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_discount` 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
    - `free_percentage` integer, nullable
    - `member_percentage` integer, nullable
    - `member_deal_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_locked_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_limited_time_discount` 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
    - `offered_at` string, date-time, required
    - `expires_at` string, date-time, required
    - `cooldown_until` string, date-time, required
    - `selected_activity_at` string, date-time, nullable
    - `source_wake_id` string, nullable
    - `first_channel` 'sms' | 'email', nullable
    - `final_channel` 'sms' | 'email', nullable
    - `sms_attempted_at` string, date-time, nullable
    - `email_attempted_at` string, date-time, nullable
    - `delivered_at` string, date-time, nullable
    - `message_id` string, nullable
    - `idempotency_key` string, nullable
    - `failure_reason` string, nullable
    - `booking_id` string, nullable
    - `redeemed_at` string, date-time, nullable
    - `metadata_json` object, nullable
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, 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
  - `fare_family_name` string, nullable, required
  - `fare_family_source` string, nullable
  - `fare_family_id` string, nullable
  - `booking_id` string, nullable, required
  - `operator_task_id` string, uuid, nullable, required
  - `expires_at` string, date-time, required
  - `payment_method_id` string, nullable, required
  - `stripe_customer_id` string, nullable, required
  - `payment_intent_id` string, nullable, required
  - `charged_amount_cents` integer, nullable, required
  - `currency` string, nullable, required
  - `payment_status` string, nullable, required
  - `failure_reason` string, nullable, required
  - `idempotency_key` string, nullable, required
  - `discount_tier` 'flight_only' | 'bundle' — Pricing tier this session is priced at (FAC-942). A 'yes' staying declaration cuts a 'bundle'-tier successor session; the tier never downgrades. Nothing hotel-shaped is persisted on the session — the declaration's 'why' lives in trip_facts.hotel_intent.
  - `traveler_names` string[] — Resolved passenger names from traveler_profile_ids in payload
  - `required_traveler_fields` TravelerField[] — Traveler profile fields the client must collect before payment.
  - `adult_gate_exempt` boolean — True when the session owner is on the legal-approved allowlist exempt from the 18+ accompanying-adult gate. Clients must skip their traveler-form adult-age check when set; the server-side payment gate applies the same allowlist.
  - `optional_traveler_fields` TravelerField[] — Traveler-identity fields the client may offer for this flight (e.g. KTN, loyalty). Never blocks payment, distinct from required_traveler_fields.
  - `purchase_intent_id` string, uuid, nullable — Durable single-use purchase commitment this session belongs to (ENG-24229). None for sessions created before the intent rollout.
  - `purchase_intent_status` 'open' | 'committing' | 'booked', nullable — Current lifecycle of the session's purchase intent. 'booked' means the commitment was already consumed — clients must render the existing booking instead of a payment surface.
  - `purchase_intent_booking_id` string, nullable — Booking that consumed the purchase intent. May belong to a sibling session of the same commitment.
  - `fare_hold` FareHoldBlock — The ``fare_hold`` node on every session response.
    - `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
    - `pricing` FareHoldPricing — What the shared resolver decided for this checkout under the hold. ``reason`` is the resolver's word; ``applies`` is True only for ``ok``. ``held_fare`` is the rung of ``FareHoldSummary.held_fares`` the resolver matched this checkout to (None when the hold does not apply or on a legacy single-fare hold); ``held_fares_count`` is how many rungs the hold carries, so a surface can say "and 2 other fares" without the list.
      - `applies` boolean, required
      - `reason` 'ok' | 'not_active' | 'expired' | 'itinerary_mismatch' | 'fare_mismatch' | 'party_mismatch' | 'pax_mismatch' | 'currency_mismatch' | 'invalid_held_total' | 'invalid_live_total' | 'cabin_unknown' | 'cabin_mismatch', required
      - `price_dropped` boolean, required
      - `flight` FareHoldFlightPricing, required
        - `held_cents` integer, required
        - `live_cents` integer, required
        - `charge_cents` integer, required
      - `items` FareHoldPricedItem[]
        - `disposition` 'honored' | 'customer_min' | 'dropped_unavailable', required
        - `kind` 'bag' | 'seat', nullable
        - `traveler_profile_id` string, nullable
        - `seat` string, nullable
        - `quantity` integer, nullable
        - `held_cents` integer, required
        - `live_cents` integer, nullable
        - `charge_cents` integer, nullable
        - `absorbed_cents` integer, required
        - `current_product_id` string, nullable
        - `current_passenger_id` string, nullable
        - `anchor` FareHoldHeldLineAnchor — 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
        - `matched_on` 'anchor' | 'legacy_key', nullable
      - `charge_total_cents` integer, required
      - `live_total_cents` integer, required
      - `absorbed_cents` integer, required
      - `expires_at` string, date-time, nullable
      - `held_fare` FareHoldHeldFare — One rung of a whole-flight hold, at its own arm-time party total.
        - `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
      - `held_fares_count` integer
    - `offer` FareHoldOffer, required — 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
    - `restore` FareHoldRestoreOutcome[]
      - `kind` 'bag' | 'seat', required
      - `designator` string, nullable
      - `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
      - `disposition` 'restored_at_held' | 'restored_live_cheaper' | 'already_in_basket' | 'kept_customer_choice' | 'gone' | 'unknown' | 'ambiguous', required
      - `held_cents` integer, required
      - `live_cents` integer, nullable
      - `message` string, required
      - `detail` string, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## 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: FareHoldBlock]/hold/anyOf[subschema #1: FareHoldSummary]/card_observation_id` to the response with the `200` status
- **2026-09-06** `fa0678aea849` — 1 info
  - added the optional property `fare_hold` to the response with the `200` status

[Change history](https://skmtc.dev/helloaxel/apis/client-api-gateway/changes/flight-booking/sessions/in-progress/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)
