---
title: "Refresh Flight Booking Session"
method: POST
path: "/flight-booking/sessions/{session_id}/refresh"
tags: ["flight-booking"]
---

# Refresh Flight Booking Session

`POST /flight-booking/sessions/{session_id}/refresh`

Refresh a flight booking session with current pricing.

## Path parameters

- `session_id` string, uuid, required

## Response `200`

Successful Response

- FlightBookingSessionRefreshResponse — Response from refreshing a flight booking session.
  - `session` FlightBookingSessionResponse, required — 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' | 'hotel_saving', 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[]
              - …
            - `segments` FareHoldFlightSegment[]
              - …
        - `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
  - `price_changed` boolean, required
  - `previous_price_cents` integer, nullable
  - `new_price_cents` integer, nullable
  - `currency` string, nullable

## Other responses

- `422` — Validation Error

## Changes

> 17 revisions in range; 1 not diffed.

- **2026-09-19** `e5f778e80f9a` — 1 warning
  - added the new `hotel_saving` enum value to the `session/pricing_breakdown/anyOf[subschema #1: FlightPricingBreakdown]/discounts/items/type` response property for the response status `200`
- **2026-09-10** `09ac75a22f0e` — 1 info
  - added the optional property `session/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 `session/fare_hold` to the response with the `200` status

[Change history](https://skmtc.dev/helloaxel/apis/client-api-gateway/changes/flight-booking/sessions/:session_id/refresh/post.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/b7b1f6448378?raw)
