---
title: "Release Flight Membership Purchase"
method: POST
path: "/flight-booking/sessions/{session_id}/release-membership-purchase"
tags: ["flight-booking"]
---

# Release Flight Membership Purchase

`POST /flight-booking/sessions/{session_id}/release-membership-purchase`

## Request

- Base URL: `https://api.helloaxel.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.helloaxel.com/flight-booking/sessions/{session_id}/release-membership-purchase`
- Auth: HTTP bearer

Hand an unpaid flight + membership checkout back to ordinary payment.

Axel credit never applies inside the combined purchase. When a balance
lands after that purchase claimed the session (a code typed in Settings,
a goodwill credit granted mid-chat), the site calls this so the SAME
session continues on ordinary payment with the credit toggle: travelers,
bags, seats and contact stay put. Travel asks Temporal to discard the
unpaid options first and refuses (409) once money is in flight; the
purchase then simply carries on.

## Path parameters

- `session_id` string, uuid, required

## Request body

- FlightMembershipPurchaseRelease: Why the browser is leaving the combined purchase (today: credit arrived).
  - `reason` 'axel_credit'

## Response `200`

Successful Response

- FlightCheckoutSessionResponse
  - `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
  - `fare_policy` FarePolicy
    - `facts` FarePolicyFact[]
      - `category` 'personal_item' | 'carry_on' | 'checked_bags' | 'seat_selection' | 'changes' | 'refunds' | 'seat_upgrade' | 'same_day_changes' | 'priority_boarding' | 'wifi' | 'meals' | 'lounge' | 'entertainment' | 'rewards', required
      - `state` 'included' | 'fee' | 'not_included' | 'not_available' | 'conditional' | 'unknown'
      - `quantity` integer, nullable: Included bag count, only when established by evidence.
      - `evidence` string[]: Supplier statements or curated airline-policy references, including qualifications.
      - `details` string[]: Qualifications the customer must see alongside the summary.
      - `reason` 'not_provided' | 'conflicting_evidence' | 'conditional' | 'varies_by_leg', nullable
    - `unclassified` string[]
  - `review_invite` ReviewInvite: What the web needs to show the "Enjoying Axel?" card for one booking.
    - `trigger` 'second_booking' | 'repricing_win' | 'repricing_backfill'
    - `review_url` string
    - `email_invited` boolean, required
    - `booking_id` string, required
    - `booking_kind` 'flight' | 'hotel', required
    - `created_at` string, date-time, required
  - `customer_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
  - `public_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_customer_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_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
  - `hotel_offer_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
  - `hotel_offer_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
  - `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.
  - `hotel_offer_acceptance` FlightHotelOfferSelection
    - `offer_id` string, required
    - `qualification_conditions` HotelQualificationConditions, required: Versioned JSON; new fields require explicit schema/evaluator support.
      - `schema_version` integer, required
      - `all` HotelStarRatingCondition[], required
        - `field` 'hotel.star_rating', required
        - `operator` 'eq' | 'gte', required
        - `value` number, required
    - `accepted_terms_version` string, required
    - `accepted_terms_text` string, required
    - `booking_window_seconds` integer, required
    - `completion_buffer_seconds` integer, required
    - `accepted_at` string, date-time, required
    - `conditional_deal` FlightHotelConditionalDeal: Trusted producer snapshot, persisted before display; never public input.
      - `id` string, uuid, required
      - `user_id` string, uuid, required
      - `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
      - `expires_at` string, date-time, required
      - `obligation` FlightHotelOfferOption, required: Server-configured checkout choice; the customer only submits its identity.
        - `offer_id` string, required
        - `qualification_conditions` HotelQualificationConditions, required: Versioned JSON; new fields require explicit schema/evaluator support.
          - `schema_version` integer, required
          - `all` HotelStarRatingCondition[], required
            - `field` 'hotel.star_rating', required
            - `operator` 'eq' | 'gte', required
            - `value` number, required
        - `accepted_terms_version` string, required
        - `accepted_terms_text` string, required
        - `booking_window_seconds` integer, required
        - `completion_buffer_seconds` integer, required
    - `source_observation_id` string, uuid, nullable
    - `proposal_set_id` string, uuid, nullable
  - `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
  - `contact_email` string, nullable: Where this booking's tickets and receipt are also sent, when it is not the account email (often the traveler's). Booking-level only: it never changes the account email or its sign-in. Send null or an empty string to clear it.
  - `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
  - `resolved_travelers` FlightBookingTravelerName[]: The travelers on this session as the server has them on record, in payload traveler_profile_ids order (Nov 2 2026). The web shows these names on the pay page, never a copy of its own.
    - `traveler_profile_id` string, required
    - `first_name` string, nullable
    - `middle_name` string, nullable
    - `last_name` string, nullable
  - `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
      - `fee_cents` integer, nullable
      - `fee_currency` string, nullable
      - `fee_paid_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' | 'fee_required', nullable
      - `min_departure_lead_hours` integer, nullable
      - `hold_hours` integer, nullable
      - `fee_cents` integer, nullable
      - `fee_currency` string, 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
  - `payment` SingleChargeState
    - `status` 'starting' | 'preparing_options' | 'choosing' | 'selecting' | 'awaiting_payment' | 'requires_action' | 'processing' | 'completed' | 'failed' | 'needs_review', required
    - `payment_mode` 'single' | 'separate'
    - `authorize_before_capture` boolean
    - `client_secret` string, nullable, required
    - `booking_id` string, nullable, required
    - `message` string, required
    - `quote` FlightMembershipQuote, required
      - `session_id` string, uuid, required
      - `flight_cents` integer, required
      - `membership_cents` integer, required
      - `renewal_cents` integer, required
      - `currency` 'usd', required
      - `includes_membership` boolean, required
    - `options` FlightMembershipQuote[], nullable
      - `session_id` string, uuid, required
      - `flight_cents` integer, required
      - `membership_cents` integer, required
      - `renewal_cents` integer, required
      - `currency` 'usd', required
      - `includes_membership` boolean, required
    - `can_refresh` boolean: The unpaid preparation ended safely; refresh this same itinerary for a new quote.
    - `last_decline` SingleChargeDecline: The bank's last verdict on this purchase, as Stripe reported it.
      - `error_code` string, nullable
      - `decline_code` string, nullable
      - `message` string, nullable
      - `attempts` integer: Distinct failed payment attempts seen so far.
      - `observed_at` string, nullable
    - `intent_status` string, nullable: Stripe PaymentIntent status seen on the last poll of the accepted payment.
    - `editable_after_decline` boolean: The accepted payment holds no money, so the checkout can be reopened for edits.
    - `outcome` 'no_charge' | 'refunded', nullable: Set with status failed: whether any money was taken and then refunded.

## Other responses

- `422`: Validation Error

## Changes

> 103 revisions in range; 1 not diffed.

- **2026-11-02** `c22b50f81067`: 1 info
  - added the optional property `resolved_travelers` to the response with the `200` status
- **2026-10-29** `f019bd824ddb`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/helloaxel/apis/client-api-gateway/changes/flight-booking/sessions/:session_id/release-membership-purchase/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/2d3c427963a4?raw)
